Страница 1 из 2

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

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

Поспрашивал у яндекса, но он по большей части предлагает мудреные варианты на С++ в котором я не силен. Так что буду очень признателен за любую информацию по теме.

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

СообщениеДобавлено: 09.03.2010 11:57:27
voltron
Что-то такое у меня было, и даже для Delphi/TurboPascal. Вечером дома поищу и выложу.

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

СообщениеДобавлено: 09.03.2010 12:34:48
Timid
Погугли Delphi+RSA - в самописных модулях используется работа с большими числами (80 знаков и более).

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

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

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

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


Я думаю, что в данном случае достаточно логических операций с "длинными" двоичными числами и без особого внимания к скорости.

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

СообщениеДобавлено: 09.03.2010 16:58:12
Astralis
А если вопросы производительности не так критичны, то значит числа не очень длинные, вполне может подойти данный модуль, который реализует работу с типом int256.

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

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

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

СообщениеДобавлено: 09.03.2010 21:35:51
alexrayne
вродеб принципы одинаковые на всех числах, что малых что больших

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

СообщениеДобавлено: 09.03.2010 22:46:46
Astralis
Сложение очень легко реализуется благодаря команде adc, которая оперирует с флагом переноса. Вычитание организуется за счет использования дополненительного кода (дополнение до 2). За счет дополнительного кода операции деления и умножения получаются чуть сложнее, но они и так являются медленными, а обычные алгоритмы являются квадратичными. В природе есть почти линейный алгоритм умножения, но он не так прост в реализации, а выигрыш заметен лишь для чисел очень большой размрности.

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

СообщениеДобавлено: 09.03.2010 23:41:54
Padre_Mortius
Когда-то очень давно баловался с возведением в степень больших чисел (типа 1996^1996). в итоге рассматривал вариант представления чисел как массивов. И соответственно работу с ними, как обычно в тетрадке в столбик умножали. Реализация проста до невозможности и вроде как не самая медленная.

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

СообщениеДобавлено: 10.03.2010 01:36:07
Astralis
Хотите сказать, что делали 1995 мультипликаций вместо возможных всего 15?

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

СообщениеДобавлено: 10.03.2010 10:42:11
Padre_Mortius
делал и так и так.

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

СообщениеДобавлено: 10.03.2010 12:09:20
Andreich
А какой самый "большой" стандартный тип для целых чисел? Есть ли больше чем Int64?

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

СообщениеДобавлено: 10.03.2010 14:02:23
Astralis
Максимальный стандартный это Int64. Но допустим в Object Pascal для 32 разрядных платформ он не был полноценным целочисленными например для цикла for с переменной типа int64 возникает ошибка компиляции, что-то вроде "тип с плавающей точкой нельзя использовать для цикла for".
С другой стороны никто не мешает сделать собственный тип данных и переопределить арифметические операции.
Например тип TGUID определен ка record, но сущность его все равно остается целочисленной.
А в совершенном языке программирования SmallTalk целые числа могут иметь произвольную длину.

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

СообщениеДобавлено: 10.03.2010 20:40:07
voltron
Вот немного информации по работе с большими числами и примеры кода.
large_nums.zip
(11.24 КБ) Скачиваний: 685