我尝试实施莱曼测试,但它第一次没有工作。我按照每个人的描述
无论我怎么做,它都无法奏效。我甚至尝试过编码
p = 7; //definitely a prime number
double e = (p - 1 )/2;
int f = (int)pow(3, e) % p;
cout << f <<endl;
和f最终为6
任何帮助将不胜感激
答案 0 :(得分:5)
通过计算f
,您已完成第1步,但您将省略第2步和第3步。
p = 7; //definitely a prime number
double e = (p - 1 )/2;
int f = (int)pow(3, e) % p;
// Step 2
if(f % p != 1 && f % p != p - 1)
cout << p << " is definitely not prime." << endl;
else // If not step 2, then step 3
cout << p << " has 50% probability of being prime." << endl;
运算符%
是mod运算符。它减少左数字mod正确的数字。与10 % 8
一样2
。重要的是要注意,当左数是正数时,结果总是正数。因此,如果a = b - 1
,a % b
为a
,也就是说a = -1 mod b
,则为a % b == a
。
英语中的f % p != 1 && f % p != p - 1
条件为(f % p not equal 1) AND (f % p not equal p - 1)
一个问题是大p
会溢出。
如果您想避免使用bignum库,可以像这样定义自己的pow:
unsigned int my_pow(unsigned int base, unsigned int expon, unsigned int mod){
unsigned int result = base;
for(int i = 1;i < expon;i++)
result = (result * base) % mod;
return result
}
你会像int f = pow(3, e, p);
一样使用它。我不确定当它会溢出时如何约束,但它会比正常pow
大很多。
答案 1 :(得分:1)
f最终为6因为6等于-1 mod 7,希望它有所帮助。