Loading

Pollard-Rho

Pollard-Rho 算法是一种高效的寻找非平凡因子的算法。可以以期望 \(O(n^\frac{1}{4})\) 的时间复杂度算出正整数 \(n\) 的一个非 \(1\),非自身的因子。

朴素的试除法时间复杂度是 \(O(\sqrt{n})\)。

猴子试除

我们嫌弃试除法试得太多,尝试少试一点。可以每次取一个 \([2,n-1]\) 的随机数尝试是否能整除 \(n\)(?)

int find_factor(int n)
{
	if(isprime(n)) return n;
	while(1)
	{
		int x=randint(2,n-1);
		if(n%x==0) return x;
	}
}

这个算法期望时间复杂度为 \(O(n)\),简直是来搞笑的,但这蕴含了一些 Pollard-Rho 的想法。

稍加改进,我们可以得到这个算法:

int find_factor(int n)
{
	if(isprime(n)) return n;
	while(1)
	{
		int x=randint(2,n-1),g=gcd(n,x);
		if(g!=1) return g;
	}
}

这个算法在最坏情况 \(n=p^2\) 下,有 \(p\) 个 \(x\) 的可能值使得 \(\gcd(x,n)>1\)。考虑求 \(\gcd\) 的时间,这个算法的时间复杂度为 \(O(\sqrt{n} \log n)\),依然打不过试除法。

想要改进这个算法,我们需要了解更多的结论。

生日悖论

生日悖论其实并非逻辑悖论,只是不太符合直觉。它描述的事实是:一个房间里有 \(23\) 个人,则他们中有两人生日相同的概率超过 \(\frac{1}{2}\)。证明只需计算验证:

\[1-\frac{365}{365} \times \frac{364}{365} \times \cdots \times \frac{365-22}{365} > \frac{1}{2} \]

生日悖论表明,如果不断在一定范围内均匀地生成随机整数,很快便会生成到重复的数,期望步数在根号级别(相关证明)。

对于原题,在 \(n=p^2\) 的最坏情况下,我们不断生成 \([2,n-1]\) 之间的整数,由于整数模 \(p\) 的结果只有 \(p\) 种,期望约 \(O(\sqrt{p})=O(n^\frac{1}{4})\) 个数之后就能取到两个数 \(u,v\) 满足 \(u \equiv v \pmod p\)。这时 \(\gcd(u,v)\) 就是我们想要的 \(n\) 因数 \(p\)。

然而,每轮随机取一个个数再与前面所有数求 \(\gcd\) 的复杂度仍然是 \(O(\sqrt{n}\log n)\)。考虑优化。

伪随机数序列

智慧的 Pollard 使用一种特殊的伪随机数生成器,即 \(f(x)=x^2+c \mod n\),其中 \(c\) 为常数。

由于模 \(n\) 的余数只有 \(n\) 个,这个随机数生成器会在若干步数后进入循环。根据初值的不同,进入循环可能是若干步之后,而不是第一步就已经在循环内。这样形态的随机数列形如希腊字母 \(\rho\),故该算法得名 Pollard-Rho。

图

posted @ 2026-10-04 15:44  tai_chi  阅读(4)  评论(0)    收藏  举报