zoukankan      html  css  js  c++  java
  • C++实现的大整数分解Pollard's rho算法程序

    代码来自GeeksforGeeksPollard’s Rho Algorithm for Prime Factorization

    C++语言程序代码如下:

    /* C++ program to find a prime factor of composite using
       Pollard's Rho algorithm */
    #include<bits/stdc++.h>
    using namespace std;
     
    /* Function to calculate (base^exponent)%modulus */
    long long int modular_pow(long long int base, int exponent,
                              long long int modulus)
    {
        /* initialize result */
        long long int result = 1;
     
        while (exponent > 0)
        {
            /* if y is odd, multiply base with result */
            if (exponent & 1)
                result = (result * base) % modulus;
     
            /* exponent = exponent/2 */
            exponent = exponent >> 1;
     
            /* base = base * base */
            base = (base * base) % modulus;
        }
        return result;
    }
     
    /* method to return prime divisor for n */
    long long int PollardRho(long long int n)
    {
        /* initialize random seed */
        srand (time(NULL));
     
        /* no prime divisor for 1 */
        if (n==1) return n;
     
        /* even number means one of the divisors is 2 */
        if (n % 2 == 0) return 2;
     
        /* we will pick from the range [2, N) */
        long long int x = (rand()%(n-2))+2;
        long long int y = x;
     
        /* the constant in f(x).
         * Algorithm can be re-run with a different c
         * if it throws failure for a composite. */
        long long int c = (rand()%(n-1))+1;
     
        /* Initialize candidate divisor (or result) */
        long long int d = 1;  
     
        /* until the prime factor isn't obtained.
           If n is prime, return n */
        while (d==1)
        {
            /* Tortoise Move: x(i+1) = f(x(i)) */
            x = (modular_pow(x, 2, n) + c + n)%n;
     
            /* Hare Move: y(i+1) = f(f(y(i))) */
            y = (modular_pow(y, 2, n) + c + n)%n;
            y = (modular_pow(y, 2, n) + c + n)%n;
     
            /* check gcd of |x-y| and n */
            d = __gcd(abs(x-y), n);
     
            /* retry if the algorithm fails to find prime factor
             * with chosen x and c */
            if (d==n) return PollardRho(n);
        }
     
        return d;
    }
     
    /* driver function */
    int main()
    {
        long long int n = 10967535067;
        printf("One of the divisors for %lld is %lld.",
              n, PollardRho(n));
        return 0;
    }


  • 相关阅读:
    CxfInvokeUtil
    springboot+webservice(cxf和jax-ws两种方式)
    cxf 工具类转载
    Java动态调用Webservice,不生成客户端,基于soapUI
    转载 CXF动态调用webservice
    spring gzip 静态压缩优化
    sql server2008登录出错怎么整
    配置opencv时计算机显示丢失opencv_world300d.dll如何解决
    随记
    多态与异常处理(课后作业)
  • 原文地址:https://www.cnblogs.com/tigerisland/p/7564849.html
Copyright © 2011-2022 走看看