【发布时间】:2018-01-10 21:58:55
【问题描述】:
我正在尝试根据我在 Wikipedia 上找到的伪代码来实现 Pollard Rho,但它似乎不适用于数字 4、8 和 25,我不知道为什么。
这是我的代码:
long long x = initXY;
long long y = initXY;
long long d = 1;
while (d == 1) {
x = polynomialModN(x, n);
y = polynomialModN(polynomialModN(y, n), n);
d = gcd(labs(x - y), n);
}
if (d == n)
return getFactor(n, initXY + 1);
return d;
这是我的多项式函数:
long long polynomialModN(long long x, long long n) {
return (x * x + 1) % n;
}
这是来自维基百科的示例伪代码:
x ← 2; y ← 2; d ← 1
while d = 1:
x ← g(x)
y ← g(g(y))
d ← gcd(|x - y|, n)
if d = n:
return failure
else:
return d
唯一的区别:我不返回失败,而是尝试不同的初始化变量,正如维基百科也指出的那样:
这里 x 和 y 对应于 x i {\displaystyle x_{i}} x_{i} 和 x j {\displaystyle x_{j}} x_{j} 在关于核心思想的部分。注意 即使当 n 为 合成的。在这种情况下,可以再次尝试该方法,使用 起始值不是 2 或不同的 g ( x ) {\displaystyle g(x)} g(x)。
Pollard-Rho 是否不适用于某些数字?他们的特点是什么?还是我做错了什么?
【问题讨论】:
-
要查看它为什么不起作用,只需打印出多项式函数的结果。当
n为4时,输出总是在循环1,2,1,2,1,2结束。当n为8时,循环为2,5,2,5,2,5,当n为25时,循环为1,2,5,1,2,5,1,2,5。所以你可以看到,除非你很幸运并在循环开始之前找到答案(这不会发生),否则这些方法是行不通的。 -
好吧,但为什么理论上不起作用,还有哪些更大的数字(如果有)不起作用?
-
引用维基百科条目,“所以序列 { x k mod p } {\displaystyle \{x_{k}{\bmod {p}}\}} {\displaystyle \{x_{k }{\bmod {p}}\}} 可能会比序列 { x k } {\displaystyle \{x_{k}\}} {\displaystyle \{x_{k}\}} 更早地重复。”注意“可能”这个词。这是基于概率的,假设多项式函数的作用类似于对因子的随机映射 - 这不是保证。我会尝试一些不同的二次方,也许是三次方或二次方,看看这些是否适用于您目前使用的多项式未考虑的数字。