умножение больших чисел

Тема в разделе "WASM.A&O", создана пользователем rain, 23 дек 2006.

  1. rain

    rain New Member

    Публикаций:
    0
    Регистрация:
    22 апр 2006
    Сообщения:
    976
    Привет ребята.
    Вот сейчас курю сабж, в целях экономии времени рашил запостить этот трэд, ведь для этого-то форумы и есть?
    Разрядность чисел от 128 бит, уверен, что наверно все тутошние завсегдарые сталкивались с чем-то похожим. Пока нашёл, сейчас разбираюсь с одним алгоритмом Кнута и уножение столбиком, интересуют почти все созидательные сообщения связанные с темой, быстродейстие не очень то критично но очень интересено, если есть гототовые решения (асм в первую очередь), оч даже интересно взглянуть.
    Спасибо за внимание
     
  2. rain

    rain New Member

    Публикаций:
    0
    Регистрация:
    22 апр 2006
    Сообщения:
    976
    мдя, собсно весь прикол у Кнута был в :
    похоже что на этом и прийдётся остановаиться...
    мож толковую литературу кто-нить подкинет?
     
  3. crypto

    crypto Active Member

    Публикаций:
    0
    Регистрация:
    13 дек 2005
    Сообщения:
    2.533
    rain
    При твоих требованиях к быстродействию вполне подойдет реализация умножения в столбик, что совсем нетрудно.
     
  4. Stiver

    Stiver Партизан дзена

    Публикаций:
    0
    Регистрация:
    18 дек 2004
    Сообщения:
    812
    Адрес:
    Germany
    rain

    Здесь уже была похожая тема.
     
  5. volodya

    volodya wasm.ru

    Публикаций:
    0
    Регистрация:
    22 апр 2003
    Сообщения:
    1.169
    а GMP заюзать? не?
     
  6. rain

    rain New Member

    Публикаций:
    0
    Регистрация:
    22 апр 2006
    Сообщения:
    976
    классная библиотека, но вот только разобрать алгоритм Карацубы или FFT оттуда довольно затруднительно :dntknw:
     
  7. rain

    rain New Member

    Публикаций:
    0
    Регистрация:
    22 апр 2006
    Сообщения:
    976
    кстати вот отлаживаю свою версию "в столбик" а проверять неначем (?) нашёл какой-то до ужаса кривоватый шароварный "Hpmbcalc Hex Calculator" он с ним даже работать противно, есть канечно на том-же GMP онлайн калькулятор, но результаты выдаёт только в десятичных числах
     
  8. Stiver

    Stiver Партизан дзена

    Публикаций:
    0
    Регистрация:
    18 дек 2004
    Сообщения:
    812
    Адрес:
    Germany
    rain
    Сделай заодно и деление и проверяй умножение через деление и наоборот.
     
  9. rain

    rain New Member

    Публикаций:
    0
    Регистрация:
    22 апр 2006
    Сообщения:
    976
    кому интересно, а может кто пару замечаний скажет,вообщем вот что у меня получилось:
    Код (Text):
    1. ;умножение больших чисел одинаковой длины
    2. ;in: esi, edi указатели ecx длина в байтах(!)
    3. ;in\out: edx указатель на результирующтй нулевой(!) буфер
    4. ; [ebx] = [esi]*[edi]
    5. big_mult proc
    6.     LOCAL i:DWORD
    7.     LOCAL res_offset:DWORD
    8.    
    9.     mov res_offset,0
    10.     .while TRUE;цикл столбика
    11.         mov i,0
    12.         pusha
    13.         .if dword ptr [edi]==0
    14.             jmp @skip_mul
    15.         .endif
    16.        
    17.         .repeat;цикл умножения
    18.             lodsd
    19.             .if eax==0
    20.                 jmp @skip_i
    21.             .endif
    22.             mov edx,[edi]
    23.             int 3
    24.             mul edx
    25.             add [ebx],eax
    26.             adc [ebx+4],edx
    27.             .if CARRY?
    28.                 adc [ebx+8],dword ptr 0
    29.             .endif
    30.         @skip_i:
    31.             add ebx,4
    32.             add i,4
    33.         .until i==ecx
    34.     @skip_mul:
    35.         add res_offset,4
    36.         popa
    37.         add edi,4
    38.         add ebx,4
    39.         sub ecx,res_offset
    40.         .if ecx==0
    41.             .break
    42.         .endif
    43.         add ecx,res_offset
    44.     .endw
    45.    
    46.     ret
    47.    
    48. big_mult endp
    дворды хранятся - по большему адресу старший
    пока багов не заметил
     
  10. rain

    rain New Member

    Публикаций:
    0
    Регистрация:
    22 апр 2006
    Сообщения:
    976
    :) а если обе версии будут с одними багами то результат деления+умножения будет верен а поотдельности неверен :)
     
  11. rmn

    rmn Well-Known Member

    Публикаций:
    0
    Регистрация:
    23 ноя 2004
    Сообщения:
    2.348
    можно заменить на
    Код (Text):
    1. adc dword ptr [ebx+8], 0
    проверка CF тут не нужна
     
  12. crypto

    crypto Active Member

    Публикаций:
    0
    Регистрация:
    13 дек 2005
    Сообщения:
    2.533
    rain
    Запихни 0 в свободный регистр операцией XOR и используй его при сложении
    adc [ebx+8],dword ptr 0
     
  13. rain

    rain New Member

    Публикаций:
    0
    Регистрация:
    22 апр 2006
    Сообщения:
    976
    rmn точно, пасиб
    crypto несовсем понял, а зачем? да и свободного регистра нет :dntknw:
     
  14. rmn

    rmn Well-Known Member

    Публикаций:
    0
    Регистрация:
    23 ноя 2004
    Сообщения:
    2.348
    если адресовать стековые переменные через esp, то ebp освобождается. А нужен он, чтобы уменьшить размер кода.
     
  15. rain

    rain New Member

    Публикаций:
    0
    Регистрация:
    22 апр 2006
    Сообщения:
    976
    ну уменьшится код с 5Bh до 57h от этого что-ли бысродействие подпрыгнет?
     
  16. crypto

    crypto Active Member

    Публикаций:
    0
    Регистрация:
    13 дек 2005
    Сообщения:
    2.533
    rain
    Вместо сложения с Immediate будет сложение с Register, что малек быстрее.
     
  17. crypto

    crypto Active Member

    Публикаций:
    0
    Регистрация:
    13 дек 2005
    Сообщения:
    2.533
    rain
    Если ты внимательно поизучаешь коды, созданные компилятором Майкрософт, то увидишь, что там очень активно используются константы в регистрах.
     
  18. rain

    rain New Member

    Публикаций:
    0
    Регистрация:
    22 апр 2006
    Сообщения:
    976
    crypto
    кстати замечал, но так как я с оптимизацией не сталкивался вполтную не обращал внимания на это.. у тебя аськи нету, хотел бы кой чё у тебя поспрашивать?
    кстати посоветуйте алготирмы генерации больших простых чисел, я знаю, что эта тема изъезжена вдоль и поперёк, но толковых сорцов с комментами (особенно на асме) я не нашёл, неправда ли странно?
    интересную такую штуку рассказал чувак с ником Loger #10
    здесь, а если нужны скажем 1024 бит ?
     
  19. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    rain
    Заряди поиск постов от leo, получишь отлично изложенный учебник про оптимизацию ...
     
  20. rain

    rain New Member

    Публикаций:
    0
    Регистрация:
    22 апр 2006
    Сообщения:
    976
    оффтоп Y_Mur блин, сколько идей в голове крутиться заняться и тем и сем, интересно блин, и вообще так прикольно делать самому что хочешь когда никто не подгоняет(!), я уже понял что дело не в том что кто-то подгоняет а в том, что ты сам себя подгоняешь, и даже если загрузка по полной, можно спокойно делать то что нравиться и забить на всех, но тут же появляется мысль заняться тем-то, и всё, пошло поехало, забылся... опомнился ("очнулся") только когда понял, что больше не можешь и нужно спать, нужно завести записную книгу что-ли и записывать всё в порядке своего личного критеря важности, что-ли.... это у всех так или только у меня?да в прочем и неважно щас бы вкурить простые числа, и я, может быть, буду доволен