.NET 開発では、統計、金融、天文学、その他の計算などの一部のマイナーな主題の知識内容が原因で、.net に最大の数値型が格納されている場合でも、暗号化および復号化アルゴリズムに大量の操作が含まれることがあります。私のアイデアの 1 つは、計算時に数値型を使用し、(一時的に) 保存して文字列として出力することです。保存するときに、小さなステップの結果を一時的に保存するために、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)の桁数{box(0 -> n)}を計算し、ボックス(n)で生成されたキャリー数を加算する人が多いです(最初に box(1) から box(2)=0 を計算して 8 のキャリー数を生成します (box(2)+キャリー数 = 8) 上記の加算処理などの処理を行います。 ③ 上位から始めるのが最適ですボックスの数が不明である場合は、動的な配列を使用してください (最も高い添字ボックスによって生成される桁数)。モジュロ演算があります。モジュラスが大きくない場合は、上記の考え方を使用してモジュラスを部分的に計算してからリンクすることもできます。ボックスは一時的な結果であり、ボックスは再配布されます (元から再切り詰める必要があります)。たとえば、モジュロ 123456789123456789 の場合、ボックス (1)=89、ボックス (2)=91234567、ボックス (3)=12345678 を設定します。は 123456789123456789 ÷ 333=370741108478849 モジュラスは 72) その場合、再配布されるボックスは box(1) =478849 box(2) =370741180 であるはずですが、box(1) =370741180 box(2) = 478849 ではありません ∵ MOD を導入し始めるのはなぜですか?ウルスから一度モジュロを計算した後、box(n) が変化しない場合、再度モジュロを計算した結果は変化せず、結果は box(n) = box(n) になります。
多数の演算を伴うもう 1 つの状況は、A の n 乗 (A ^n mod V) を法とすることです。mod 数が大きくない場合は、これを実行できます (n A mod の後で終了します) ((A mod)。 V)* A mod V) * A mod V... このアルゴリズムは必ずしも再帰的に実装する必要はなく、最大 2 レベルのネストされたループを持つ単純なループを使用できます。
最後のアドバイス: 大きな数値を加算、減算、乗算、または除算する場合、被除数を簡単に因数分解 (加算/減算/乗算/除算) しないでください。このアルゴリズムは非常に非効率的です。
(急いで書いた記事です、誤字があるかもしれません、ご容赦ください)
出典:同BLOG