OSDN Git Service

style: format markdown files with remark-lint
author24OI-bot <15963390+24OI-bot@users.noreply.github.com>
Fri, 6 Nov 2020 14:43:08 +0000 (09:43 -0500)
committer24OI-bot <15963390+24OI-bot@users.noreply.github.com>
Fri, 6 Nov 2020 14:43:08 +0000 (09:43 -0500)
docs/math/pollard-rho.md

index 410cb78..57de987 100644 (file)
@@ -33,13 +33,13 @@ $$
 
 将 $n=365$ 代入,解得 $k=23$ 。所以一个房间中至少 23 人,使其中两个人生日相同的概率达到 $50\%$ , 但这个数学事实十分反直觉,故称之为一个悖论。
 
-当 $k>60$ , $n=365$ 时,出现两个人同一天生日的概率将大于$99\%$ 。那么在一年有$n$天的情况下,当房间中有$\sqrt{n}$个人时,至少有两个人的生日相同。
+当 $k>60$ , $n=365$ 时,出现两个人同一天生日的概率将大于 $99\%$ 。那么在一年有 $n$ 天的情况下,当房间中有 $\sqrt{n}$ 个人时,至少有两个人的生日相同。
 
 考虑一个问题,设置一个数据 $n$ ,在 $[1,1000]$ 里随机选取 $i$ 个数( $i=1$ 时就是它自己),使它们之间有两个数的差值为 $k$ 。当 $i=1$ 时成功的概率是 $\frac{1}{1000}$ ,当 $i=2$ 时成功的概率是 $\frac{1}{500}$ (考虑绝对值, $k_2$ 可以取 $k_1-k$ 或 $k_1+k$ ),随着 $i$ 的增大,这个概率也会增大最后趋向于 1。
 
 ### 构造伪随机函数
 
-我们通过 $f(x)=(x^2+c)\bmod n$ 来生成一个随机数序列$\{x_i\}$,其中 $c=rand()$ ,是一个随机的常数。
+我们通过 $f(x)=(x^2+c)\bmod n$ 来生成一个随机数序列 $\{x_i\}$ ,其中 $c=rand()$ ,是一个随机的常数。
 
 随机取一个 $x_1$ ,令 $x_2=f(x_1),x_3=f(x_2),\dots,x_i=f(x_{i-1})$ ,在一定范围内可以认为这个数列是“随机”的。
 
@@ -51,7 +51,7 @@ $$
 
 可以发现数据在 3 以后都在 11,23,31 之间循环,这也是 $f(x)$ 被称为伪随机函数的原因。
 
-如果将这些数如下图一样排列起来,会发现这个图像酷似一个$\rho$,算法也因此得名rho。
+如果将这些数如下图一样排列起来,会发现这个图像酷似一个 $\rho$ ,算法也因此得名 rho。
 
 ![Pollard-rho1](./images/Pollard-rho1.png)
 
@@ -59,7 +59,7 @@ $$
 
 最大公约数一定是某个数的约数,即 $\forall k \in\mathbb{N}_{+},\gcd(k,n)|n$ ,只要选适当的 $k$ 使得 $1<\gcd(k,n)< n$ ,就可以求得一个约数 $\gcd(k,n)$ 。满足这样条件的 $k$ 不少, $k$ 有若干个质因子,每个质因子及其倍数都是可行的。
 
-将生日悖论应用到随机算法中,伪随机数序列中不同值的数量约为$O(\sqrt{n})$个。设$m$为$n$的最小非平凡因子,显然有$m\leq \sqrt{n}$。记$y_i = x_i \pmod m$,推导可得:
+将生日悖论应用到随机算法中,伪随机数序列中不同值的数量约为 $O(\sqrt{n})$ 个。设 $m$ 为 $n$ 的最小非平凡因子,显然有 $m\leq \sqrt{n}$ 。记 $y_i = x_i \pmod m$ ,推导可得:
 
 $$
 \begin{aligned}
