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

    这个程序是从英文版维基百科的链接中看到的。

    代码来自PollardRho.java

    程序如下:

    /******************************************************************************
     *  Compilation:  javac PollardRho.java
     *  Execution:    java PollardRho N
     *  
     *  Factor N using the Pollard-Rho method.
     *
     *  % java PollardRho 44343535354351600000003434353
     *  149
     *  329569479697
     *  903019357561501
     *
     ******************************************************************************/
    
    import java.math.BigInteger;
    import java.security.SecureRandom;
        
    
    class PollardRho {
        private final static BigInteger ZERO = new BigInteger("0");
        private final static BigInteger ONE  = new BigInteger("1");
        private final static BigInteger TWO  = new BigInteger("2");
        private final static SecureRandom random = new SecureRandom();
    
        public static BigInteger rho(BigInteger N) {
            BigInteger divisor;
            BigInteger c  = new BigInteger(N.bitLength(), random);
            BigInteger x  = new BigInteger(N.bitLength(), random);
            BigInteger xx = x;
    
            // check divisibility by 2
            if (N.mod(TWO).compareTo(ZERO) == 0) return TWO;
    
            do {
                x  =  x.multiply(x).mod(N).add(c).mod(N);
                xx = xx.multiply(xx).mod(N).add(c).mod(N);
                xx = xx.multiply(xx).mod(N).add(c).mod(N);
                divisor = x.subtract(xx).gcd(N);
            } while((divisor.compareTo(ONE)) == 0);
    
            return divisor;
        }
    
        public static void factor(BigInteger N) {
            if (N.compareTo(ONE) == 0) return;
            if (N.isProbablePrime(20)) { System.out.println(N); return; }
            BigInteger divisor = rho(N);
            factor(divisor);
            factor(N.divide(divisor));
        }
    
     
        public static void main(String[] args) {
            BigInteger N = new BigInteger(args[0]);
            factor(N);
        }
    }


  • 相关阅读:
    挑战程序设计竞赛 dp
    算法导论 动态规划
    算法导论第二章
    divide conquer
    时间戳
    bootstrap 针对超小屏幕和中等屏幕设备定义的不同的类
    jQuery中的Ajax
    怎么判断一个变量是Null还是undefined
    认识Ajax
    关于apache
  • 原文地址:https://www.cnblogs.com/tigerisland/p/7564851.html
Copyright © 2011-2022 走看看