编程语言
首页 > 编程语言> > python-此过程的逻辑是什么

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