快速找出N以內的所有素數解法,python版本。這個應該是最快的了


作者:Raffeale/於大偉

質數又稱素數。指在一個大於1的自然數中,除了1和此整數自身外,不能被其他自然數整除的數。

一般正常人的解法是兩次循環,假設求小於N的所有素數。一次用N-1之間的所有數去除,如果能被整除這個數肯定不是素數。否則是素數。

這個解題的基本思路:

一個數是否是素數其實不需要去除所有N-1的數,在一個群里有人提出一種方法,只要處以N/2之間的所有數字就可以。經過仔細思考,我發現有更快的方法。只要除以這個數的平方根+1之間的所有的即可。這是為什么?聽我慢慢道來。

 

鑒定x是否為素數,最常用的做飯是個從2開始除,一直除到x-1.那么每當用X/n 的時候,N的值依次為[2,3,4,5,6,7,8,9......x-1] .當我們使用X除以2的時候,如果不能整除,說明了x肯定不能被 X/(X/2)整除,並且X不能被小於x/2的值整除。其實就是小學的數學思想,

例如: 10/5 =2  和 10/2=5的性質是一樣的。

那么推理證明 X每當除以一個數的時候,N的范圍都在縮小。例如,X/2 后 n的范圍應該是 x/2-1  ,x/3后N的范圍應該x/3-1,說到這里應該明白了吧。

?那也就是說只要一個數不可以被X/10之內所有的數整除的話就說明這個數是素數。這個算法比那個人提出的要快N倍。經過測試在1000000中找出所有的素數,使用python花費25秒鍾左右。估計pypy會非常快。

def primesqrt(n):

    result = list()

    result.append(2)

    result.append(3)

    for i in xrange(5,n+1,2):

        for j in xrange(2,int(sqrt(i))+2):

        #for j in range(2,(i>>4)+1):

            if i%j == 0:

                break

        else:

            result.append(i)

    

    return result


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM