日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

js输出100以内的质数_Python 计数质数

發布時間:2024/7/23 python 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 js输出100以内的质数_Python 计数质数 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一個很經典的問題,從 2 到 N ,一共有多少個質數??

一個非常 Naive 的方法,從 2 到 N,判斷每個數是不是質數

只判斷一個數是不是質數,需要

的時間,現在有 N 個數,那么就是

埃拉托斯特尼篩法

這是一種簡單且歷史悠久的篩法,用來找出一定范圍內所有的素數。

來自中文維基百科def get_primes1(n:int) -> list:'''return a list containing all the primes less than n'''if n <= 2:return []isprime = [True for _ in range(n)]result = [2]for i in range(3, n, 2):if isprime[i]:result.append(i)for j in range(i * i, n, 2 * i): # for (int j = i * i; j < n; j += 2 * i)isprime[j] = Falsereturn result

這個算法的高效實現需要注意幾個細節:

第一點,略過所有的偶數!(這也是為什么

從 3 開始取)

第二點,為什么

要從 開始取值(因為 這個合數已經被篩掉了)

第三點,對于任意一個正整數

,有 、 .... 都是合數

此外,還要注意,算法涉及 N (至少 N / 2,存儲上可以略過偶數)個 bool類型的存儲,一般的編程語言bool類型的存儲需要 1 個 byte(8個 bit )。如果對存儲有要求的話,盡量使用 bitmap 這一數據類型(python 沒有內置的 bitmap,Java 有)

總的時間復雜度是

,接近線性時間復雜度。空間復雜度 。

上述python代碼,親測(垃圾 cpu),能在 2s 內輸出一千萬以內的所有質數,能在 20s 的時間內輸出一億以內的所有質數(五百多萬個)

此外,分析一下存儲需要。一億個int32類型(4 個 byte)需要接近400M(大約是380M多一點)的存儲空間,存五百多萬個質數不值一提對吧。那么一億個bool類型,就是 100M。注意一下python的bool類型繼承自int,所以一億個True還是要 400M的。Java 就不一樣哈。

想在python中使用只占用一個 byte 的bool型,參見array標準庫。

所以大致情況就是在個人電腦上用python可以計算1億以內的質數,再大一個數量級就不行了!

計算機存儲單位一般用 bit, byte, KB, MB, GB, TB, PB, EB, ZB, BB 來表示, 我們經常將byte簡稱為B,將KB簡稱問K

那有沒有再快一點的算法???!!!

歐拉篩法

其實思想是類似的,與埃氏篩相比,不會對已經被標記過的合數再進行重復標記,故效率更高。歐拉篩將合數分解為 (最小質因數 * 一個合數) 的形式,通過最小質因數來判斷當前合數是否已經被標記過。

def get_primes2(n: int) -> list:"""return a list containing all prime numbers less than n."""if n <= 2:return []isprime = [True for _ in range(n)]result = [2]for i in range(3, n, 2):if isprime[i]:result.append(i)for j in range(0, len(result)):if i * result[j] >= n:breakisprime[i * result[j]] = Falseif i % result[j] == 0:breakreturn result

時間復雜度被優化到了

參考資料:

https://en.wikipedia.org/wiki/Sieve_of_Eratosthenes?en.wikipedia.org歐拉函數線性篩法詳解_C/C++_Lytning's Blog-CSDN博客?blog.csdn.net

總結

以上是生活随笔為你收集整理的js输出100以内的质数_Python 计数质数的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。