Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/kubernetes/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Wolfram mathematica Mathematica Overflow[]错误:为什么和如何绕过?_Wolfram Mathematica - Fatal编程技术网

Wolfram mathematica Mathematica Overflow[]错误:为什么和如何绕过?

Wolfram mathematica Mathematica Overflow[]错误:为什么和如何绕过?,wolfram-mathematica,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] &

我在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的极限?我是否使用了错误的方法?旁路是什么,如果有的话???

尝试在解加密操作中使用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]

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

在第二步中,您也可以像对d一样使用PowerMod,这将比mod更有效地计算a^b mod n。使用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"

是的,正如另一个人回答的那样,你已经达到了Mathematica可以处理的$MaxNumber

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

不要直接将大量的数字输入Mathematica,比如16384000000^18158086021982021938023,这绝对是一个巨大的数字,使用模运算可以避免Mathematica计算如此大的数字的麻烦

你应该能够为此开发Mathematica代码,我还不知道怎么做。但您可以通过以下方式手动完成: Mod[Mod[Mod[Mod[Mod[Mod[16384000000^181,n]^580,n]^860,n]^219,n]^820,n]^219,n]^380,n]^23,n]


这给出了您想要的正确答案,但不超过$MaxNumber

谢谢Arnoud,您的名字表明您的祖先在比利时或我居住的NL。我想我假设Mathematica会在表面下切换到PowerMod,当它是Mod n时,有一个小的n不管怎样,PowerMod是有效的,谢谢不过我会接受阿诺德·布津的回答,因为他先回答了,而且没有你那么多分数,对不起。