Algorithm 大数的因式分解

Algorithm 大数的因式分解,algorithm,rsa,factorization,Algorithm,Rsa,Factorization,在课堂上,我们发现了这个编程问题,目前,我们不知道如何解决它 给出了正整数n。大家都知道,n=p*q,其中p和q是素数,p对于你在这里所说的大小的数字,最快的分解方法是(可能)使用埃拉托斯烯的筛子来生成近似于数字平方根的素数,然后用这些素数进行除法来找出哪一个是除数 对于更大的数字,已经发明了很多分解方法。你可能想在谷歌上搜索“费马分解法”、“波拉德罗法”、“布伦特法”、“伦斯特拉椭圆曲线”、“多重多项式二次筛法”和“一般数域筛法”。我已经(粗略地)按照复杂性和计算更大数字的能力的升序列出了它们

在课堂上,我们发现了这个编程问题,目前,我们不知道如何解决它


给出了正整数
n
。大家都知道,
n=p*q
,其中
p
q
是素数,
p对于你在这里所说的大小的数字,最快的分解方法是(可能)使用埃拉托斯烯的筛子来生成近似于数字平方根的素数,然后用这些素数进行除法来找出哪一个是除数

对于更大的数字,已经发明了很多分解方法。你可能想在谷歌上搜索“费马分解法”、“波拉德罗法”、“布伦特法”、“伦斯特拉椭圆曲线”、“多重多项式二次筛法”和“一般数域筛法”。我已经(粗略地)按照复杂性和计算更大数字的能力的升序列出了它们。我是否应该提到通用数字域筛选还有待商榷虽然它是目前已知的分解超大数字最有效的方法,但它只在真正的大型机器上有用低于大约110位数字时,MPQ更快,但在GNFS更快的地方分解大数,您需要的内存比典型的台式机或服务器所能支持的要多得多(可以将一TB的RAM作为最小起点,但可能不止如此)。

我使用该方法计算大整数的系数。这是已知的最有效的算法之一。如果你想了解算法是如何工作的,那么你有很多阅读要做,但是如果你想利用它来做你的研究,有些人已经实现了它。例如,您可以获得以下开源软件包:C/C++或Python

$ python
>>> import math
>>> import pyecm
>>> n = 1000730021
>>> list(pyecm.factors(n, False, False, 2 * math.log(math.log(n)), 1.0))
[10007, 100003]

对于每个
a
,使用

-10^5<=a<=10^5` 

是正方形。

n=p*q和| q-k*p |您可以使用基于GUI的YAFU版本来尝试更大的示例。YAFU的主要优点是它的自适应特性,即在分解时自动切换算法。使用适用于Windows 7/8/10的GUI版本确实是最好、更简单的

只需单击红色心形环绕的黄色圆周率符号:)


Hmmm。。。。也许可以将此移到www.solvemyproblemoverflow.com提示:q≈kp,so n=pq≈kp²。换句话说,p≈√(无)。打开“门”≈" 输入格式是什么?这听起来像是projecteuler.net的问题。+1很好!所以,检查一下Δ=a^2+4*k*n
是否为正方形会使速度更快。
$ python
>>> import math
>>> import pyecm
>>> n = 1000730021
>>> list(pyecm.factors(n, False, False, 2 * math.log(math.log(n)), 1.0))
[10007, 100003]
n = p * q 
|q-k*p|<10^5
q-k*p=a 
-10^5<=a<=10^5
q^2-a*q-k*n=0
-10^5<=a<=10^5` 
a^2+4*k*n
[(sqrt(k*n+2500000000)-50000)/k,(sqrt(k*n+2500000000)+50000)/k]
[sqrt(k*n+2500000000)-50000,sqrt(k*n+2500000000)+50000]