たとえば暗号化の32ビットオペレーティングシステムの場合、システムは2 ^ 56モジュロ7をどのように実行しますか?
そして、それはどのようにメモリに保存されましたか?
たとえば暗号化の32ビットオペレーティングシステムの場合、システムは2 ^ 56モジュロ7をどのように実行しますか?
そして、それはどのようにメモリに保存されましたか?
32ビットオペレーティングシステムは、そのサイズを超えるカスタムタイプを持つことを制限しません。アプリケーションは2つの32ビットワードを取り、それを1つの64ビット数のように扱うことができます。ほとんどのプログラミング言語には、問題を単純化するための「ダブルワード」積分型さえあります。
概念をさらに拡張して、制限されたメモリの量によってのみ制限される任意精度の整数データ型を作成できます。基本的に、ワードの配列があり、この配列のワードのビットにNビットの数値を格納します。
32ビットオペレーティングシステムであるという事実自体は、実行できる数値計算を制限するものではありません。long
たとえば、Javaは、実行場所に関係なく、64ビットの整数型です。任意精度の場合java.math.BigInteger
、アンティを上げ、「無限のワードサイズ」の抽象化を提供します。そして、はい、この「機能」は32ビットオペレーティングシステムでも利用できます(これは、そもそも制限要因ではなかったためです)。
モジュラ逆数またはべき乗剰余を見つけることは、暗号化の分野で一般的な数学的/アルゴリズム的タスクです。
ここで使用できるIDの1つは、次のとおりです。
A * B (mod M) == (A (mod M)) * (B (mod M)) (mod M)
x = 2 56(mod 7)を見つけるために、最初に256を計算して保存する必要はありません。y = 2 55(mod 7)-0..6-の間の数値がある場合、x = y * 2(mod 7)を見つけることができます。
しかし、 y = 2 55(mod 7)をどのように見つけますか?さて、1つの素朴な方法は、プロセスを線形に適用し、最初にz = 2 54(mod 7)などを見つけようとすることです。これは線形のべき乗ですが、たとえば2乗によるべき乗を実行することでより良い結果が得られます。
つまり、2 8と言った場合、それを2乗して、すぐに216を得ることができます。次に、それを2乗して、すぐに232を取得できます。
暗号化に適用できる高度な数学的アルゴリズムは数多くあり、32ビットまたは64ビットのオペレーティングシステムで実行されているプログラムに実装されているかどうかは直接関係ありません。十分なメモリが利用可能である限り、コンピュータは任意精度の演算を実行する能力を超えています。
任意精度の演算が有用な抽象化であるという理由だけで、多くの高性能ライブラリが利用可能であり、ゼロから構築する代わりに、既存のフレームワークの上にアプリケーションを構築できます。
一部の高級言語には、任意精度の算術演算が組み込まれています。たとえば、Pythonは任意精度int
をlong
言語レベルで提供します。
2**56 == 2**(28+28) == 2**28 * 2**28 == (2**28)**2
2**28 == 2**(14+14) == 2**14 * 2**14 == (2**14)**2
2**14 == 2**(7+7) == 2**7 * 2**7 == (2**7)**2
2**7 == 2**(3+3 +1) == 2**3 * 2**3 * 2 == (2**3)**2 * 2
2**3 == 2**(1+1 +1) == 2**1 * 2**1 * 2 == (2**1)**2 * 2
2**56 == (2**28)**2 == ((2**14)**2)**2 == (((2**7)**2)**2)**2
== (((2*(2**3)**2)**2)**2)**2 == (((2*(2*(2**1)**2)**2)**2)**2)**2
2**56 %7
== (((2*(2*(2**1)**2)**2)**2)**2)**2 %7
== (((2*(2*(2**1 %7)**2 %7)**2 %7)**2 %7)**2 %7)**2 %7
== (((2*(2*(2)**2 %7)**2 %7)**2 %7)**2 %7)**2 %7
== (((2*(2*4 %7)**2 %7)**2 %7)**2 %7)**2 %7
== (((2*(1)**2 %7)**2 %7)**2 %7)**2 %7
== (((2 %7)**2 %7)**2 %7)**2 %7
== ((2**2 %7)**2 %7)**2 %7
== ((4)**2 %7)**2 %7
== (16 %7)**2 %7
== (2)**2 %7
== 4 %7
== 4
so (2**56) % 7 == 4
大きな数を扱ったことは一度もないことに気付くでしょう(実際、最大のものは56でした)。
さらに:
2**224 %7 == (2**56)**4 %7 == (4*4*4*4) %7 ==
((16%7) * (16%7)) %7 == (2*2) %7 == 4 %7 == 4
したがって2**896 %7 = 4
、なども(以来896 = 4 * 224
、ここで224 = 4 * 56
)。
この種の操作には、べき乗剰余アルゴリズムが使用されます。このウィキペディアの記事は、それがどのように行われるかを説明しています:http: //en.wikipedia.org/wiki/Modular_exponentiation
一般に、数値が非常に大きくなることがわかっている場合は、GMP(Gnu Multi-Precision)などのライブラリを使用して計算を処理します。手に2^32本の指がある場合、紙で行うことを実行します。
32intとモジュラ逆数の良い説明をする他の答えに追加してください
32ビットCPUとは何かを説明します
32 bit
ほとんどの人が知っているCPUは、アドレスバスのサイズに関連しているため、たとえばx86(一般的なデスクトップCPU [AMD、Intel])プロセッサでは、これにより数2^32
バイトのアドレス空間が可能になります。4GB
通常、アドレス可能なハードウェアとRAMの間で分割されるため、実際にプロセッサを実装する理由は、RAMの制限64 bit
に近づきすぎたためです。4GB
ちなみに、これは以前はCPUが16ビットのときに発生していました
どのシステム?どのアーキテクチャですか?
一般的に、32ビットアーキテクチャでは、オーバーフローの結果が得られます。一部の言語には、これらの計算を処理できる組み込みの任意の大きさの数字タイプがあります。この例はBigDecimal
Javaで、組み込みlong int
はPythonです。
(a * b)mod c =((a mod c)*(b mod c))modcを使用します。それはあなたが基本的にできることを意味します
あなたの用語は少し混乱していると思います。
32ビットオペレーティングシステムまたは32ビットアーキテクチャは、マシンアドレスが32ビットに制限されているものです。32ビットアーキテクチャが64ビット整数および/または64ビット浮動小数点数で動作する算術命令を持つことはまったく珍しいことではありません。
long
したがって、32ビットアーキテクチャを備えた(および32ビットオペレーティングシステムを実行している)マシンは、64ビット演算を使用し、結果を64ビットまたはlong long
2つの連続する32ビットワードを使用してメモリに格納する可能性が非常に高くなります。