Java数学不返回预期值

时间:2016-01-28 05:58:27

标签: java math random integer modulo

根据https://en.wikipedia.org/wiki/Lucas_primality_test,如果^(n-1)不等于1 mod n,则该数字是复合数。我们知道,3是素数而9是素数。我的Java技能已经过时了,我可能会忘记一些非常简单的事情。请记住,这只是测试的开始,而不是测试的完整实现。下面的示例代码对两个数字都返回false,而只有9应返回false。

import java.util.Random;
import java.util.Scanner;

public class LucasTest
{
    private static int n;
    private static boolean primeResult;

    public static int randInt(int min, int max) {
        Random rand = new Random();
        int randomNum = rand.nextInt((max - min) + 1) + min;

        return randomNum;
    }

    public static boolean isPrime(int num)
    {
        int a = randInt(2, num - 1);
        int b = num - 1;
        double c = Math.pow(a,b);

        if (c != (1.0 % num)) {
            return false;
        }

        return true;
    }

    public static void main(String args[])
    {
        System.out.println("Enter an integer:");

        Scanner pNum = new Scanner(System.in);

        n = pNum.nextInt();

        primeResult = isPrime(n);

        System.out.println("Number is likely prime?: " + primeResult);
    }
}

2 个答案:

答案 0 :(得分:0)

问题出在你的isPrime方法的测试中。

更改

if (c != (1.0 % num))

if ((c % num) != 1.0)

你正在做的是先取1.0 mod num,即1,然后检查c是否不等于1(除了num = 1之外它永远不会。)

我们需要做的是计算c mod num,然后检查它是否为1。

我使用此更改测试了您的代码,它正确地将3,7和13标识为素数,并将9和15标识为复合。

注意:该定理中有两个检查,您只实现了第一个。由于这个原因,您可能会随机返回复合数字的真实语句。此外,该定理指出,对于给定的数字, some a必须存在,但并不是每个 a的条件都是正确的,因此即使两个检查都是如此,因为您正在测试随机a,您可以随机将素数识别为复合数。

要完全实现该定理,您必须实现第二个条件,然后检查区间(1,n)中的每个条件。如果两个条件都适用于任何给定的a,则返回true(并且不要检查另一个a),否则返回false。当然,第二个条件更难实现,因为你必须找到(n-1)的素因子。

答案 1 :(得分:0)

您分享的页面中的伪代码说明了。

输入:n> 2,要测试素数的奇数; k,确定测试准确性的参数

输出:如果n是素数,则为素数,否则为复合物或可能为复合物; 确定n-1的素因子。

LOOP1: repeat k times:

  pick a randomly in the range [2, n − 1]

  if a^(n-1) != 1 (mod n) then return composite
  otherwise 
     LOOP2: for all prime factors q of n−1:
        if a^((n-1)/q) != 1 (mod n) 
           if we did not check this equality for all prime factors of n−1 
              then do next LOOP2
           otherwise return prime
        otherwise do next LOOP1
return possibly composite.