您的位置:首页 > 编程语言 > Java开发

Java实现的大整数分解Pollard's rho算法程序

2016-05-19 23:45 537 查看
这个程序是从英文版维基百科的链接中看到的。

代码来自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);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: