Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Работа с громадными числами


Автор: Shmity 2.10.2007, 10:08
Вообщем, если в кратце, требуется разработать алгоритм для работы с числами приблизительно с 50000 знаков, без потери последних на Delphi. Вроде как можно числа записывать в динамическую память, но как это сделать не знаю. Всем кто поможет буду оч. признателен.

Автор: Alexeis 2.10.2007, 10:21
  Какой алгоритм? Числа лучше в динамическом массиве хранить. Если задача не академическая, то проще заюзать что-то готовое.

Автор: BaD_SeCt0R 2.10.2007, 11:30
Тогда число будет храниться так: a[0]*2^8+a[1]*2^16+...+a[n]*2^(n+1)*8, где a - это динамический массив.

Автор: Shmity 2.10.2007, 16:39
BaD_SeCt0R, 
Alexeis,  спс

Автор: Gershkovich 2.10.2007, 16:51
Shmity, Не знаю поможет тебе моя идея или нет 


Мы в универе на лабораторных занятиях перемножали большие числа.

Каждое число - это массив байтов
причем каждый элемент должен быть в интервале 0-9,
т.е. как бы представлял собой десятичную цифру.

Имея два таких массива перемножали столбиком, как это делают в школе.
Только промежуточные произведения записывали не на бумагу а во временные массивы.

Может тебя такой подход натолкнет на продуктивные мысли...

Автор: Shmity 2.10.2007, 22:28
Gershkovich, спс оч. интересная и полезная мысль надо ее доработать

Автор: BaD_SeCt0R 2.10.2007, 23:53
Цитата(Gershkovich @  2.10.2007,  16:51 Найти цитируемый пост)
Каждое число - это массив байтов
причем каждый элемент должен быть в интервале 0-9,

Shmity, при вычислениях очень удобный, но весьма не экономичный для памяти 
прием. Если уж так, то я бы посоветовал (если уж не в бинарке) хотя бы хранить два знака в одном байте. Известно, что число в диапазоне 0..9 с легкостью укладывается в 4 бита. Отсюда и предложение. 9=$9. Мы экономим память уже в 2 раза!

Автор: Shmity 3.10.2007, 06:49
BaD_SeCt0R, сложность программы заключаеться не в хранении(сколько места и как), а в скорости работы проги в целом(желательно не более минуты общее время работы проги), так что мне пойдут любые варианты. Да и операции у Gershkovich,  будет чуть попроще реализовать. А еще такой вопрос уже ко всем: можно ли хранить и производить операции с такими громадными числами если выделить для них память c помощью getmem? И как потом с ними производить операции(если можно хранить, желательно хоть на каком нибудь малюсеньком примере, а то пробывал так делать делфи выдает ошибку постоянно)?

Автор: hihi 3.10.2007, 07:02
ребята, извините за офтоп, просто  сккажите, изнываю от любопытсва, для каких задач это требуется?

Автор: Alexeis 3.10.2007, 08:53
Shmity, зачем нужен GetMem? SetLength() меняет размер динамического массива и выделяет столько памяти сколько нужно.

Автор: Kuvaldis 3.10.2007, 08:57
Shmity, 

http://algolist.manual.ru/maths/longnum.php
Читай и разбирайся, здесь и теория, и практика smile

Автор: Esperito 3.10.2007, 20:38
Цитата(hihi @ 3.10.2007,  07:02)
ребята, извините за офтоп, просто  сккажите, изнываю от любопытсва, для каких задач это требуется?

На этом основана вся современная криптография.

Автор: Alexeis 3.10.2007, 21:41
Цитата(Esperito @  3.10.2007,  20:38 Найти цитируемый пост)
На этом основана вся современная криптография. 

 Ну не сказал бы что там нужны настолько большие числа, обычно кодирование идет блочно. Если ключ даже 1024 бита, то это примерно 300 знаков, ну пусть даже 500 знаков нужно, но 50000. 50000 это ж на 2 порядка больше.

Автор: Esperito 4.10.2007, 17:16
Цитата(Alexeis @ 3.10.2007,  21:41)
Ну не сказал бы что там нужны настолько большие числа, обычно кодирование идет блочно. Если ключ даже 1024 бита, то это примерно 300 знаков, ну пусть даже 500 знаков нужно, но 50000. 50000 это ж на 2 порядка больше.

Для формирования ключа нужно вычислять очень большие простые числа (в PGP например).

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)