Python如何判斷一個正整數是否是素數?

2021-01-08 網安時訊

素數(Prime Number),又稱質數,一個大於1的自然數,除了1和它自身外,不能整除其他自然數的數叫做質數;否則,稱為合數(Composite Number)。1既不是素數,也不是合數。

如2、3、5、7、11都是素數,因為找不到除了1和其本身之外的約數;而4、6、8都是合數,因為4可以整除2,6可以整除2和3,8可以整除2和4。

而一個數的約數必然是不超過該數的,加上素數必需是只有1和本身是其約數的條件。於是,我們可以通過枚舉小於該數,並且大於1的整數,來判斷該數是否是素數。

假設有一個正整數a,則其可以被寫成任意兩個正整數之積,即a = p * q。假設p < q,那么正整數p和q都是a的約數。注意到,如果我們知道p是a的約數,那麼可以通過q = a / p快速求得另外一個約數q。同樣的道理,如果某個數p不是a的約數,那麼q也不是a的約數。這就意味著我們在枚舉約數的時候,只需要枚舉2到不大於sqrt(a)的正整數即可。

雖然通過上述方法,已經能讓我們在根號級別的複雜度內,判斷一個正整數是否為素數。但是我們其實還可以做得更快!回到我們最初的起點,我們之所以要枚舉這些數,就是想找出原數的約數。然後除1外,任何一個正整數都能寫成多個素數的乘積的形式,所以我們枚舉特定範圍內的所有素數,也能達到相同的效果,而且數字範圍越大,其區間內素數個數和區間長度之比也將越來越小,大家可以看看下面不同區間內的素數統計結果:

從上圖的統計結果我們可以發現,我們用區間內的素數去判斷一個整數是否素數,比較的次數相較之前來說更少。雖然就單次判斷一個素數來說,這樣的算法可能並沒有優勢,因為還需要時間去求出該區間內的所有素數。但是如果需要判斷的數字很多,那麼先把該區間內的所有素數求出來,無疑是個更好的選擇。

而求不超過某個正整數x內的所有素數,有一個著名的算法——埃拉託斯特尼篩法。其算法描述為:

先用一個數組vis,把不大於該正整數x的所有正整數標記為0,表示沒有訪問;然後從第一個素數2開始遍歷整個區間,如果當前訪問的數沒有訪問過,則可以認為它是一個素數。那麼就將它在該區間內所有的倍數,全部標記為已訪問,這樣就保證外部的循環發現的沒有訪問過的數都是素數。其具體實現如下述代碼所示:

埃拉託斯特尼篩法

然而,除了上述篩法,還有其他高效的篩法,比如歐拉篩法,這裡只給出其代碼實現,希望大家能仔細去體會。

歐拉篩法

那麼Python如何判斷一個正整數是否是素數?我在這裡用math模塊實現

