Вычисления с целыми числами (разминка для мозгов)

Уже сегодня ученые мира удивляют нас новыми открытиями и техникой, которую мы не ждали ближайшие десятилетия. Насколько будущее приблизилось к нам?

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

Новая тема Ответить
Аватара пользователя

Автор темы
Bitman
В сети
Сообщений: 1261
Стаж: 12 лет 4 месяца
Желаемая форма обращения: Как хотите к себе
Благодарил (а): 65 раз
Поблагодарили: 59 раз

Вычисления с целыми числами (разминка для мозгов)

Сообщение Bitman » 02.04.2026, 21:35

Я написал программу на Delphi - простой калькулятор для вычислений с целыми числами любого размера (мне захотелось написать такую программу, чтобы разобраться с RSA-шифрованием). Предлагаю пораскинуть мозгами, какой должен быть алгоритм для такой программы при правильном программировании. Опишу что написал, но сознательно не буду цитировать свой код, потому что тема скорее не программистская а математическая или может быть философская.
Ясно, что каждое такое число должно быть динамическим массивом. Я сделал десятичные числа, т.е. каждый элемент массива это цифра от 0 до 9.
Всем понятно, как сделать сложение двух таких чисел - один прогон цикла от последней цифры справа до крайней цифры слева у большего числа. Сделать умножение чуть сложнее, и здесь уже возникает такой вопрос - если мы говорим что "оптимизацией мы можем особо не заморачиваться", до какого предела этот принцип можно притворять в жизнь. Скажем, самый простой алгоритм умножения A на B - взять 0 и прибавлять к нему B, и так A раз. Но понятно что если мы будем работать с числами длиной 200 байт (какие используются в RSA шифровании), то с таким алгоритмом умножение двух чисел займёт тысячу лет. Значит в какой-то степени придётся всё-таки "заморочиться" с оптимизацией.
И здесь могу сказать, что мой опыт говорит, что для оптимизации сложных алгоритмов бывает важно забить на низкоуровневую оптимизацию. Дело в том что сложный алгоритм надо писать без ошибок, оптимизация повышает вероятность ошибок, поэтому писать надо максимально структурированный код - разбивая код на отдельные "ортогональные" фрагменты, упакованные например в классы. Проиллюстрирую это описанием своего алгоритма умножения чисел: с ним чуть-чуть падает скорость из-за всяких присвоений от одного объекта к другому, но это мелочь, а важнее чтобы алгоритм был максимально понятен (это тоже причина почему я под спойлером пишу текст а не код - понятный алгоритм можно выразить текстом а не кодом, подобно тому как в хорошем научпопе автор пытается по возможности вместо формул писать словами):
► Показать
Позже напишу свой алгоритм для деления, а пока предлагаю подумать, как он должен выглядеть.
Не бойтесь будущего, оно не настоящее.

Аватара пользователя

Н. Светлов
Сообщений: 13544
Стаж: 21 год 2 месяца
Желаемая форма обращения: Всё равно
Откуда: Москва
Благодарил (а): 1325 раз
Поблагодарили: 2292 раза
Возраст: 58
Контактная информация:

Вычисления с целыми числами (разминка для мозгов)

Сообщение Н. Светлов » 02.04.2026, 21:56

Bitman писал(а): 02.04.2026, 21:35 как он должен выглядеть
Умножение по алгоритмам Тоома Вам в помощь. Есть ещё метод Фурье, но он сложноват. Не для компьютера, конечно же.
Ну, а я бы обошёлся возможностями SAGE. Эта надстройка над Python'ом делает с чрезмерно длинными целыми числами всё, что нужно, а бонусом — много чего ещё.
Как водится, почти всё, что можно запрограммировать, уже запрограммировано, и не раз :)
Воображаемые сущности не могут использоваться ни в одном истинном высказывании. Приписывается Бертрану Расселу
Все беды от романтики. Кир Булычёв

Аватара пользователя

Автор темы
Bitman
В сети
Сообщений: 1261
Стаж: 12 лет 4 месяца
Желаемая форма обращения: Как хотите к себе
Благодарил (а): 65 раз
Поблагодарили: 59 раз

Вычисления с целыми числами (разминка для мозгов)

Сообщение Bitman » 03.04.2026, 12:42

Мой алгоритм деления A на B:
► Показать
Не бойтесь будущего, оно не настоящее.

Новая тема Ответить

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

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