整数分解
关于整数分解算法学习记录
参考连接:https://en.wikipedia.org/wiki/Integer_factorization
1. 试除法
该方法思路是将每个数都尝试作为整数的因子去寻找,速度慢,没有什么可说的
2. Wheel factorization
基于剔除素数的倍数,筛选出素数后进行试除。
优化方法:1.埃拉托色尼筛 2.欧拉筛法
3. Pollard’s rho algorithm
参考连接:
[http://jayxv.github.io/2019/11/11/密码学学习笔记之浅析Pollard’s rho algorithm及其应用/](https://jayxv.github.io/2019/11/11/密码学学习笔记之浅析Pollard’s rho algorithm及其应用/)
原理有兴趣可以研究一下我写的另一篇博客《algorithm算法原理证明》
算法的核心思想是通过随机选择一个起始点和一个随机的多项式来寻找两个非平凡的因子。在每一步迭代中,算法计算多项式的值,并使用 Floyd 的环检测算法(Floyd’s cycle-finding algorithm)来寻找环。如果环的长度为偶数,则找到了一个非平凡的因子,否则,算法会继续尝试其他的起始点和多项式,直到找到两个因子为止。
该算法的具体实现如下:
-
选择一个起点x0,然后根据一个递推公式生成一系列数列:
$$
x_i = f(x_{i-1})
$$
其中f是一个特定的函数。在Pollard’s ρ算法中,函数f通常是下面这个式子:
$$
f(x) = x^2 + c \pmod n
$$
其中c是一个随机数,n是需要分解的大整数。 -
然后在数列中选择两个不同的位置i和j(i!=j)。
-
对这两个位置的元素进行求差运算,即:
$$
d = gcd(|xi - xj|, n)
$$
如果d不等于1或者n,则说明已经找到了n的一个因子,结束算法。 -
如果没有找到因子,则继续执行步骤1,生成新的数列,直到找到一个因子为止。
Pollard’s ρ算法是一种随机算法,因此其运行时间取决于随机数的选择。在实际应用中,该算法的平均时间复杂度约为O(sqrt(n))。
1 | def gcd(a, b): |
4.Euler’s factorization method
1 | import math |
5. Lenstra elliptic-curve factorization算法
1 | import numpy as np |