📜  在Java执行 Baillie-PSW Primality 测试

📅  最后修改于: 2022-05-13 01:54:52.086000             🧑  作者: Mango

在Java执行 Baillie-PSW Primality 测试

Baillie PSW Primality 测试通常是一种概率素性测试算法,它试图定义给定的数字是合数还是可能的素数,它以 Robert Baillie 的名字命名。这个检验是由 Baillie 和 Wagstaff(1980) 以及 Pomerance(1980 和 1984) 提出的,它基于 Strong Pseudoprimes 和 Lucas Pseudoprimes。一个令人惊叹的事实是 Pomerance 最初宣布,对于发现可以通过此测试的合数的任何人,奖金金额为 30 美元,后来该金额提高到 620 美元。有趣的是,还没有合数通过此测试的例子,截至 2009 年 6 月 13 日,Jeff Gilchrist 宣布不存在高达 10^(17) 的 Baillie-PSW 伪素数。但是,椭圆曲线素性程序PRIMO 使用此测试检查所有中间可能素数,以防万一,如果有任何可能的合数,则此认证将失败并且这从未发生过,并且 PRIMO 程序作者 M. Martin 自信地估计有没有少于大约 10000 位数字的组合可以骗过这个存在的测试。

例子:

Java
// Java Program to implement Baillie - PSW Primality test
// Importing utility classes
import java.util.Scanner;
import java.util.Random;
  
// Class FermatPrimality
public class GFG {
  
    // Method 1
    // To check if prime or not
    public boolean isPrime(long n, int iteration) {
  
        // Base case
        if (n == 0 || n == 1)
            return false;
  
        // Base case 2
        //  is prime
        if (n == 2)
            return true;
  
        // An even number other than 2 is composite
        if (n % 2 == 0)
            return false;
  
        // Creating object of Random class
        Random rand = new Random();
        for (int i = 0; i < iteration; i++) {
  
            // Getting positive valuee using absolute function
            // of Math class
            long r = Math.abs(rand.nextLong());
            long a = r % (n - 1) + 1;
            if (modPow(a, n - 1, n) != 1)
                return false;
        }
        return true;
    }
  
    // Method 2
    // To calculate (a ^ b) % c
    public long modPow(long a, long b, long c) {
  
        // Initially declaring and initializing the long variable
        // to unity
        long res = 1;
        for (int i = 0; i < b; i++) {
            res *= a;
            res %= c;
        }
        return res % c;
    }
    // Method 3
    // Main driver method
    public static void main (String[] args) {
  
        // Creating object of Scanner class to take input from user
        Scanner scan = new Scanner(System.in);
  
        // Display message only
        System.out.println("Fermat Primality Algorithm Test\n");
  
        // Make an object of GFG class
        GFG fp = new GFG();
  
        // Display message only
        System.out.println("Enter number\n");
  
        // Accepting the number using nextLong() method
        long num = scan.nextLong();
  
        // Display message only
        System.out.println("\nEnter number of iterations");
  
        // Accepting number of iterations using nextInt() method
        int k = scan.nextInt();
  
        // Check if prime
        boolean prime = fp.isPrime(num, k);
        if (prime)
            System.out.println("\n" + num + " is prime");
        else
            System.out.println("\n" + num + " is composite");
    }
}


输出:

输出说明:

首先,我们构造一个方法 isPrime() 来查找给定的数字是否为素数。我们创建了一个方法 modPow(),它用于查找模数以计算 isPrime() 方法的逻辑。我们从用户那里获取输入并应用函数isPrime(),作为素性测试的一部分,我们获取迭代次数。我们对数字应用 isPrime() 和 findPow() 方法并给定迭代次数,并在成功进行 Baillie=PSW Primality 测试后生成输出。无论给定的数是质数还是合数,我们都会输出结果。