OSDN Git Service

style: format markdown files with remark-lint
author24OI-bot <15963390+24OI-bot@users.noreply.github.com>
Tue, 24 Nov 2020 11:58:32 +0000 (06:58 -0500)
committer24OI-bot <15963390+24OI-bot@users.noreply.github.com>
Tue, 24 Nov 2020 11:58:32 +0000 (06:58 -0500)
docs/math/pollard-rho.md

index 8553234..2d203a3 100644 (file)
@@ -1,4 +1,3 @@
-
 ## 问题引入
 
 给定一个正整数 $N \in \mathbb{N}_{+}$ ,试快速找到它的一个因数。
@@ -7,37 +6,36 @@
 
 当 $N\ge10^{18}$ 时,这个算法的运行时间我们是无法接受的,希望有更优秀的算法。一种想法是通过随机的方法,猜测一个数是不是 $N$ 的因数,如果运气好可以在 $O(1)$ 的时间复杂度下求解答案,但是对于 $N\ge10^{18}$ 的数据,成功猜测的概率是 $\frac{1}{10^{18}}$ , 期望猜测的次数是 $10^{18}$ 。如果是在 $[1,\sqrt N]$ 里进行猜测,成功率会大一些。我们希望有方法来优化猜测。
 
-
 ## 朴素算法与 Pollard Rho 算法引入
 
 最简单的算法即为从 $[1,\sqrt N]$ 进行遍历。
 
-``` C++
+```C++
 list<int> breakdown(int N) {
-    list<int> result;
-    for (int i = 2; i * i <= N; i++) {
-        if (N % i == 0) { // 如果 i 能够整除 N,说明 i 为 N 的一个质因子。
-            while (N % i == 0) N /= i;
-            result.push_back(i);
-        }
-    }
-    if (N != 1) { // 说明再经过操作之后 N 留下了一个素数
-        result.push_back(N)
+  list<int> result;
+  for (int i = 2; i * i <= N; i++) {
+    if (N % i == 0) {  // 如果 i 能够整除 N,说明 i 为 N 的一个质因子。
+      while (N % i == 0) N /= i;
+      result.push_back(i);
     }
-    return result;
+  }
+  if (N != 1) {  // 说明再经过操作之后 N 留下了一个素数
+    result.push_back(N)
+  }
+  return result;
 }
 ```
 
 我们能够证明 `result` 中的所有元素均为 `N` 的素因数。
 
 ???+note "证明 `result` 中均为 $N$ 的素因数"
-    首先证明元素均为 $N$ 的素因数:因为当且仅当 `N % i == 0` 满足时,`result` 发生变化:储存 $i$,说明此时 $i$ 能整除 $\frac{N}{A}$,说明了存在一个数 $p$ 使得 $pi=\frac{N}{A}$,即 $piA = N$(其中,$A$ 为 $N$ 自身发生变化后遇到 $i$ 时所除的数。我们注意到 `result` 若在 push $i$ 之前就已经有数了,为 $R_1,\,R_2,\,\ldots,\,R_n$,那么有 `N`$=\frac{N}{R_1^{q_1}\cdot R_2^{q_2}\cdot \cdots \cdot R_n^{q_n}}$,被除的乘积即为 $A$)。所以 $i$ 为 $N$ 的因子。
+    首先证明元素均为 $N$ 的素因数:因为当且仅当 `N % i == 0` 满足时, `result` 发生变化:储存 $i$ ,说明此时 $i$ 能整除 $\frac{N}{A}$ ,说明了存在一个数 $p$ 使得 $pi=\frac{N}{A}$ ,即 $piA = N$ (其中, $A$ 为 $N$ 自身发生变化后遇到 $i$ 时所除的数。我们注意到 `result` 若在 push $i$ 之前就已经有数了,为 $R_1,\,R_2,\,\ldots,\,R_n$ ,那么有 `N`  $=\frac{N}{R_1^{q_1}\cdot R_2^{q_2}\cdot \cdots \cdot R_n^{q_n}}$ ,被除的乘积即为 $A$ )。所以 $i$ 为 $N$ 的因子。
 
     其次证明 `result` 中均为素数。我们假设存在一个在 `result` 中的合数 $K$,并根据整数基本定理,分解为一个素数序列 $K = K_1^{e_1}\cdot K_2^{e_2}\cdot\cdots\cdot  K_3^{e_3}$,而因为 $K_1 < K$ ,所以它一定会在 $K$ 之前被遍历到,并令 `while(N % k1 == 0) N /= k1`,即让 `N` 没有了素因子 $K_1$,故遍历到 $K$ 时,`N` 和 $K$ 已经没有了整除关系了。
 
-值得指出的是,如果开始已经打了一个素数表的话,时间复杂度将从 $O(\sqrt N)$ 下降到 $O(\sqrt{\frac N {\ln N}})$。去[筛法](./sieve.md)处查阅更多打表的信息。
+值得指出的是,如果开始已经打了一个素数表的话,时间复杂度将从 $O(\sqrt N)$ 下降到 $O(\sqrt{\frac N {\ln N}})$ 。去 [筛法](./sieve.md) 处查阅更多打表的信息。
 
-而下面复杂度复杂度更低的 Pollard-Rho 算法是一种用于快速分解非平凡因数的算法(**注意**!非平凡因子不是素因子)。而在此之前需要先引入生日悖论。
+而下面复杂度复杂度更低的 Pollard-Rho 算法是一种用于快速分解非平凡因数的算法( **注意** !非平凡因子不是素因子)。而在此之前需要先引入生日悖论。
 
 ## 生日悖论