抱歉,您的浏览器无法访问本站

本页面需要浏览器支持(启用)JavaScript


了解详情 >

要开学了 qaq,看起来不能再鸽下去了,来水一篇。

考虑到自己 too naive,感觉之前不是很会 Pollard Rho,就只好重新拿起算导看了一遍。看完发现自己果然菜。

首先是一个叫生日悖论的东西。这玩意儿好像每一篇将 Pollard Rho 的文章都会有所提及。假设一年有 nn 天,期望有多少个人才能使有两个人生日相同。

答案当然是 O(n)\mathcal{O}(\sqrt{n}) 的了,其实说实在的,初看还是挺反直觉的,但仔细推一下就发现确实是这样。因为假设有 kk 个人,就有 (k2)\binom{k}{2} 对比较关系嘛,而我们可以近似的认为每对关系是独立的,即相等的概率是 1n\frac{1}{n},也就是期望相等的个数约为 (k2)1n\binom{k}{2}\frac{1}{n},要使其大于等于 11,可以解得 kk 是 O(n)\mathcal{O}(\sqrt{n}) 的。

然后就是 rho 算法了,他解决的是一个质因子分解的问题。

一个 naive 的想法,就是就与一个数 nn,先判断他是不是质数,如果是的话,其分解就是自己了,否则每次随机一个数 xx,看看是不是 nn 的质因子,如果是的话,就递归 nx\frac{n}{x} 和 xx。然而这个复杂度显然是不对的。

而根据生日悖论,我们有会有一个想法,那就是多随机几个数,两两作差,每个都与 nn 取一下 gcd 来看一看是不是等于 11,但这样的复杂度显然和前面的算法一样。

我们考虑构造函数 fn(x)=(x2+c) mod nf_{n}(x)=(x^2+c)\bmod n,cc 是事先选择的一个数。首先我们需要知道一点的是,在本文中,我们认为 fn(x)f_{n}(x) 是在 [0,n][0,n] 下的一个随机函数,而事实可能并不是这样。

我们考虑构造一个序列 {a}\{a\},a1a_{1} 是一个预先给出的随机数,ai=fn(ai−1)a_{i}=f_{n}(a_{i-1}),不难发现,这个 {a}\{a\} 序列是一个 ρ\rho 字形:

然后我们考虑,加入 pp 是 nn 的一个约数,对于一个长度 ℓ\ell,对于任意的 x,yx,y,我们发现:

fn(x+ℓ)−fn(x)≡fn(y+ℓ)−fn(y)(modp)f_{n}(x+\ell)-f_{n}(x)\equiv f_{n}(y+\ell)-f_{n}(y)\pmod p

那么也就是说,如果我们试了 <x,x+ℓ>\left<x,x+\ell\right>,那就不需要试 <y,y+ℓ>\left<y,y+\ell\right>,因为如果 fn(x+ℓ)−fn(x)f_{n}(x+\ell)-f_{n}(x) 不是 pp 的倍数,那 fn(y+ℓ)−fn(y)f_{n}(y+\ell)-f_{n}(y) 肯定也不是 pp 的倍数。

评论