我正在做雷曼兄弟的测试,而以下功能并没有给出100%准确的输出。它表示所有p为素数。我一直在搜索,算法似乎是正确的。请问可能是什么问题?
private static boolean lehmanTest(int p, int tries) {
boolean isPrime = true;
int a = randomGenerator();
int e = (p - 1 )/2;
int result = (a^e) % p;
System.out.println ("Result: " + result);
while (tries!=0)
{
if(result % p != 1 && result % p != p - 1)
{
a = randomGenerator();
tries--;
}
else
{
isPrime = false;
}
}
return isPrime;
修改后的代码
private static boolean lehmanTest(int p, int tries) {
//boolean isPrime = true;
//generate random number a
int a = randomGenerator(p);
int e = (p - 1 )/2;
int result = ((int)Math.pow(a,e)) % p;
while (tries!=0)
{
result = ((int)Math.pow(a,e)) % p;
if(result % p != p - 1)
//if(result % p != 1 && result % p != p - 1)
{
a = randomGenerator(p);
tries--;
}
else
{
return false;
}
}
return true;
}
private static int randomGenerator (int p) {
//generate random numbers a, n times
Random rand = new Random();
int randomInt = rand.nextInt(p);
return randomInt;
}
答案 0 :(得分:4)
你的第一个问题就在这一行:
int result = (a^e) % p;
a ^ e是“xor e”而不是“a eth to eth power”。你需要Math.pow(a,e)或类似的东西。您应该重新阅读算法的描述。
答案 1 :(得分:4)
您的算法应该修复三件事:
int result = (a^e) % p;
更改为:int result = ((int)Math.pow(a,e))
%p; result
作为一组随机选择的数字(现在你只计算一个随机生成的a
)。result % p != p - 1
randomGenerator()
返回的数字小于p
。isPrime=false
更改为:return false
。我还没有检查过你的代码实现这些要点,我认为我在第3点所描述的内容可能存在问题。