При разработке .NET иногда из-за содержания знаний по некоторым второстепенным предметам, таким как статистика, финансы, астрономия и другие вычисления, алгоритмы шифрования и дешифрования будут включать в себя большое количество операций. Даже если в .net хранится самый большой числовой тип. будет переполняться. Number, одна из моих идей состоит в том, чтобы использовать числовые типы при вычислении и сохранять (временно) и выводить в виде строк. Затем при сохранении необходимы массивы BOX[n] n для временного хранения результатов небольшого шага. расчет.
'В качестве примера
================== Схема понимания алгоритма ======================
'97*97*97*97*97 = 8587340257 ящик(1) = 587340257 ящик(2)=8
'97*97*97*97*97*97 = 832972004929 ящик(1) = 972004929 ящик(2)=832
'97*97*97*97*97*97*97 = 80798284478113 коробка(1) = 284478113 коробка(2)=80798
'97*97*97*97*97*97*97*97 = 7837433594376961 коробка(1) = 594376961 коробка(2)=7837433
'97^ 9 = 760231058654565217 коробка(1) = 654565217 коробка(2)=760231058
'97^ 10 = 73742412689492826049 коробка(1) = 492826049 коробка(2)=742412689 коробка(3)=73
… … … … … …
Обратите внимание, что чем больше поле в таблице ниже, тем выше соответствующее число. При использовании вышеуказанного алгоритма не забудьте ① сначала определить количество цифр в поле, например, указанное выше значение равно 9 цифрам (в зависимости от потребностей и фактических данных). условия),
②Из-за привычек вычислений многие люди сначала вычисляют количество цифр в поле (n+1) при счете от нижней позиции {поле (0 -> n)}, а затем добавляют число переноса, сгенерированное полем (n) (например, в качестве первого. Вычислите поле (1) до поля (2) = 0, чтобы сгенерировать число переноса 8 поле (2) + число переноса = 8) для обработки, например, описанной выше обработки сложения. ③ Лучше всего начинать с верхнего уровня. позиции, вы избавите себя от многих проблем. Количество блоков неизвестно. Используйте динамический массив. Когда он заполнен (количество переносов, генерируемых блоком с самым высоким индексом), добавьте еще один. есть операция по модулю, если модуль не большой, можно также использовать приведенную выше идею, чтобы вычислить модуль в штуках, а затем связать. Ящик - это временный результат, и ящик перераспределяется (его нужно переотрезать от). Например, если это модуль 123456789123456789, установите поле с восемью цифрами box(1)=89 box(2)=91234567 box(3)=12345678. Каждое поле принимает модуль Воссоединения (традиционный). равно 123456789123456789 ÷ 333=370741108478849, модуль равен 72) Тогда перераспределяемый блок должен быть box(1) =478849 box(2) =370741180, а не box(1) =370741180 box(2) = 478849 Почему ∵ Начать принимать модуль? нас из Если поле box(n) не изменяется после одного раза по модулю, результат повторного взятия модуля не меняется и результат равен box(n) = box(n). Программа войдет в бесконечный цикл.
Другая ситуация, связанная с операциями с большими числами, - это возвести по модулю A в n-ю степень (A ^n mod V. Если номер мода невелик, это можно сделать (оно заканчивается после n A mod) ((A mod). V)* A mod V) * A mod V... Этот алгоритм не обязательно должен быть реализован рекурсивно, можно использовать простой цикл с двумя уровнями вложенности циклов.
Последний совет: при сложении, вычитании, умножении или делении большого числа не разлагайте делимое на множители (сложение/вычитание/умножение/деление). Этот алгоритм будет очень неэффективным.
(Статья написана на скорую руку, могут быть опечатки, прошу прощения)
Источник: тот же БЛОГ