莱曼素性测试

时间:2014-11-16 23:33:32

标签: java primes

我正在做雷曼兄弟的测试,而以下功能并没有给出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;       
    }

2 个答案:

答案 0 :(得分:4)

你的第一个问题就在这一行:

    int result = (a^e) % p;

a ^ e是“xor e”而不是“a eth to eth power”。你需要Math.pow(a,e)或类似的东西。您应该重新阅读算法的描述。

答案 1 :(得分:4)

您的算法应该修复三件事:

  1. int result = (a^e) % p;更改为:int result = ((int)Math.pow(a,e))%p;
  2. 计算现在result作为一组随机选择的数字(现在你只计算一个随机生成的a)。
  3. 检查此条件是否正确:result % p != p - 1
  4. 确保randomGenerator()返回的数字小于p
  5. isPrime=false更改为:return false
  6. 我还没有检查过你的代码实现这些要点,我认为我在第3点所描述的内容可能存在问题。