相關焦點

  • 如何判斷一個正整數是否為質數的三種方法 | 附Python程序
    按照規定,1不算素數,最小的素數是2,其後依次是3、5、7、11等等。早在2500年前,古希臘數學家歐幾裡德就證明了素數是無限的,並提出少量素數可寫成 「2的n次方減1(2^n-1)」 的形式,這裡n也是一個素數。但是目前人類已知的素數很有限,因為數字越大,要發現新的素數就越困難。不過,很多數學家曾對素數問題進行過研究。
  • 「每日一練」巧用Python判斷101-200之間有多少個素數
    大家都知道python的效率是很高的,那就讓它來幫我們處理一些複雜的數學問題吧!比如說我想要知道101-200之間有多少個素數,看看python是怎麼輸出的?案例判斷101-200之間有多少個素數,並輸出所有素數。
  • C/C++每日一問--判斷素數
    如何判斷一個數是否是素數?如何判斷一個範圍內的哪些數是素數並具體輸出素數,同時輸出個數?原理:素數(質數),在一般領域,對正整數n,如果用2到根號下n之間的所有整數去除,均無法整除,則n為素數。即:素數大於等於2,不能被它本身和1以外的數整除。
  • LabVIEW編程實例:如何求解1000以內的所有素數
    編程思路求解1000以內的所有素數,這個問題可以分解為下面兩個問題:如何判斷一個數是否為素數查找1000以內的所有符合條件的素數對於第一個問題,基本的判斷思路比較簡單:對於一個大於1的正整數x,如果用2到根號下x 之間的所有整數去除,均不能整除,則這樣的x可以判斷為是一個素數。
  • 如何快速地判斷一個整數是不是質數,這種簡便方法必須掌握
    正整數則可根據因數個數來劃分,可分為1、質數與合數。我們說如果一個正整數只有1和它本身是兩個正因數,那麼這樣的數就稱之為質數。質數也叫做素數,可以說它是數字的根源。如果沒有質數,或許就沒有數論什麼事了。如果用字母表示:a=1×a。(a為大於1的自然數)。
  • 如何判斷一個數是素數呢?
    素數這個詞,我們經常在數學題中看到,判斷一個數是否是素數,首先,我們先來了解一下素數的概念,素數一般指質數。質數是指在大於1的自然數中,除了1和它本身以外不再有其他因數的自然數。了解概念之後,我們來看一道簡單的例題:判斷101到200之間的素數根據題目,我們通過編程的思想進行分析,判斷素數的方法:用一個數分別去除2到sqrt(這個數),如果能被整除, 則表明此數不是素數,反之是素數。
  • 你不知道的素數判斷方法
    素數:質數又稱素數。一個大於1的自然數,除了1和它自身外,不能被其他自然數整除的數叫做質數;否則稱為合數。知道了素數的定義,那麼我們應該想一下,如何去判斷一個數是否為素數?那我們就可以用一個循環,從2開始遍歷到這個數減去1,如果這個數都不能被整除,那麼這個數就是素數。 也就是說: 給定一個數 n , i 從 2 開始取值,直到 n - 1(取整數),如果 n % i !
  • 如何有效尋找素數?
    如何有效尋找素數? 2018年06月01日 11:08作者:科普中國網編輯:網絡 如何有效尋找素數那麼,你可知道如何才能尋找到素數呢? 取一個正整數x,如何才能找出不超過x的所有素數呢?有一種方法叫作埃拉託色尼篩法,其歷史可以上溯到古希臘時期。 埃拉託色尼篩法的步驟如下:第一步,列出從2到x的所有整數,保留2,划去所有2的倍數。
  • 素數判別和整數分解存在多項式算法
    在這一部分裡提出了兩個重要的、懸而未決的問題:是否存在判別素數的多項式算法?是否存在分解大整數的多項式算法?已知道「分解整數」這個問題是一個NP完全問題,因此對上面第二個問題的討論是解決計算機科學中的難題:「NP完全問題是否一定是多項式算法可解的?」的一個突破口。因此,素數判別和大數分解對計算機科學來說也是很有價值的。
  • 淺談將一個正整數分解質因數的邏輯思維和Python開發設計
    今天討論的是如何將一個正整數分解質因數。例如:輸入36,列印出36=2*2*3*3。1.首先要清晰兩個概念,要知道什麼是質數,如何進行分解質因數?質數是指在大於1的自然數中,除了1和它本身以外不再有其他因數的自然數。分解質因數是把一個正整數用質因數相乘的形式表示出來。2.
  • 正整數的性質 A2
    6.求證:3n+1 (n 為正整數)能被 2 或 2² 整除,但不能被 2 的更高次冪整除.解: 按模 2 分類.若 n=2k 為偶數,k 為正整數,則 3n+1=32k+1=(3k)²+1.7.設 p 是質數,證明:滿足 a²=pb² 的正整數 a、b 不存在.解: 用反證法.假定存在正整數 a、b,使得 a²=pb².令 (a,b)=d,a=a1d,b=b1d,則 (a1,b1)=1.
  • 一個奇怪的素數序列
    雕塑家安東帕森斯的「傳遞時間」素數通常被描述為數學的「原子」,或者至少是數字。素數恰好有兩個不同的因素:本身和1.(因此1不被認為是素數。)所有大於1的整數都是素數或素數的乘積。繼續:2×3×7 + 1 = 43,也是素數。2×3×7×43 + 1 = 1807,即13×139。Euclid-Mullin序列是開始2,3,7,43,13等的序列:第一個術語是2,每個後續術語是1的最小素因子加上所有先前術語的乘積。它是在線整數序列百科全書中的序列A000945。
  • 正整數的性質 C3
    證明:毎一個大於 11 的整數都是兩個合數的和.解: 設 n 是大於 11 的整數.若 n 為正整數,n+3 與 n+7 都是質數.求 n 除以 3 所得的餘數.解: 我們知道,n 除以 3 所得的餘數只可能為 0、1、2 三種.若餘數為 0,即 n=3k (k 是一個非負整數,下同),則 n+3=3k+3=3(k+1),所以 3|n+3.
  • Python中判斷數字是否為質數的實例講解
    在本篇文章裡小編給大家分享了關於python中判斷數字是否為質數的實例講解內容,有興趣的朋友們可以學習下。
  • 使用程小奔機器人找出100以內的素數
    題目:找出100以內的素數(2-99)。質數又稱素數,指在一個大於1的自然數中,除了1和此整數自身外,沒法被其他自然數整除的數。思路:從2開始依次判斷每個數是不是素數,如果是的話就加入到列表裡。難點在於如何判斷一個數是不是素數,根據素數的定義,需要使用重複執行,只要能被1和自身之外的數整除(餘數=0),那麼就不是素數,停止本次循環,然後去判斷下一個自然數是不是素數。
  • 【每日上機】 素數對猜想
    讓我們定義 dn 為:dn = pn+1 – pn,其中 pi 是第i個素數。顯然有 d1=1 且對於n>1有 dn 是偶數。
  • 一顆顆璀璨的正整數中的數字珍珠,極具挑戰的難題
    你對正整數有感覺嗎?你喜歡哪個(些)正整數?你知道數論嗎?正整數優美嗎?A. 完美數無論是物質世界,還是精神世界,都離不開數學。最早悟出萬物背後都有數的法則在起作用的,是生活在公元前6世紀的古希臘數學家和哲學家畢達哥拉斯;而他及其學派無論在代數上還是幾何上都有很多貢獻。
  • 孿生素數猜想——是否存在無窮多個素數p使得p + 2是素數?
    孿生素數猜想指出:孿生素數有無窮多個孿生素數是一個與另一個素數相差2的素數。一組相差2的兩個素數稱為孿生素數對。起源雖然歐幾裡得公元前300年證明有無窮多個素數,是否有無限多的孿生素數直到1849年才被證明,法國數學家波林那克(1826 - 1863)猜想每一個自然數k,存在無窮多的素數p,使得p + 2k也是素數。孿生素數猜想是k=1的特殊情況。
  • 正整數的性質 D6
    如果正整數 a、b、c 滿足 c²=a²+b².證明:數 c²+ab 和 c²-ab 都可以表示為兩個正整數的平方和.解: 巧妙運用下述命題:如果正整數 x 可表示為兩個正整數的平方和,則 2x 也可表示為兩個整數的平方和.事實上,設x=u²+v²,這裡 x、u、v 都是正整數.
  • 如何使用python語言代碼實現判斷是否為回文
    工具Visual Studio 2019python運行環境技術python回文回文,是按照中心對稱,從左到右或從右到左,字符串都一樣的。如果想要python語言代碼實現回文判斷,若為回文,列印回文,否則列印不是回文。