说这个东西之前介绍一下生日悖论:
若一年有 天,屋里有约 个人,那么他们中有两个人生日相同的概率就会达到 。
证明一下:
若房间中有 个人,那么他们生日两两不同的概率为:
P=\prod_{i=1}^m(1-\frac{i-1}{n})$$。 由不等式 $1+x\leq e^{x}$ 得 $$P\leq\prod_{i=1}^me^{-\frac{i-1}{n}}=e^{\frac{-m(m-1)}{2n}}
故生日有相同的概率
然后试图用Q表示m。
当我们取 时,。反正是于是证明了上面的定理。
关于用到的那个用来放缩的不等式,可以通过导数方法易证。
然后进入正题。
Pollard_Rho算法是快速质因数分解的一个算法。流程如下:
当要对 质因数分解时,先用 Miller_Rabin判断是否是素数,如果是则返回本身。
否则,随机一个函数 (在模 意义下),设置两个变量 ,最初 。每次让 。一直迭代到 。
若此时 为 ,则重新随机一个函数重复上述过程,否则找到了 的一个因子,递归做上述过程。
这个算法复杂度是 的,已经非常快了。
下面证明一下这个算法找到 的一个约数的复杂度是 。
考虑 的一个最小素数 ,我们设 。当 时 与 一定有公约数 。
因为每一个值 都有 做它的后继,我们可以把这些关系看作一张图,每次 在上面走一步, 走两步。
当 与之前某一次的 相等时,就相当于它进环了,接下来就会一直在环上绕了。然后因为 和 在同一个环上绕, 每次比 多走一步,于是最多走环长步就会相遇了。
根据上面的生日悖论,期望根号次就会进环,环长也最多是根号的,所以 和 期望 次就会相等。因为 ,所以一次复杂度为 。根据上面也能看出来,最后 的情况发生概率是非常小的,这等价于在模 的每一个质因子的剩余系中恰好同时 ,这样的概率实在很小。
代码脑补吧。