我正在尝试用C / C ++实现Pollard Rho整数分解.Google给了我一个问题here的Java实现。
我不太了解Java,所以我想出了this。我在C ++中的实现适用于大多数情况但不是很少像我在那里使用的“9999”。
我知道C ++没有Biginteger类,所以我不能拥有它在JAVA中提供的全部功能,但是我想要将15位数字分解为unsigned long long
请指出我的实施中有什么问题。
答案 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代码将c
和x
分配为new BigInteger(N.bitLength(), random)
,而C ++代码使用rand() % N
,这是一个较小的随机范围。对于值9999,二进制文件为10011100001111,因此Java代码将为c
和x
提供最大值16383。