Привет ребята. Вот сейчас курю сабж, в целях экономии времени рашил запостить этот трэд, ведь для этого-то форумы и есть? Разрядность чисел от 128 бит, уверен, что наверно все тутошние завсегдарые сталкивались с чем-то похожим. Пока нашёл, сейчас разбираюсь с одним алгоритмом Кнута и уножение столбиком, интересуют почти все созидательные сообщения связанные с темой, быстродейстие не очень то критично но очень интересено, если есть гототовые решения (асм в первую очередь), оч даже интересно взглянуть. Спасибо за внимание
мдя, собсно весь прикол у Кнута был в : похоже что на этом и прийдётся остановаиться... мож толковую литературу кто-нить подкинет?
rain При твоих требованиях к быстродействию вполне подойдет реализация умножения в столбик, что совсем нетрудно.
классная библиотека, но вот только разобрать алгоритм Карацубы или FFT оттуда довольно затруднительно
кстати вот отлаживаю свою версию "в столбик" а проверять неначем (?) нашёл какой-то до ужаса кривоватый шароварный "Hpmbcalc Hex Calculator" он с ним даже работать противно, есть канечно на том-же GMP онлайн калькулятор, но результаты выдаёт только в десятичных числах
кому интересно, а может кто пару замечаний скажет,вообщем вот что у меня получилось: Код (Text): ;умножение больших чисел одинаковой длины ;in: esi, edi указатели ecx длина в байтах(!) ;in\out: edx указатель на результирующтй нулевой(!) буфер ; [ebx] = [esi]*[edi] big_mult proc LOCAL i:DWORD LOCAL res_offset:DWORD mov res_offset,0 .while TRUE;цикл столбика mov i,0 pusha .if dword ptr [edi]==0 jmp @skip_mul .endif .repeat;цикл умножения lodsd .if eax==0 jmp @skip_i .endif mov edx,[edi] int 3 mul edx add [ebx],eax adc [ebx+4],edx .if CARRY? adc [ebx+8],dword ptr 0 .endif @skip_i: add ebx,4 add i,4 .until i==ecx @skip_mul: add res_offset,4 popa add edi,4 add ebx,4 sub ecx,res_offset .if ecx==0 .break .endif add ecx,res_offset .endw ret big_mult endp дворды хранятся - по большему адресу старший пока багов не заметил
а если обе версии будут с одними багами то результат деления+умножения будет верен а поотдельности неверен
rain Запихни 0 в свободный регистр операцией XOR и используй его при сложении adc [ebx+8],dword ptr 0
если адресовать стековые переменные через esp, то ebp освобождается. А нужен он, чтобы уменьшить размер кода.
rain Если ты внимательно поизучаешь коды, созданные компилятором Майкрософт, то увидишь, что там очень активно используются константы в регистрах.
crypto кстати замечал, но так как я с оптимизацией не сталкивался вполтную не обращал внимания на это.. у тебя аськи нету, хотел бы кой чё у тебя поспрашивать? кстати посоветуйте алготирмы генерации больших простых чисел, я знаю, что эта тема изъезжена вдоль и поперёк, но толковых сорцов с комментами (особенно на асме) я не нашёл, неправда ли странно? интересную такую штуку рассказал чувак с ником Loger #10 здесь, а если нужны скажем 1024 бит ?
оффтоп Y_Mur блин, сколько идей в голове крутиться заняться и тем и сем, интересно блин, и вообще так прикольно делать самому что хочешь когда никто не подгоняет(!), я уже понял что дело не в том что кто-то подгоняет а в том, что ты сам себя подгоняешь, и даже если загрузка по полной, можно спокойно делать то что нравиться и забить на всех, но тут же появляется мысль заняться тем-то, и всё, пошло поехало, забылся... опомнился ("очнулся") только когда понял, что больше не можешь и нужно спать, нужно завести записную книгу что-ли и записывать всё в порядке своего личного критеря важности, что-ли.... это у всех так или только у меня?да в прочем и неважно щас бы вкурить простые числа, и я, может быть, буду доволен