2011-11-11 8 views
8

Mathematicaでオーバーフローエラーが発生したことはありませんでした。次のようにMathematicaオーバーフロー[]エラー:なぜ、どのようにバイパスするのですか?

は、私は、RSA暗号化の原理をデモ-ED:

n = 11*13 
m = EulerPhi[n] 
e = 7 
GCD[e, m] 
d = PowerMod[e, -1, m] 
cipher2[m_String] := Map[Mod[#^e, n] &, ToCharacterCode[m]] 
decipher2[x_Integer] := FromCharacterCode[Map[Mod[#^d, n] &, x]] 

In[207]:= cipher2["StackOverflow"] 
decipher2[cipher2["StackOverflow"]] 
Out[207]= {8,129,59,44,68,40,79,62,49,119,4,45,37} 
Out[208]= StackOverflow 

問題ありませんSOFAR。

次に、素数をより現実的に変更しましたが、それでもやはり適度なサイズに変更しました。

n = 252097800611*252097800629 

In[236]:= cipher2["StackOverflow"] 
decipher2[cipher2["StackOverflow"]] 

Out[236]= {27136050989627, 282621973446656, 80798284478113, \ 
93206534790699, 160578147647843, 19203908986159, 318547390056832, \ 
107213535210701, 250226879128704, 114868566764928, 171382426877952, \ 
207616015289871, 337931541778439} 

During evaluation of In[236]:= General::ovfl: Overflow occurred in computation. >> 

During evaluation of In[236]:= General::ovfl: Overflow occurred in computation. >> 

Out[237]= FromCharacterCode[{Overflow[], Overflow[], Overflow[], 
    Overflow[], Overflow[], Overflow[], Overflow[], Overflow[], 
    Overflow[], Overflow[], Overflow[], Overflow[], Overflow[]}] 

質問:私は、単純にMathematicaの限界を経ていますか?間違ったアプローチを使用しましたか?もしあれば、バイパスとは何ですか?

答えて

8

はdecyphering操作でPowerModを使用してみてください:

n = 252097800611*252097800629; 
m = EulerPhi[n]; 
e = 7; 
Print[GCD[e, m]]; 
d = PowerMod[e, -1, m]; 
Print[{"n" -> n, "m" -> m, "e" -> e, "d" -> d}]; 
Grid[ 
Join[{ 
    {"Input", "Encrypted", "Decrypt with Mod", "Decrypt with PowerMod"}}, 
    Table[{i, (j = Mod[i^e, n]), Mod[j^d, n], PowerMod[j, d, n]}, {i, 40}]], 
Frame -> All] 
+0

おかげであなたが持っている先祖ベルギーでは、私が住んでいるNL) –

6

はい、あなたはMathematicaの限界を経ています。特定のバージョンのMathematicaでシステム上で表現できる最大数は$MaxNumberです。あなたの2番目の例では、d=18158086021982021938023であり、したがって27136050989627^d$MaxNumberより大きくなります。

あなたはより効率的にModよりa^b mod nを計算しますあなたはdのためにした、あまりにも同様に第二段階でPowerModを使用することができます。 decipher2[x_List] := FromCharacterCode[Map[PowerMod[#, d, n] &, x]]では、あなたが得る:他の男が答えとして

cipher2["StackOverflow"] 
decipher2[cipher2["StackOverflow"]] 

Out[1]= {27136050989627, 282621973446656, 80798284478113, \ 
93206534790699, 160578147647843, 19203908986159, 318547390056832, \ 
107213535210701, 250226879128704, 114868566764928, 171382426877952, \ 
207616015289871, 337931541778439} 

Out[2]= "StackOverflow" 
+1

小さなnのMod nでMathematicaがSurfaceの下のPowerModに切り替わると仮定したとします。 - とにかく、PowerModは動作します、ありがとう。 - 私はArnoud Buzingの答えを受け入れるつもりです。なぜなら彼は最初に答えてくれて、あなたと同じくらいポイントはありません。 –

0

うんを、あなたはよく、本当に$ MAXNUMBER Mathematicaが扱うことができます達しています。

バイパスがあり、$ MaxNumberより大きい多数の大きな数値に対してmodを見つけることができます。

163840000000^18158086021982021938023のように大きな数値をMathematicaに直接代入するのではなく、Matular算術を使ってMathematicaにそのような大きな数を計算する手間を省く。

これについてMathematicaコードを開発できるはずですが、これを行う方法はまだ分かりません。しかし、あなたは手でそれを見つけることができます: Mod [Mod [Mod [Mod [Mod [Mod [163840000000^181、n]^580、n]^860、n]^219、n]^820、n]は^ 219、n]は^ 380、n]は^ 23、n]は$ MAXNUMBERを超えることなく、あなたが探しているの正しい答えを与える

Arnoudは、(あなたの名前が示唆する
関連する問題