【问题标题】:Check prime number for large values in java without using built-in functions.在不使用内置函数的情况下检查 java 中的大值的素数。
【发布时间】:2017-12-17 23:00:53
【问题描述】:

我想编写一个 java 程序来检查素数是否有大值。我已经编写了这段代码,但是我的代码中有错误。请帮助我解决这个问题,以便它适用于大值。

另外,我的方法是否适合在没有内置函数的情况下检查大数的素数?

请提供其他可能的解决方案/方法。

我的代码:

import java.math.*;
import java.util.Scanner;
public class CheckPrimeNumber {
    public static void main(String[] args) 
    {
        int flag=0;
        BigInteger input;
        try{
        Scanner sc= new Scanner(System.in);
        System.out.println("Enter a valid positive number: ");
        String strinput=sc.nextLine();
        input = new BigInteger(strinput);

        sc.close();
        if(input.equals(0) ||input.equals(1)){                      
          System.out.println(input+" is not a prime number.");
            }
        else{
            for(BigInteger i=2; i < input.divide(2); i++){  
                if(input.remainder(2) == 0){
                    System.out.println(input+" is not a prime number.");
                    flag=1;
                    break;                      
                    }
                }
                if(flag==0)
                    System.out.println(input +" is a prime number.");               
            }
        }
    catch(Exception e){
        System.out.println("Please enter only valid positive number: ");
        }
    finally{
        System.out.println("Thank you...!!!");      
        }
    }
}

【问题讨论】:

  • 对于大数,使用这样的想法:给定 n,n 是素数,当且仅当它不能被 0 到 sqrt(n) 范围内的任何素数整除时
  • 试除法可能太慢而无法确定大整数的素数。 Miller-Rabin 算法是适合这种情况的一个很好的算法,您可以在 Google 的帮助下或通过查看 my blog 找到它。
  • 您能否发布您在问题中遇到的确切错误?
  • 首先,您应该发布您的错误。您的方法应该是检查 input/2 数字以查看它们是否可以被某些数字整除。这是正确的,但它不是最好的。检查其他主要算法以获得更好的性能。在 for 循环中,您应该检查 input.remainder(i) 而不是 input.remainder(2)。
  • 您正在使用 .equals 来比较 BigInteger 和一个 int,它总是评估为 false,您使用 compareTo 比较两个 BigInteger 值,也让您的问题更清楚。 “我想编写一个 java 程序来检查大值的素数。” ??????

标签: java primes


【解决方案1】:

一种可能的方法:

  1. 检查小素数的整除性,例如 5,000。这会找到简单的。

  2. (可选)以 2 为基数运行单个 Fermat 测试。与 Miller-Rabin 测试相比,这将以更低的成本消除更多的复合材料。

  3. 如果数字尚未标记为复合数字,则重复运行 Miller-Rabin 测试以达到您需要的准确度。如果您运行 64 次测试,那么出错的可能性小于 2^128 中的 1。

您可能还想查看Crandall and Pomerance 的副本,这在这方面非常有用。

【讨论】:

    【解决方案2】:

    在不使用内置函数的情况下检查 java 中的素数是否较大。

        import java.math.*;
        public class Solution {
    
        public static void main(String[] args) {
            String n = "1901971054862837232353308517";
            BigInteger num = new BigInteger(n);
            boolean flag = false;
            if(num.equals(BigInteger.ONE)) {
              System.out.println("not prime");
              return;
            } else if(num.equals(BigInteger.valueOf(2))) {
              System.out.println("prime");
              return;
            } else {
              for(
                BigInteger i = BigInteger.valueOf(2);
                (i.multiply(i)).compareTo(num)!=1;
                i=i.add(BigInteger.ONE)
            ) {
              if((num.mod(i)).equals(BigInteger.ZERO)) {
                System.out.println("not prime");
                flag = true;
                break; 
              }
            }
            if(!flag)
              System.out.println("prime");
            }
        }
    

    更多更好的方法
    使用 BigInteger 类的 isProbablePrime(int certainty) 方法。

        import java.math.*;
        public class Solution {
    
        public static void main(String[] args) {
            String n = "1901971054862837232353308517";
            BigInteger num = new BigInteger(n);
            // let certainty value be 100
            // the probability for getting prime P = (1 – (1/2)^certainty)
            System.out.println(num.isProbablePrime(100));
            }
        }
    

    输出

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-01-11
      • 2017-01-22
      • 1970-01-01
      • 2015-06-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多