【问题标题】:Java math not returning expected valueJava数学没有返回预期值
【发布时间】:2016-05-05 09:04:18
【问题描述】:

根据https://en.wikipedia.org/wiki/Lucas_primality_test,如果a^(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);
    }
}

【问题讨论】:

  • 您是否在 IDE 调试器中跟踪过代码?
  • 我不确定在这种情况下我是否会信任 Math.pow,而不是实际的整数幂 mod n 方法(您必须自己编写)。
  • Jim 目前正在使用 BlueJ,调试器似乎没有输出任何对我有用的东西。
  • 我不知道你期望 1 mod num 是什么。以及如何在没有任何循环的情况下检查素数?我想你必须再研究一下公式。
  • 是的,意识到那里的错误。凌晨 1 点作品的产物。另外,我之前说过这只是最开始的部分。

标签: java math random integer modulo


【解决方案1】:

你分享的页面中的伪代码说。

输入: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.

【讨论】:

  • 问题已经得到解答,我完全清楚这一点,因为我是以此为基础的。从那以后,我现在已经超越了这一点。不过,谢谢。
【解决方案2】:

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

改变

if (c != (1.0 % num))

if ((c % num) != 1.0)

您所做的是首先取 1.0 mod num,即 1,然后检查 c 是否不等于 1(它永远不会等于 1,除非 num=1)。

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

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

注意:该定理中有两个检查,您只实现了第一个。因此,您可能会随机返回合数的真实陈述。此外,该定理指出,对于给定的数字,some a 必须存在,而不是 every a 的条件都为真,因此即使有两个检查,因为您正在测试一个随机的a,你可以随机识别一个素数为合数。

要完全实现该定理,您必须实现第二个条件,然后检查区间 (1,n) 中的每个 a。如果对于任何给定的 a 两个条件都成立,则返回 true(并且不要费心检查其他 a),否则返回 false。当然,第二个条件更难实现,因为你必须找到 (n-1) 的质因数。

【讨论】:

  • 编辑:您上次的编辑纠正了我的愚蠢错误。非常感谢!
猜你喜欢
  • 2018-01-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-04
  • 1970-01-01
相关资源
最近更新 更多