Легенда:
новое сообщение
закрытая нитка
новое сообщение
в закрытой нитке
старое сообщение
|
- Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
- Новичкам также крайне полезно ознакомиться с данным документом.
Re: Обработка больших значений 09.01.04 14:25 Число просмотров: 2123
Автор: leo <Леонид Юрьев> Статус: Elderman
|
> > Интересно, как они это реализовали? Явно что-то > GNU-шное > > использовали ;-) Точно нет, M$ сейчас обходит GNU как можно подальше.
Перестраховываются.
> Дело то не хитрое. Хотел тоже переменный размер > реализовать, только медленно это будет. Может для малых > значений то и быстрее получится - меньше "пустоты" > обрабатывать придется. Беда в том, что функции > динамического распределения памяти надо будет дергать, а > они медленные. Все за каждый такт борятся. Так что этот > плюс (работа с числами любой длины) невелируется с потерей > скорости (в шифровалках то заведомо оговорена длина ключа, > и скорость очень важна). При вычислениях почти всегда можно использовать _alloca() вместо malloc(). Кроме этого никто не мешает реализовать свои супер-пупер быстрые функции выделения памяти (см. slab в linux kernel).
Обработка больших чисел переменной длины становить не медленее "фиксированной" арифметики, как только длина чисел превысит 4-5 машинных слова. Поэтому если 128 бит может не хватить - то переменный размер однозначно.
Если реализовывать не на ассемблере, то основное неудобство доставляет отсутствие полноценных функций соответствующих "процессорным" сложению/вычитанию с переносом, умножение с "двойным" результатом и такое же деление.
Если нужно сделать действительно быстро - мой совет: возьми за основу вот это http://leo.yuriev.ru/files/simple-rsa.rar (автор мне не известен, наверное какой-нибудь студент). Используя GNU C++ реализуй на inline-asm функции сложение/вычитание с переносом и правильное умножение/деление, и задействуй их. При правильном подходе вседа можно будет реализовать поддержку любого процессора, меняя только четыре-пять низкоуровневых функций.
Ну и конечно как вариант - всегда можно взять что-нибудь готовое из GNU.
Удачи!
|
|
|