我只是想知道是否有人可以帮我一个简单程序的代码。我已经编写了这个程序,但我似乎正在努力计算具有较大值e
和n
的值。
但是现在当我尝试计算以下fea(2, 968365546456, 132132156132132)
时,会出现错误说:
错误,(在fea中)数字异常:溢出
任何人都可以帮我处理代码,以便我可以修复错误吗?我假设它需要一个if语句?
到目前为止我的代码是:
fea := proc (x, e, n)
(x^e) mod n;
end proc;
答案 0 :(得分:2)
主题mod
的帮助页面说明了这一点:
"To compute `mod`(i^n,m) where i is an integer, it is undesirable
to use this "obvious" syntax because the powering will be
performed first over the integers (possibly resulting in a very
large integer) before reduction modulo m. Rather, the inert
operator &^ should be used: i &^ n mod m. In the latter form,
the powering will be performed intelligently by the mod operation."
所以让我们看看:
restart;
12367^ 13 mod 87; # for basic test
67
fea := proc (x, e, n)
(x &^ e) mod n;
end proc:
fea(12367, 13, 87);
67
# The following returns very quickly.
fea(2, 968365546456, 132132156132132);
131464616935876
您的原件试图计算中间结果:
restart;
2^968365546456;
Error, numeric exception: overflow
答案 1 :(得分:1)
计算能力的最佳方法之一是Square and Multiply Algorithm for Modular Exponentiation。
此算法采用以下形式
该算法的枫树proc如下
假设我们想要计算^ b mod n。这一行
for i从0到b而2 ^ i< = b do c:= c + 1 end do
计算数字b的二进制长度。这一行
对于i从0到c-1,如果irem(m,2,'q')= 1那么B [1,c-i]:= 1结束if; m:= q end do
获得数字b的二进制形式并放置在矩阵中。这一行
for i to c do m:= irem(m ^ 2,n);如果B [1,i] = 1则m:= irem(m * a,n)如果结束则结束
做平方和乘法算法。请举一个例子来学习它。
如果你想获得(a ^ b mod n),你应该先运行代码和 之后写Pow(a,b,n)并输入密钥。比如你的 数字,运行程序后你应该写
Pow(2,968365546456,132132156132132)
在输入密钥后,您会看到以下消息
2 ^(968365546456)mod(132132156132132)=(131464616935876)
请参阅source code。 这个领域最好的书是Introduction to Cryptography with Maple。