ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

python-此过程的逻辑是什么

2019-10-12 21:55:23  阅读:236  来源: 互联网

标签:python-3-4 python while-loop math mathematical-optimization


我当时正在处理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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有