Работа с целыми числами произвольной длины...

Форум для изучающих FPC и их учителей.

Модератор: Модераторы

Andreich
постоялец
Сообщения: 268
Зарегистрирован: 17.04.2008 12:33:43

Работа с целыми числами произвольной длины...

Сообщение Andreich »

Всем доброго времени суток! Собственно говоря интересует сабж.
Быть может кто сталкивался с данной задачей? Требуется реализовать набор процедур для формирования целых чисел произвольной длины, их сложения, вычитания, деления и умножения.

Поспрашивал у яндекса, но он по большей части предлагает мудреные варианты на С++ в котором я не силен. Так что буду очень признателен за любую информацию по теме.
voltron
новенький
Сообщения: 64
Зарегистрирован: 06.07.2007 13:27:46
Откуда: Украина

Сообщение voltron »

Что-то такое у меня было, и даже для Delphi/TurboPascal. Вечером дома поищу и выложу.
Timid
постоялец
Сообщения: 290
Зарегистрирован: 21.11.2007 20:33:15

Сообщение Timid »

Погугли Delphi+RSA - в самописных модулях используется работа с большими числами (80 знаков и более).
Аватара пользователя
Astralis
новенький
Сообщения: 45
Зарегистрирован: 06.06.2007 20:33:05
Откуда: Tvercity-Annet
Контактная информация:

Сообщение Astralis »

Советовал бы более внимательно подходить к выбору алгоритмов для математических операций. Например, умножение и деление лучше реализовывать с помощью метода Фурье, для возведения в целую степень существует специальное дерево, которое минимизирует количество мультипликаций.
Timid
постоялец
Сообщения: 290
Зарегистрирован: 21.11.2007 20:33:15

Сообщение Timid »

Astralis писал(а):Советовал бы более внимательно подходить к выбору алгоритмов для математических операций. Например, умножение и деление лучше реализовывать с помощью метода Фурье, для возведения в целую степень существует специальное дерево, которое минимизирует количество мультипликаций.


Я думаю, что в данном случае достаточно логических операций с "длинными" двоичными числами и без особого внимания к скорости.
Аватара пользователя
Astralis
новенький
Сообщения: 45
Зарегистрирован: 06.06.2007 20:33:05
Откуда: Tvercity-Annet
Контактная информация:

Сообщение Astralis »

А если вопросы производительности не так критичны, то значит числа не очень длинные, вполне может подойти данный модуль, который реализует работу с типом int256.
Andreich
постоялец
Сообщения: 268
Зарегистрирован: 17.04.2008 12:33:43

Сообщение Andreich »

voltron писал(а):Что-то такое у меня было, и даже для Delphi/TurboPascal. Вечером дома поищу и выложу.
Было бы здорово! )
Astralis писал(а):А если вопросы производительности не так критичны, то значит числа не очень длинные, вполне может подойти данный модуль, который реализует работу с типом int256.
Модуль посмотрел... по большей части ассемблер. Если говорить о производительности, то она не так уж важна, здесь меня больше интересует сам принцип работы с длинными целыми числами.
alexrayne
постоялец
Сообщения: 125
Зарегистрирован: 03.12.2008 15:56:26

Сообщение alexrayne »

вродеб принципы одинаковые на всех числах, что малых что больших
Аватара пользователя
Astralis
новенький
Сообщения: 45
Зарегистрирован: 06.06.2007 20:33:05
Откуда: Tvercity-Annet
Контактная информация:

Сообщение Astralis »

Сложение очень легко реализуется благодаря команде adc, которая оперирует с флагом переноса. Вычитание организуется за счет использования дополненительного кода (дополнение до 2). За счет дополнительного кода операции деления и умножения получаются чуть сложнее, но они и так являются медленными, а обычные алгоритмы являются квадратичными. В природе есть почти линейный алгоритм умножения, но он не так прост в реализации, а выигрыш заметен лишь для чисел очень большой размрности.
Padre_Mortius
энтузиаст
Сообщения: 1265
Зарегистрирован: 29.05.2007 17:38:07
Откуда: Спб

Сообщение Padre_Mortius »

Когда-то очень давно баловался с возведением в степень больших чисел (типа 1996^1996). в итоге рассматривал вариант представления чисел как массивов. И соответственно работу с ними, как обычно в тетрадке в столбик умножали. Реализация проста до невозможности и вроде как не самая медленная.
Аватара пользователя
Astralis
новенький
Сообщения: 45
Зарегистрирован: 06.06.2007 20:33:05
Откуда: Tvercity-Annet
Контактная информация:

Сообщение Astralis »

Хотите сказать, что делали 1995 мультипликаций вместо возможных всего 15?
Padre_Mortius
энтузиаст
Сообщения: 1265
Зарегистрирован: 29.05.2007 17:38:07
Откуда: Спб

Сообщение Padre_Mortius »

делал и так и так.
Andreich
постоялец
Сообщения: 268
Зарегистрирован: 17.04.2008 12:33:43

Сообщение Andreich »

А какой самый "большой" стандартный тип для целых чисел? Есть ли больше чем Int64?
Аватара пользователя
Astralis
новенький
Сообщения: 45
Зарегистрирован: 06.06.2007 20:33:05
Откуда: Tvercity-Annet
Контактная информация:

Сообщение Astralis »

Максимальный стандартный это Int64. Но допустим в Object Pascal для 32 разрядных платформ он не был полноценным целочисленными например для цикла for с переменной типа int64 возникает ошибка компиляции, что-то вроде "тип с плавающей точкой нельзя использовать для цикла for".
С другой стороны никто не мешает сделать собственный тип данных и переопределить арифметические операции.
Например тип TGUID определен ка record, но сущность его все равно остается целочисленной.
А в совершенном языке программирования SmallTalk целые числа могут иметь произвольную длину.
voltron
новенький
Сообщения: 64
Зарегистрирован: 06.07.2007 13:27:46
Откуда: Украина

Сообщение voltron »

Вот немного информации по работе с большими числами и примеры кода.
large_nums.zip
(11.24 КБ) 787 скачиваний
Ответить