在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 测试后生成输出。无论给定的数是质数还是合数,我们都会输出结果。