2011-11-11 14 views
8

Mathematica'da taşma hatası olmadı, aşağıdaki oldu. aşağıdaki gibiMathematica Overflow [] error: Neden ve nasıl yapılır baypas?

Ben RSA-şifreleme ilkesini demo-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 

Sorun Sofar.

Sonra asal sayıları daha gerçekçi, ancak yine de çok orta bir boyuta değiştirdim.

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[]}] 

Soru: Ben sadece Mathematica'nın limitler aracılığıyla gitti mi? Yanlış bir yaklaşım kullandım mı? Eğer varsa by-pass nedir? decyphering operasyonda PowerMod kullanılarak

cevap

8

Dene:

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

sayesinde sahip olduğunuz ataları Belçika'da ya da yaşadığım yer olan NL'de. –

6

Evet, Mathematica'nın sınırlar geçtik. Mathematica'nın belirli bir sürümünde bir sistemde temsil edilebilecek maksimum sayı $MaxNumber tarafından gösterilir. İkinci örneğinizde, d=18158086021982021938023 ve dolayısıyla 27136050989627^d, $MaxNumber'dan daha büyük yoldur.

Sen daha verimli Mod den a^b mod n hesaplamak olacaktır Eğer d için yaptığım çok gibi ikinci aşamada, içinde PowerMod kullanabilirsiniz. decipher2[x_List] := FromCharacterCode[Map[PowerMod[#, d, n] &, x]] ile, olsun: Diğer adam sen iyi ve gerçekten ulaşmış cevap olarak

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

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

Out[2]= "StackOverflow" 
+1

Sanırım Mathematica'nın küçük bir n ile Mod n olduğunda yüzeyin altında PowerMod'a geçeceğini varsaydım. - Her neyse, PowerMod çalışıyor, teşekkürler. - Arnoud Buzing'in cevabını kabul edeyim, çünkü ilk olarak cevapladı ve senin kadar çok noktan yok, üzgünüm. –

0

Evet, $ MAXNUMBER Mathematica işleyebilir.

$ MaxNumber'den daha büyük birçok büyük sayı için mod bulan bir baypas var. Kesinlikle büyük olan 163840000000^18158086021982021938023 gibi büyük sayıları doğrudan Mathematica'ya çarpmaktan ziyade, Mathematica'yı bu kadar çok sayıda hesaplamak zorunda kalmadan kaydetmek için Modüler aritmetiği kullanın.

Bunun için bir Mathematica Kodu geliştirebilmeniz gerekir, bunun nasıl yapıldığını henüz bilmiyorum. Ama el ile bunu yapabilirsiniz: Mod [Mod [Mod [Mod [Mod [Mod [Mod [Mod [163840000000^181, n]^580, n]^860, n]^219, n]^820, n]^219; n]^380; n]^23; n] $ mAXNUMBER aşmadan, aradığınız doğru cevap veren

Arnoud, (senin adından da anlaşılacağı