@@ -71,13 +71,13 @@ y_{i+1}&=x_{i+1} \bmod m \\
 \end{aligned}
 $$
 
-于是就得到了一个新序列$\{y_i\}$(当然也可以写作$\{x_i \bmod m\}$),并且根据生日悖论可以得知序列中不同值的个数约为$O(\sqrt{m})\leq O(n^{\frac{1}{4}})$
+于是就得到了一个新序列 $\{y_i\}$ (当然也可以写作 $\{x_i \bmod m\}$ ),并且根据生日悖论可以得知序列中不同值的个数约为 $O(\sqrt{m})\leq O(n^{\frac{1}{4}})$ 
 
-假设存在两个位置$i,j$,使得$x_i\neq x_j\wedge y_i=y_j$,这意味着$n \nmid |x_i−x_j| \wedge m \mid |x_i−x_j|$,因此我们可以通过 $\gcd(n, |x_i-x_j|)$获得$n$的一个非平凡因子。
+假设存在两个位置 $i,j$ ,使得 $x_i\neq x_j\wedge y_i=y_j$ ,这意味着 $n \nmid |x_i−x_j| \wedge m \mid |x_i−x_j|$ , 因此我们可以通过 $\gcd(n, |x_i-x_j|)$ 获得 $n$ 的一个非平凡因子。
 
 ### 时间复杂度分析
 
-我们期望枚举 $O(\sqrt{m})$个$i$来分解出 $n$ 的一个非平凡因子 $\gcd(|x_i−x_j|,n)$ ,因此。 Pollard-rho 算法能够在 $O(\sqrt{m})$的期望时间复杂度内分解出 $n$ 的一个非平凡因子,通过上面的分析可知$O(\sqrt{m})\leq O(n^{\frac{1}{4}})$,那么Pollard-rho 算法的总时间复杂度为$O(n^{\frac{1}{4}})$。下面介绍两种实现算法,两种算法都可以在$O(\sqrt{m}$的时间复杂度内完成。
+我们期望枚举 $O(\sqrt{m})$ 个 $i$ 来分解出 $n$ 的一个非平凡因子 $\gcd(|x_i−x_j|,n)$ ,因此。Pollard-rho 算法能够在 $O(\sqrt{m})$ 的期望时间复杂度内分解出 $n$ 的一个非平凡因子,通过上面的分析可知 $O(\sqrt{m})\leq O(n^{\frac{1}{4}})$ ,那么 Pollard-rho 算法的总时间复杂度为 $O(n^{\frac{1}{4}})$ 。下面介绍两种实现算法,两种算法都可以在 $O(\sqrt{m}$ 的时间复杂度内完成。
 
 ### Floyd 判环
 
@@ -107,7 +107,7 @@ $$
 
 使用 $\gcd$ 求解的时间复杂度为 $O(\log N)$ ,频繁地调用会使算法运行地很慢,可以通过乘法累积来减少求 $\gcd$ 的次数。如果 $1< \gcd(a,b)$ ,则有 $1< \gcd(ac,b)$ , $c\in \mathbb{N}_{+}$ ,并且有 $1< \gcd(ac \bmod b,b)=\gcd(a,b)$ 。
 
-我们每过一段时间将这些差值进行 $\gcd$ 运算,设 $s=\prod|x_0-x_j|\bmod n$ ,如果某一时刻得到 $s=0$ 那么表示分解失败,退出并返回 $n$ 本身。每隔 $2^k-1$ 个数,计算是否满足 $1< \gcd(s, n) < n$ 。此处取$k=7$,可以根据实际情况进行调节。
+我们每过一段时间将这些差值进行 $\gcd$ 运算,设 $s=\prod|x_0-x_j|\bmod n$ ,如果某一时刻得到 $s=0$ 那么表示分解失败,退出并返回 $n$ 本身。每隔 $2^k-1$ 个数,计算是否满足 $1< \gcd(s, n) < n$ 。此处取 $k=7$ ,可以根据实际情况进行调节。
 
 ??? note "参考实现"
     ```c++