![]() |
|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
![]() Доброго времени суток!
Когда-то, уже давно (во времена Delphi 3), писал программу "калькулятор" для больших чисел... Реализовать удалось тока сложение, вычитание и умножение для 255 значных десятичных чисел (через String)... Кроме того, делалось это на школьном компе после уроков во время кружка не имея дома своего компа, следовательно - сохранить ничего неудалось... Теперь возникла такая необходимость: написать программу (точнее модуль) которая умела бы сумировать, вычитать, умножать, делить и возводить в степень числа любой (почти бесконечной) разрядности... Например, используя динамический массив (dynamic array). Для упрощения задачи - требуется только целочисленные вычисления, но с запятой тоже не помешает. На самом деле, голова забита реализацией другой программы, в которой возникла необходимость вычислений больших чисел. Времени мало, а еще предстоит решить многое. А потому обращаюсь к программистам, которые это отщелкают как орешки. добавил: Желательно с пояснениями алгоритмов. К тому-же, если выложить исходники тут, то будет прекрасная возможность для других пользоватся такой прелестью. Пожалуста, помогите. Заранее благодарен! Последний раз редактировалось Navi1982, 28.01.2008 в 16:18. |
#2
|
||||
|
||||
![]() Цитата:
- http://www.delphisources.ru/pages/so...alculator.html - http://www.delphisources.ru/pages/so...unct_calc.html |
#3
|
|||
|
|||
![]() так быстро ответ пришел
![]() первые две ссылки прошли, последняя не открывается... Да и с самого сайта в раздел "исходники" попасть не могу - открывает пустую страницу ![]() |
#4
|
||||||
|
||||||
![]() to Navi1982
Насчет возведения числа в большую степень могу подсказать на мой взгляд вполне отличный метод. Сложность заключается в том, что при вычислениях реальных 512 и/или 1024, и/или N - значных чисел не возможно пользоваться встроенными арифметическими операциями языков программирования! ![]() У меня была недавно лаба, связанная с шифрованием методом RSA. Так вот длина ключа(для шифрования/расшифрования) должна должна вычисляться с помощью квадратов чисел большой разрядности. На первый взгляд может показаться, что это очень сложно, но это, ИМХО, наиболее быстро, удобно и надежно. ^ - этим знаком я буду обозначать возведение в степень! ![]() В качестве примера: (432^678) mod 987. Первым делом надо найти степени числа 432: Код:
Число 678 можно представить как Код:
Код:
В лабе по шифрованию RSA я РЕАЛЬНО использовал ключи, длиной не менее 2048 символов (такова была задача), и после реализации задачи таким методом, все работало на ура, но приходилось пользоваться методами против "залипания" клавиш во время работы программы! |
#5
|
||||||||||||||
|
||||||||||||||
![]() Вобщем принялся сам реализовывать эти функции...
Для начала принял некоторые правила: 1. Операции делаю над десятичными числами. 2. Храню числа в динамическом массиве (элементы типа byte) - каждая цифра (0..9) занимает один элемент массива и по принцыпу: младший разряд по младшему адресу. 3. Последний элемент всегда хранит значение знака + или -. Реализовал через константы sgPlus, sgMinus. 4. Операции намерен делать столбиком. Проще пока не придумал. Пока есть тока функция ZAdd складывающая два массива без знака. Знак будет учитыватся в функции SZAdd где будет происходить коррекция и вызыватся ZAdd или ZSub. 5. Число получаю с переменной типа String. Реализовал через функции StrToZ и обратную ей ZToStr. Ниже привожу код с пояснениями: константы знаков в последнем элементе: Код:
Код:
Код:
Код:
Код:
Код:
Код:
помагите реализовать функцию вычитания. Лучше в столбик, чтобы понятней было. А раз столбиком, то я понимаю, что надо отнимать меньшее значение от большего. Допустим, я напишу функцию сравнения... А дальше как? Алгоритм пожалуста. Код уже сам напишу или свой дайте. Заранее благодарен! Последний раз редактировалось Navi1982, 06.03.2008 в 00:52. |
#6
|
|||
|
|||
![]() всем здраствуйте!!
Помогите плиз, очень срочно нужна информация о методах быстрых вычислений чисел большой разрядности. Может можете порекомендовать хотя бы какую литературу искать. |
#7
|
|||
|
|||
![]() Насчет литературы не скажу, а сам составил для себя модуль для поддержки больших чисел реализовано через String (писал сам, это не алгоритмы которые кочуют по форумам). Если очень надо могу скинуть, только зачем тебе это?
|
#8
|
|||
|
|||
![]() А тебе Int64 не хватает?
Еще можно через SSE оперировать аж со 128-расзрядными числами, но придется писать на асемблере, благо, это не сложно. Ну а если тебе нужны ОЧЕНЬ БОЛЬШИЕ числа, то тогда нужно будет искать алгоритмы работы с ними. |
#9
|
|||
|
|||
![]() Код:
Если честно то это не очень то и сложно, если умеешь складывать отрицательные числа, то это и есть разность. Надеюсь организовать произведение сам сможешь. Если нет почитай Меньшикова, он извращался и не так. Я про Олимпиадные задачи. Ф.Меньшиков-Оллимпиадные задачи по программирыванию hty007 hty007 |