Mathematica溢出[]错误:为什么以及如何绕过?

时间:2011-11-11 14:33:08

标签: wolfram-mathematica

我从未在Mathematica中出现溢出错误,以下情况发生了。

我演示了RSA加密的原理如下:

 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

没问题。

然后我将质数更改为更现实,但仍然非常适中。

 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的限制?我使用了不正确的方法吗?什么是旁路,如果有的话?

3 个答案:

答案 0 :(得分: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]

答案 1 :(得分:6)

是的,你已经完成了Mathematica的限制。可以在特定版本的Mathematica中的系统上表示的最大数量由$MaxNumber显示。在第二个示例中,d=18158086021982021938023因此27136050989627^d$MaxNumber更大。

您可以在第二步中使用PowerMod,就像使用d一样,a^b mod n会比Mod更有效地计算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}}

答案 2 :(得分:0)

是的,正如另一个人回答你一样,并且真正达到了Mathematica可以处理的$ MaxNumber。

有一个旁路可以找到大于$ MaxNumber的许多大数字的mod。

不是直接将大数字直接输入Mathematica,例如163840000000 ^ 18158086021982021938023,这绝对是巨大的,使用模运算来节省Mathematica必须计算这么大数字的麻烦。

你应该能够为此开发一个Mathematica代码,我还不知道如何做到这一点。但你可以通过以下方式手工完成: MOD [MOD [MOD [MOD [MOD [MOD [MOD [MOD [1638.4亿^ 181中,n] ^ 580中,n] ^ 860中,n] ^ 219中,n] ^ 820中,n] ^ 219中,n] ^ 380, N] ^ 23中,n]

在不超过$ MaxNumber

的情况下,您可以找到正确的答案