实现Pollard Rho算法的Java程序
Pollard 的 rho 算法 是一种整数分解算法。它在拆分具有小因子的合数时特别有效。 Rho 算法最显着的成功是对第 8 个费马数的因式分解:1238926361552897 * 93461639715357977769163558199606896584051237541638188581028 比其他算法的质数因数 2858581028 小得多,因此 p358581028 的素数因数为 288585828。
例子:
Input: n = 315
Output: 3 [OR 3 OR 5 OR 7]
Input: n = 10
Output: 2 [OR 5 ]
方法:
- 该算法将 n 作为其输入。
- 要因式分解的整数 N 和 g(x)。
- x 中的多项式计算模 n。
g(x) = (x^2 + 1) % n
输出要么是 n 的重要因素,要么是失败。
示例:让我们假设 n = 187,y = x = 2 和 c = 1,因此,我们的 g(x) = x^2 + 1。
11是187 的非平凡因子。
下面是一个实现 Pollard Rho 算法的Java程序:
Java
// Java Program to implement Pollard’s Rho Algorithm
import java.io.*;
class GFG {
int n = 315;
// function to return gcd of a and b
public int gcd(int a, int b)
{
// initialise gcd = 0
int gcd = 0;
for (int i = 1; i <= a || i <= b; i++) {
if (a % i == 0 && b % i == 0) {
gcd = i;
}
}
return gcd;
}
/* Function to calculate (base^exponent)%modulus */
int g(int x, int n) { return ((x * x) - 1) % n; }
public static void main(String args[])
{
GFG gfg = new GFG();
int n = 315;
int x = 2, y = 2, d = 1;
while (d == 1) {
// Tortoise Move
x = gfg.g(x, n);
// Hare Move:
y = gfg.g(gfg.g(y, n), n);
/* check gcd of |x-y| and n */
d = gfg.gcd((x - y), gfg.n);
}
// if the algorithm fails to find prime factor
if (d == gfg.n) {
System.out.println(
"GCD cannot be found for this element");
}
else {
System.out.println("One of the prime factor of "
+ n + " is " + d);
}
}
}
输出
One of the prime factor of 315 is 5
时间复杂度: O(sqrt(n))