我的Fermat素数测试方法为何不起作用?

时间:2019-01-04 17:48:58

标签: java primes

我正在尝试实现一种方法,该方法检查任何整数,如果使用Fermat的素数测试是素数,则返回true。

我根据输入是否小于40来划分问题。如果输入小于40,则对每个整数应用测试,直到n-1。否则,如果整数大于40,则对直到40的每个整数应用测试。但是,对于某些素数,测试将失败。

public static boolean isPrime (double n){
    int counter=0;
    boolean isPrime=false;
    if(n<40) {
        for (int a = 2; a < n - 1; a++) {
            if (Math.pow(a, n - 1) % n == 1) counter++;
        }

        if (counter == n - 3) isPrime = true;
    }
        else {

        for (int a = 2; a <= 40; a++) {
            if (Math.pow(a, n - 1) % n == 1) counter++;

        }
        if (counter == 39) isPrime = true;
    }
    return isPrime;
}

这是逻辑问题还是其他问题?

1 个答案:

答案 0 :(得分:2)

Math.pow适用于双打,其结果仅为近似值。另一方面,Modulo适用于范围最大超过20亿的整数,您的战利品产生的数字是否一定比这个数字大? (17 ^ 18似乎是19的肯定下注...)

那么如何解决这个问题: 您可以使用乘法和对整数取模来实现自己的pow(a,b,n)(幂模n)。那应该正常工作。使用一系列乘法,将a乘以b,然后将%n应用于中间结果...