📜  实现Pollard Rho算法的Java程序

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

实现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 ]

方法:

  1. 该算法将 n 作为其输入。
  2. 要因式分解的整数 N 和 g(x)。
  3. x 中的多项式计算模 n。
    g(x) = (x^2 + 1) % n
    输出要么是 n 的重要因素,要么是失败。

示例:让我们假设 n = 187,y = x = 2 和 c = 1,因此,我们的 g(x) = x^2 + 1。

11187 的非平凡因子。

下面是一个实现 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))