Pollard rho整数分解

时间:2010-02-21 11:09:48

标签: java c++ c math factorization

我正在尝试用C / C ++实现Pollard Rho整数分解.Google给了我一个问题here的Java实现。

我不太了解Java,所以我想出了this。我在C ++中的实现适用于大多数情况但不是很少像我在那里使用的“9999”。

我知道C ++没有Biginteger类,所以我不能拥有它在JAVA中提供的全部功能,但是我想要将15位数字分解为unsigned long long

请指出我的实施中有什么问题。

2 个答案:

答案 0 :(得分:9)

问题就在这里:

#define abs(x) (x>0)?(x):(-x)

您在abs宏中遗漏了一些括号。尝试:

#define abs(x) ((x)>0 ? (x) : -(x))

代替。 (考虑在案例abs(x-xx)中展开x-xx <= 0时会发生什么。)

另外,为什么你的gcd函数返回一个int而不是一个BigInteger?

您还应该知道(假设无符号long long是64位整数类型),此代码将无法正常N大于2**32:if x(或xx)大于或等于2**32,然后x*x会以模2**64换算,为x*x % N提供错误的值。

答案 1 :(得分:2)

我发现了一个区别:Java代码将cx分配为new BigInteger(N.bitLength(), random),而C ++代码使用rand() % N,这是一个较小的随机范围。对于值9999,二进制文件为10011100001111,因此Java代码将为cx提供最大值16383。