電影裡的程式碼之《機械姬》:篩法求質數

pythontab發表於2015-12-18

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

電影裡的程式碼之《機械姬》:篩法求質數

影片裡的程式碼略微有點模糊,我重新打一遍,是下面這個樣子的

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

重點還是前面的兩個函式實現的篩法求質數。首先介紹一下什麼是篩法,篩法相傳是古希臘的埃拉託斯特尼發明的一種檢測素數的演算法。篩法的思路非常簡單,可以用下面的動圖來描述。給定一個範圍,首先用2去篩,把所有2的倍數都篩掉,然後再用3篩,用5篩,不斷重複下去……
電影裡的程式碼之《機械姬》:篩法求質數
再來看程式碼

可以看到,使用篩法求第n個質數的時間複雜度為O(nlog(n)),缺點在需要提前求得篩選的結果,增加了空間複雜度,篩選結果可以用位元位來表示以節省空間。

此外還有一個問題,在求第n個質數的時候,如何要確定第n個質數的大致範圍,以確定篩選結果的布林陣列長度。根據素數定理,可以用來估算某個範圍內的素數個數,可以用公式x/ln(x)來描述,ln表示自然對數,假設要估計10000以內有多少質數,代入公式10000/ln(10000)得到的結果為1085.73,使用上面的篩法得到的10000以為的質數個數為1229,可以看到估計值比實際值略小一點,估計的範圍越大,估計值與實際值的誤差越小。實際使用中可以通過公式計算估計值,然後按一定百分比擴大範圍即可。

相關文章