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

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

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

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

Сообщение Andreich » 09.03.2010 11:30:59

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

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

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

Сообщение voltron » 09.03.2010 11:57:27

Что-то такое у меня было, и даже для Delphi/TurboPascal. Вечером дома поищу и выложу.
voltron
новенький
 
Сообщения: 64
Зарегистрирован: 06.07.2007 13:27:46
Откуда: Украина

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

Сообщение Timid » 09.03.2010 12:34:48

Погугли Delphi+RSA - в самописных модулях используется работа с большими числами (80 знаков и более).
Timid
постоялец
 
Сообщения: 290
Зарегистрирован: 21.11.2007 21:33:15

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

Сообщение Astralis » 09.03.2010 13:35:58

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

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

Сообщение Timid » 09.03.2010 16:01:07

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


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

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

Сообщение Astralis » 09.03.2010 16:58:12

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

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

Сообщение Andreich » 09.03.2010 18:55:49

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

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

Сообщение alexrayne » 09.03.2010 21:35:51

вродеб принципы одинаковые на всех числах, что малых что больших
alexrayne
постоялец
 
Сообщения: 125
Зарегистрирован: 03.12.2008 16:56:26

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

Сообщение Astralis » 09.03.2010 22:46:46

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

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

Сообщение Padre_Mortius » 09.03.2010 23:41:54

Когда-то очень давно баловался с возведением в степень больших чисел (типа 1996^1996). в итоге рассматривал вариант представления чисел как массивов. И соответственно работу с ними, как обычно в тетрадке в столбик умножали. Реализация проста до невозможности и вроде как не самая медленная.
Padre_Mortius
энтузиаст
 
Сообщения: 1265
Зарегистрирован: 29.05.2007 17:38:07
Откуда: Спб

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

Сообщение Astralis » 10.03.2010 01:36:07

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

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

Сообщение Padre_Mortius » 10.03.2010 10:42:11

делал и так и так.
Padre_Mortius
энтузиаст
 
Сообщения: 1265
Зарегистрирован: 29.05.2007 17:38:07
Откуда: Спб

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

Сообщение Andreich » 10.03.2010 12:09:20

А какой самый "большой" стандартный тип для целых чисел? Есть ли больше чем Int64?
Andreich
постоялец
 
Сообщения: 268
Зарегистрирован: 17.04.2008 12:33:43

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

Сообщение Astralis » 10.03.2010 14:02:23

Максимальный стандартный это Int64. Но допустим в Object Pascal для 32 разрядных платформ он не был полноценным целочисленными например для цикла for с переменной типа int64 возникает ошибка компиляции, что-то вроде "тип с плавающей точкой нельзя использовать для цикла for".
С другой стороны никто не мешает сделать собственный тип данных и переопределить арифметические операции.
Например тип TGUID определен ка record, но сущность его все равно остается целочисленной.
А в совершенном языке программирования SmallTalk целые числа могут иметь произвольную длину.
Аватара пользователя
Astralis
новенький
 
Сообщения: 45
Зарегистрирован: 06.06.2007 20:33:05
Откуда: Tvercity-Annet

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

Сообщение voltron » 10.03.2010 20:40:07

Вот немного информации по работе с большими числами и примеры кода.
large_nums.zip
(11.24 КБ) Скачиваний: 650
voltron
новенький
 
Сообщения: 64
Зарегистрирован: 06.07.2007 13:27:46
Откуда: Украина

След.

Вернуться в Обучение Free Pascal

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 8

Рейтинг@Mail.ru