python-此过程的逻辑是什么
作者:互联网
我当时正在处理Project Euler的问题;我在SO中找到了question问题和公认的答案说;
n = 600851475143
i = 2
while i * i < n:
while n%i == 0:
n = n / i
i = i + 1
print (n)
太棒了我仍然不明白这个过程有多快,可以在0.00001秒内找到6000亿的最大素因.我为此尝试了大量的方法和代码,过程耗时超过1个小时.
谁能解释这个代码的逻辑,以及为什么它超快? while循环在Python中有特殊的位置吗?
解决方法:
fundamental theorem of arithmetic指出,每个大于1的整数都可以表示为质数的乘积.例如,数字2100可以这样表示:
2 x 2 x 3 x 5 x 5 x 7
我已经安排好了,因此最大的素因数在右边,在这种情况下为7.此算法的作用是从2开始除以n(即“去除”该因数),直到不再有要去除的(模数)为止. 0步会在除法之前检查其是否完全可整除.)
因此,按照代码,我们将有i = 2和n = 2100,或者
2 x 2 x 3 x 5 x 5 x 7
2100被2(2100%2 == 0)整除,也是因为我们在上面的分解中看到2.因此将其除以2得到1050,或者
2 x 3 x 5 x 5 x 7
继续除以2,得到的数字不再是2的整数,即525,或者
3 x 5 x 5 x 7
然后我们将i增加到3并继续.看看到最后我们将如何获得最高质数因子?
第一个while循环的原因是i * i< n(实际上应该是i * i< = n)是因为
if one divisor or factor of a number (other than a perfect square) is greater than its square root, then the other factor will be less than its square root. Hence all multiples of primes greater than the square root of n need not be considered.
来自:http://britton.disted.camosun.bc.ca/jberatosthenes.htm
因此,如果i大于n的平方根,则意味着所有剩余因子在n的平方根之下都具有一个已经找到的“对”. i * i< = n所使用的检查是等效的,但比平方根计算快. 之所以如此之快而其他蛮力方法之所以如此之慢,是因为这是在每个步骤中对数字进行除法,从而成倍地减少了需要执行的步骤. 看到这一点,素数分解为600851475143是 71 x 839 x 1471 x 6857 并且如果您将代码修改为以下内容:
n = 600851475143
i = 2
while i * i <= n:
while n%i == 0:
print "Dividing by %d" % i
n = n / i
i = i + 1
if n > 1:
print n
你会看到的:
>>>
Dividing by 71
Dividing by 839
Dividing by 1471
6857
向您显示这正是它的工作方式.
标签:python-3-4,python,while-loop,math,mathematical-optimization 来源: https://codeday.me/bug/20191012/1903577.html