Арифметика чисел с фиксированной запятой формата 32.32

Тема в разделе "WASM.A&O", создана пользователем Aloner, 28 сен 2009.

  1. valterg

    valterg Active Member

    Публикаций:
    0
    Регистрация:
    19 авг 2004
    Сообщения:
    2.105
    Молодые и старые криптографы без проблем найдут исходники библиотеки bignum. Было дело : переделывал я кейген для Армадилло.
     
  2. Ra_

    Ra_ New Member

    Публикаций:
    0
    Регистрация:
    4 мар 2007
    Сообщения:
    289
    Я тоже много разных библиотек встречал, и на польских и на китайских и на англоязычных сайтах.
    Помню реализацию и в журнале "Монитор". Задача несколько в другом.
    Реализация на ассемблере и здесь. Ну скажем в учебном плане.
    ...Посадив зернышко может что-то и более значимое вырастет...
     
  3. Aloner

    Aloner New Member

    Публикаций:
    0
    Регистрация:
    11 апр 2008
    Сообщения:
    96
    Mikl___
    Так его реализация в #14 - да, в тот день сильно тормозил ))
    to_all:
    Всем спасибо за ответы.
    Интересно, кто-нибудь в наше время использует фиксы, кроме мобильных платформ?
     
  4. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.797
    Просмотрел mtdukvm10.prf стр 45 "АЛУ для ускоренного умножения с фиксированной запятой", где предлагается обрабатывать по 2 бита одного из сомножителей, и в зависимости от их содержания 00, 11 - сдвигать сомножитель на 1 разряд, 01 - складывать и сдвигать, 10 - вычитать и сдвигать и сравните здесь обрабатывается по 3 бита сомножителя, здесь по 4 бита и далее по аналогии "В зависимости от задачи можно выбрать оптимальное количество разрядов X(i+n),...,X(i-1)" и свести умножение к табличному преобразованию
     
  5. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.797
    64-битное умножение, используя 32-разрядную арифметику
    (a0 + a1 *2³²)x(b0 + b1 *2³²)=a0b0 + (a0b1+a1b0) 2³²+a1b1 *2^64
    результат: 4 умножения, 3 сложения, 2 сдвига
    96-битное умножение, используя 32-разрядную арифметику
    (a0 + a1 *2³² + a2 *2^64)x(b0 + b1 *2³² + b2 *2^64)=a0b0 + a2b2 *2^128 + (a0b1+a1b0) 2³²+(a2b1+a1b2)2^96+(a2b0+a1b1+a0b2)2^64
    результат: 9 умножений, 8 сложений, 4 сдвига
    128-битное умножение, используя 32-разрядную арифметику
    (a0 + a1 *2³² + a2 *2^64 + a3 *2^96)x(b0 + b1 *2³² + b2 *2^64 + b3 *2^96)=a0b0 + a3b3 *2^192 + (a0b1+a1b0) 2³²+(a2b3+a3b2)2^160+(a2b0+a1b1+a0b2)2^64+(a1b3+a3b1+a2b2)2^128+(a0b3+b0a3+a1b2+a2b1)2^96
    результат: 16 умножений, 15 сложений, 6 сдвигов
    Не пугайтесь, до 512 бит мы не пойдем, тем более до 1024, тем не менее, налицо тенденция - от количества членов ai *2^(i*32) в многочлене равного n -- зависисимость количества умножения n², сложений n² - 1, сдвигов 2n. По сравнению со сложением и сдвигом умножение достаточно медленная операция (цитирую по Зубкову) для P6 add – 1m, shl – 1m, mul – 3m – 4m – постараемся свести количество умножений к минимуму.
    Так получилось, что a1b0+a0b1=a0b0+a1b1+(a0-a1)(b1-b0) сохраняем в переменных c0=a0b0 c1=a1b1 c2=a2b2 p=c0+c1+c2 тогда
    (a0 + a1 *2³² + a2 *2^64)x(b0 + b1 *2³² + b2 *2^64)=с0+c2*2^128 + (p-c2+(a0-a1)(b1-b0)) 2³²+(p+(a0-a2)(b2-b0)) 2^64+(p-c0+(a1-a2)(b2-b1)) 2^96 количество умножений сократилось до 6
    пусть c0=a0b0 c1=a1b1 c2=a2b2 с3=a3b3 p=c0+c1+c2+c3 тогда
    (a0 + a1 *2³² + a2 *2^64+a2^96)x(b0 + b1 *2³² + b2 *2^64+b3*2^96)=с0+c3*2^192 + (p-c2-c3+(a0-a1)(b1-b0)) 2³²+(p-c0-c1+(a2-a3)(b3-b2)) 2^160+(p-c3+(a0-a2)(b2-b0)) 2^64 +(p-c0+(a1-a3)(b3-b1)) 2^128+(p+(a0-a3)(b3-b0)+(a1-a2)(b2-b1)) 2^96 количество умножений сократилось до 10. А как же умножение для 512 и 1024 бит? «Сама, сама, сама» (© «Вокзал для двоих»)
     
  6. valterg

    valterg Active Member

    Публикаций:
    0
    Регистрация:
    19 авг 2004
    Сообщения:
    2.105
    И это есть ничто иное, как :
    http://ru.wikipedia.org/wiki/Умножение_Карацубы
    А опускаться до двух битов не нужно. В Пентиуме и так реализован оптимальный метод, который на каком-то уровне использует табличное умножение.
     
  7. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.797
    valterg
    Вы меня в чем, то обвиняете? В #13 упоминаются алгоритмы Карацуба и Тоома-Кука
    Я, честно говоря, не осилил описание Тоома-Кука ни Д.Кнута во 2-ом томе ни у Уэзерелла "Этюды для программистов" глава "Насколько быстро можно выполнить умножение", поэтому и попытался своими словами
     
  8. Ra_

    Ra_ New Member

    Публикаций:
    0
    Регистрация:
    4 мар 2007
    Сообщения:
    289
    Mikl__
    Алгебраисту произведение полиномов - бальзам на душу. :)
    А что с делением? ;)
     
  9. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.797
    Ra_
    Я не математик, напишу еще что-нибудь не так, забуду упомянуть классиков (не со зла, а по незнанию)
     
  10. Ra_

    Ra_ New Member

    Публикаций:
    0
    Регистрация:
    4 мар 2007
    Сообщения:
    289
    Кто-то сказал - Я достиг того возраста, что сам выбираю с кем общаться.
    Вот и переиначим - Я сам выбираю, кто из них классик. :)
    В одной группе к примеру Фермата, Эйлер, Галуа - а остальных можно отнести к группе проходящих
    мимо людей, пытающихся разобраться в математике.
    И кого к какой группе относишь - выбор каждого. А алгебре это по барабану... :)
     
  11. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.797
    Можно по-подробнее и ссылки если не секрет конечно...
     
  12. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.797
    Теперь, Ra_, Ваша очередь ;)
     
  13. valterg

    valterg Active Member

    Публикаций:
    0
    Регистрация:
    19 авг 2004
    Сообщения:
    2.105
    Нет. Просто заметил только Тома-Кука, а знал вообще только Кнута. Алгоритм Кнута в молодости разбирал, но благополучно забыл все. Замечание собственно было по поводу 2-х и 3-х битов.
    Про Интел знаю с чужих слов, что там модифицированный алгоритм Кнута используется.
    Косвенное подтверждение - выполнение умножения сначала за 2 такта, а потом вообще за 1.
    До Пентиума умножение выполнялось гораздо медленнее сложения. Или нет ?
     
  14. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.797
    На ЕС-1022 гораздо, медленнее, мы даже успевали пообедать пока шло умножение "в столбик", а вот когда поставили ЕС-1036, тут и началось, не успеешь спирт разбавить, а она уже, сволочь, все поперемножала, IMHO наверное Пентиум с ЕС-1036 содрали :)
     
  15. Ra_

    Ra_ New Member

    Публикаций:
    0
    Регистрация:
    4 мар 2007
    Сообщения:
    289
    По поводу деления - По сути сдвиг и вычитание, вопрос когда остановиться. :)
    Вот интересно было узнать, что думают академики от асма.
    А они шары отпасовывают ... (LoL)
     
  16. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    Может и нет ;)
    В том смысле, что оно и в пентиуме и после него выполняется заметно дольше сложения, по крайней мере никах не за 1-2 такта. В 486 умножение r32 выполнялось за 13-40 тактов, в Pentium за 9, в P6 и AMD K7 за 4, и только в K8 и выше за 3.
     
  17. valterg

    valterg Active Member

    Публикаций:
    0
    Регистрация:
    19 авг 2004
    Сообщения:
    2.105
    Наверно так. В IBM это было - Кнут и умножение. Просто до двойной точности оптимизация так и не докатилась(в СССР) и до сих пор приходится программистам физикам и математикам объяснять, что 64 бита и 32 бита одинаково быстро на ПК считает. А на ПК медленное умножение было во времена 286 и 386, когда были отдельные сопроцессоры и видимо для дешевизны их не оптимизировали.

    Про деление. Не помню где, но предлагалось итерационно считать обратную величину. За 1 такт не получится, но гораздо быстрее чем в столбик.
     
  18. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.797
    valterg
    [offtop]Про ЕС-1022 и ЕС-1036 это стёб, в который меня ввел ваш вопрос "До Пентиума умножение выполнялось гораздо медленнее сложения. Или нет?"[/offtop]
    В продолжение темы: во вложении статьи Ильи Кантора "Большие числа и операции с ними" и "Эффективное вычисление дискретного преобразования Фурье и дискретного преобразования Хартли". По поводу "итерационного подсчета обратной величины" подробно в Ахо, Хопкрофт, Ульман "Построение и анализ вычислительных алгоритмов" глава 8.2 "Умножение и деление целых чисел"
     
  19. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.797
    Mikl___
    Упс, не прикрепилось, но могу сбросить в почту, если кому-то потребуется
     
  20. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.797
    статья И.Кантора "Большие числа и операции с ними"