電影裏的代碼之《機械姬》:篩法求質數

今天看了《機械姬》,探討人工智能話題的電影,豆瓣評分7.5,仍是蠻不錯的一部電影。影片1:09:29處出現了一段python代碼,細看了一下,發現是篩法求質數的python代碼,寫得很是簡練的。先貼個電影的截圖:python

clipboard.png

影片裏的代碼略微有點模糊,我從新打一遍,是下面這個樣子的算法

#coding:utf8
import sys

def sieve(n):
    #compute primes using sieve eratosthenes
    x = [1] * n
    x[1] = 0

    for i in range(2,n/2):
        j = 2 * i
        while j < n:
            x[j] = 0
            j = j + i
    return x

def prime(n,x):
    #Find nth prime
    i = 1
    j = 1
    while j <= n:
        if x[i] == 1:
            j = j + 1
        i = i + 1
    return i-1

x = sieve(10000)

code = [1206,301,384,5]
key = [1,1,2,2]

sys.stdout.write("".join(chr(i) for i in [73,83,66,78,32,61,22]))

for i in range(0,4):
    sys.stdout.write(str(prime(code[i],x)-key[i]))

代碼的最後打印出來下面這個很奇怪的東西,目測是一本書的ISBN,上豆瓣查了一下,是Embodiment and the Inner Life,是關於思惟、意識的內容的,和本片的主題息息相關。數組

ISBN =9780199226559[Finished in 0.1s]

重點仍是前面的兩個函數實現的篩法求質數。首先介紹一下什麼是篩法,篩法相傳是古希臘的埃拉託斯特尼發明的一種檢測素數的算法。篩法的思路很是簡單,能夠用下面的動圖來描述。給定一個範圍,首先用2去篩,把全部2的倍數都篩掉,而後再用3篩,用5篩,不斷重複下去......
clipboard.png
再來看代碼函數

def sieve(n):             //對n之內的數進行篩選,返回一個長度爲n的布爾數組
    #compute primes using sieve eratosthenes
    x = [1] * n         //定義長度爲n的布爾數組(實際上電影裏用1和0來表示true和false了)
    x[1] = 0            //1既不是素數也不是合數,設爲0

    for i in range(2,n/2)://i從2開始一直到n/2
        j = 2 * i    //j從2倍i開始
        while j < n:
            x[j] = 0  //把全部i的倍數篩除
            j = j + i //下一個i的倍數
    return x          //返回數組

def prime(n,x):   //求第n個素數,只須要在篩選好的布爾數組中找第n個標記爲1的數就能夠了
    #Find nth prime
    i = 1    //初始化爲1
    j = 1
    while j <= n:   //在布爾數組中尋找第n個標記爲1的數
        if x[i] == 1:
            j = j + 1
        i = i + 1
    return i-1    //前面循環中i多加了一次,返回時須要減1

能夠看到,使用篩法求第n個質數的時間複雜度爲O(nlog(n)),缺點在須要提早求得篩選的結果,增長了空間複雜度,篩選結果能夠用比特位來表示以節省空間。人工智能

此外還有一個問題,在求第n個質數的時候,如何要肯定第n個質數的大體範圍,以肯定篩選結果的布爾數組長度。根據素數定理,能夠用來估算某個範圍內的素數個數,能夠用公式x/ln(x)來描述,ln表示天然對數,假設要估計10000之內有多少質數,代入公式10000/ln(10000)獲得的結果爲1085.73,使用上面的篩法獲得的10000覺得的質數個數爲1229,能夠看到估計值比實際值略小一點,估計的範圍越大,估計值與實際值的偏差越小。實際使用中能夠經過公式計算估計值,而後按必定百分比擴大範圍便可。spa

相關文章
相關標籤/搜索