【发布时间】:2013-07-14 21:23:47
【问题描述】:
我正在尝试理解 Rabin Miller 算法,但我对其中的一部分感到困惑。请帮助理解它。
我的理解: 我们在 2^d*s 中计算 's',然后我们取一个随机整数 'a' 并计算 a^s%p,如果它等于 1,那么 p 是可能的素数。否则,如果对于任何 'r' a^(r*s)%p = -1 那么我们将在下一次平方中得到 1,因此 p 是素数。 在第一次迭代中,如果 x=1;然后我们在 if 语句中检查它,但是在第一次迭代之后 if 语句的意义是什么,我不明白。请帮忙...
令人困惑的部分:
if(mod!=p-1 && temp%2==0){
return false;
}
原始米勒实施:
bool Miller(long long p,int iteration){
if(p<2){
return false;
}
if(p!=2 && p%2==0){
return false;
}
long long s=p-1;
while(s%2==0){
s/=2;
}
for(int i=0;i<iteration;i++){
long long a=rand()%(p-1)+1,temp=s;
long long mod=modulo(a,temp,p);
while(temp!=p-1 && mod!=1 && mod!=p-1){
mod=mulmod(mod,mod,p);
temp *= 2;
}
if(mod!=p-1 && temp%2==0){
return false;
}
}
return true;
}
【问题讨论】:
-
注意编程语言可能很有用。
-
要注意编程语言..那是什么?
-
编写代码的语言。可能是 C、C++、C#、Java 等。
-
不...与编程语言无关。
-
我强烈反对这一点。有时,符号的含义会因语言而略有不同。他们也有不同的语法规则。例如,
long long s在您使用的语言中可能是有效的,但我相信它在 C# 和 Java 中是无效的语法。手头的编程语言总是相关,因为它们都有不同的规则、怪癖和陷阱。
标签: algorithm