【问题标题】:Why doesn't my Fermat's primality test method work?为什么我的费马素数检验方法不起作用?
【发布时间】:2019-01-04 17:48:57
【问题描述】:

我正在尝试实现一种方法,该方法检查任何整数,如果它是素数,则使用费马的素数测试返回 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;
}

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

【问题讨论】:

  • “但是,对于某些素数,它会失败”......例如......?
  • 它适用于 3,5,7,但不适用于 19,即
  • 鉴于素数根据定义是整数,为什么你的函数需要双精度数?
  • 我试过 int 还是不行。我只是把它改成双倍,因为我认为这是一个 math.pow 问题
  • 我认为这是一个合乎逻辑的问题......你不“做费马测试”你聚合它们! ...而且它似乎没有按预期的方式工作

标签: java primes


【解决方案1】:

Math.pow 适用于双精度数,结果只是近似值。另一方面,模数适用于范围高达 20 亿多一点的整数,你的 pow 是否会产生比这更大的数字? (17^18 似乎是 19 的可靠赌注……)

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

【讨论】:

    猜你喜欢
    • 2020-09-25
    • 1970-01-01
    • 2013-03-03
    • 2011-04-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多