如何判斷一個正整數是否為質數的三種方法 | 附Python程序

2021-01-14 父與子的數學和編程課堂

質數又稱素數。一個大於1的自然數,除了1和它自身外,不能被其他自然數整除的數叫做質數;否則稱為合數。按照規定,1不算素數,最小的素數是2,其後依次是3、5、7、11等等。

早在2500年前,古希臘數學家歐幾裡德就證明了素數是無限的,並提出少量素數可寫成 「2的n次方減1(2^n-1)」 的形式,這裡n也是一個素數。


但是目前人類已知的素數很有限,因為數字越大,要發現新的素數就越困難。不過,很多數學家曾對素數問題進行過研究。17世紀的法國教士馬丁·梅森就是其中成果較為卓著的一位,因此後人將 「2的n次方減1(2^n-1)」 形式的素數稱為梅森素數。隨後,以梅森素數的形式,最大素數的記錄被不斷刷新。

1876年,數學家盧卡斯證明了 2^127-1 是當時已知的最大素數。這個記錄保持了75年,這是一個39位的數。直到1951年,藉助於新出現的電子計算機,人們才發現有79位數字的更大素數。


1952年時,最大素數是 2^2281-1,有687位數。位數在1000位以上的素數到1961年才被發現,它是 2^4423-1,共有1332位數。從1951年到1971年的20年間,最大素數的紀錄被不斷刷新。


1971年,美國數學家塔克曼在紐約州的紐克頓利用 IBM360/91 型電子計算機,歷時39分26.4秒,算出了當時的最大素數 2^19937-1,這是一個6002位的數字,它最前面的五位數是 43154,最後面的三位數是 471。


1978年10月,世界幾乎所有的大新聞機構(包括中國的新華社)都報導了以下消息:兩名年僅18歲的美國高中生諾爾和尼科爾使用CYBER174型計算機找到了第25個梅森素數:M21701。


2008年8月,美國加州大學洛杉磯分校(UCLA)的計算機專家史密斯(E.Smith)通過參加了一個名為「網際網路梅森素數大搜索」(GIMPS)的國際合作項目,發現了第46個也是當時最大的梅森素數 2^43112609-1,該素數也就是 2 自身相乘43112609次減1,它有 12978189 位數,如果用普通字號將這個巨數連續寫下來,它的長度可超過50公裡!這一成就被美國的《時代》雜誌評為「2008年度50項最佳發明」之一,排名在第29位。


據英國《新科學家》雜誌網站報導,美國中央密蘇裡大學數學教授柯蒂斯·庫珀(Curtis Cooper)領導的研究小組於2013年1月25日發現了已知的最大梅森素數——2^57885161-1 (即2的57885161次方減1);該素數有17425170位,如果用普通字號將它連續列印下來,它的長度可超過65公裡!


另據外媒報導,美國州立中密蘇裡大學柯蒂斯庫珀(Curtis Cooper)通過GIMPS項目發現了第49個梅森素數 2^74207281-1(被稱為M74207281),為GIMPS項目誕生20周年獻禮。


2017年12月26日,網際網路梅森素數大搜索(GIMPS)項目宣布發現第 50 個梅森素數和已知最大的素數:2^77,232,917-1,共有 23,249,425 位。該素數已被多人使用不同的硬體和軟體完成驗證。發現者是 GIMPS 志願者 Jonathan Pace,他住在田納西州的 Germantown,是一位電機工程師,他有資格獲得 3000 美元的研究發現獎。


GIMPS 是一個分布式計算項目,至今已有 20 年歷史,它利用志願者的空閒 CPU 創建了一個遍布全球的超級計算機,它的 prime95 軟體此前發現了英特爾處理器的一個漏洞。


2013年5月,張益唐在孿生素數研究方面所取得的突破性進展,他證明了孿生素數猜想的一個弱化形式。張益唐在不依賴未經證明推論的前提下,發現存在無窮多差小於7000萬的素數對,從而在孿生素數猜想這個重要問題的道路上前進了一大步。


如何判斷一個正整數是否為質數?

以下介紹三種判別質數的方法,並附上相應的Python程序,供有興趣的同學參考。

1)直觀判斷法

最直觀的方法,根據定義,因為質數除了1和本身之外沒有其他因數,所以判斷n是否為質數,根據定義直接判斷從2到n-1是否存在n的因數即可。




2)直觀判斷法改進


上述判斷方法,明顯存在效率極低的問題。對於每個數n,其實並不需要從2判斷到n-1,我們知道,一個數若可以進行因數分解,那麼分解時得到的兩個數一定是一個小於等於sqrt(n),一個大於等於sqrt(n),據此,上述代碼中並不需要遍歷到n-1,遍歷到sqrt(n)即可,因為若sqrt(n)左側找不到因數,那麼右側也一定找不到因數。




3)質數規律判斷法


首先看一個關於質數分布的規律:大於等於5的質數一定和6的倍數相鄰。例如5和7,11和13,17和19等等。


證明:令x≥1,將大於等於5的自然數表示如下:

······6x-2,6x-1,6x,6x+1,6x+2,6x+3,6x+4,6x+5,6x+6,6x+7······

也就是

······2(3x-1),6x-1,6x,6x+1,2(3x+1),3(2x+1),2(3x+2),6x+5,6(x+1),6(x+1)+1······

可以看到,不在6的倍數兩側,即6x兩側的數為6x+2,6x+3,6x+4,由於2(3x+1),3(2x+1),2(3x+2),所以它們一定不是素數,再除去6x本身,顯然,素數要出現只可能出現在6x的相鄰兩側。這裡要注意的一點是,在6的倍數相鄰兩側並不是一定就是質數。


根據以上規律,判斷質數可以6個為單元快進,即將方法(2)循環中i++步長加大為6,加快判斷速度,代碼如下:



*本文由父子課堂根據csdn及其他網絡內容整理

*轉載請註明父與子的數學和編程課堂(id:mathcoding)



父子課堂由多位北美博士/博士後組成核心團隊,專注於兒童和青少年的編程和數學教育,專業提供Scratch、Python、EV3機器人以及信奧和奧數競賽等內容的培訓課程。歡迎加入父子課堂,在培訓課程之外,還可通過公眾號和交流社群,獲取更多免費學習資源。


父子課堂的願景和宗旨:

讓更多孩子享有更優質的教育資源


加入父子課堂公眾號並把本文發朋友圈,可免費獲贈《父與子的編程之旅:與小卡特一起學Python》電子書。



對本書的讚譽


「這本書將編程變得和煎培根一樣容易。」

——Elisabet Gordon,Eagle Harbor 中學 10 年級學生

「對任何人來說,這都是一本非常出色的 Python 入門書。它非常有趣!」

——Mason Jenkins,Myron B. Thompson Academy7 年級學生

「上到 88 歲,下到 8 歲,任何想學習編程的人都可以閱讀這本書。它不僅以一種有趣的方式介紹了 Python 編程,而且其中的最佳實踐還適用於其他程式語言的學習。」

——Ben Ooms,Sogeti 公司軟體工程師

「如果你想學習編程,或者想教孩子編程,那麼這本書就是你的不二選擇。」

——Cuberick.com

「不論老幼,只要想學習編程這門必備而有趣的技能,這都是一本非常好的介紹性圖書。」

——Sue Gee,www.i-programmer.info 網站

「Warren 和 Carter 由簡入難,直到教會讀者製作有趣的2D圖形遊戲和模擬器。Python 是我向編程新手推薦的首選語言,而本書正是非常好的學習資源。第 1 版出版後,我就一直向學生們推薦它。」

——Dave Briccetti,Dave Briccetti Software LLC 公司軟體開發者和教師


如有侵權請聯繫刪除

更多精彩內容請關注:父與子的數學和編程課堂


長按可識別圖中二維碼

輕鬆關注父與子的數學和編程課堂

相關焦點

  • Python如何判斷一個正整數是否是素數?
    而一個數的約數必然是不超過該數的,加上素數必需是只有1和本身是其約數的條件。於是,我們可以通過枚舉小於該數,並且大於1的整數,來判斷該數是否是素數。假設有一個正整數a,則其可以被寫成任意兩個正整數之積,即a = p * q。假設p < q,那么正整數p和q都是a的約數。注意到,如果我們知道p是a的約數,那麼可以通過q = a / p快速求得另外一個約數q。
  • Python中判斷數字是否為質數的實例講解
    在本篇文章裡小編給大家分享了關於python中判斷數字是否為質數的實例講解內容,有興趣的朋友們可以學習下。
  • 淺談將一個正整數分解質因數的邏輯思維和Python開發設計
    今天討論的是如何將一個正整數分解質因數。例如:輸入36,列印出36=2*2*3*3。1.首先要清晰兩個概念,要知道什麼是質數,如何進行分解質因數?質數是指在大於1的自然數中,除了1和它本身以外不再有其他因數的自然數。分解質因數是把一個正整數用質因數相乘的形式表示出來。2.
  • 如何快速地判斷一個整數是不是質數,這種簡便方法必須掌握
    正整數則可根據因數個數來劃分,可分為1、質數與合數。我們說如果一個正整數只有1和它本身是兩個正因數,那麼這樣的數就稱之為質數。質數也叫做素數,可以說它是數字的根源。如果沒有質數,或許就沒有數論什麼事了。如果用字母表示:a=1×a。(a為大於1的自然數)。
  • 少兒編程Python第4課-for循環語句(質數判斷)
    0到100的取值範圍,這樣就可以構造出一個整數的序列並用於循環中,例如:- `range(101)`可以產生一個0到100的整數序列。下面的例子演示了如何通過嵌套的循環來輸出一個九九乘法表。實驗表明,質數次數地使用殺蟲劑是最合理的:都是使用在害蟲繁殖的高潮期,而且害蟲很難產生抗藥性。以質數形式無規律變化的飛彈和魚雷可以使敵人不易攔截。多數生物的生命周期也是質數(單位為年),這樣可以最大程度地減少碰見天敵的機會。
  • 教程資源|判斷質數和合數程序
    在數學中經常會看到質數和合數,但很多人卻不知道什麼是質數,什麼是合數?根據算術基本定理,每一個比1大的整數,要麼本身是一個質數,要麼可以寫成一系列質數的乘積;而且如果不考慮這些質數在乘積中的順序,那麼寫出來的形式是唯一的,最小的質數是2。質數又稱素數,個數是無窮的,一個大於1的自然數,除了1和它本身外,不能被其他自然數整除,換句話說就是該數除了1和它本身以外不再有其他的因數。
  • 用Python判斷質數的嘗試
    我們的目標是:輸入一個數字之後,讓計算機判斷它是不是質數。拋出問題後,首先需要解決,什麼是質數的問題。與純數學的想法不同,我們需要找到一個可以讓計算機接受的判定的法則。質數,就是除了1以及本身以外,沒有其他因數的自然數。首先它是個自然數,因此程序的輸入端就解決了,N=int(input())。
  • Python編程案例:判斷自然數n是質數還是合數
    編程需求阿萌要開發一個程序,該程序可以判斷一個自然數n是質數還是合數。例如學生輸入自然數17,程序判斷17為質數,程序輸出「15:質數」。認識質數和合數要確定一個自然數是質數還是合數,需要先找出該自然數有多少個因數。因為該自然數是質數還是合數,與這個自然數有多少個因數有關。按這些數因數個數的多少,可以分為三種情況:只有1和它本身兩個因數的為質數,質數也稱為素數。
  • 數學小知識 | 判斷質數的方法
    自古以來,數學家們就想弄明白:自然數中到底有多少個質數,質數的分布有什麼規律,如何去尋找質數。1934年,在埃拉託色尼選去問世兩千多年後,一位年輕的印度學生辛答拉姆創造了如圖所示的一個數表,利用這個數表找質數的方法被稱為「辛答拉姆篩法"。
  • 如何快速判斷一個自然數是質數
    在大於1的自然數中除了1和這個數本身外,沒有其他因數的數稱為質數。質數也叫素數。除了2以外,所有的質數全部都是奇數。
  • 如何快速判斷149與281是否為質數,判斷過程最關鍵
    昨天我們說了質數的一些特點。其中也講到了一點,怎樣快速判斷一個自然數是否是質數?當然這個數字不能太大,1000以內還是相對比較快能判斷出來。採用的方法是找到小於並且最接近這個自然數的完全平方數。用我們要檢驗的這個數除以該完全平方數的平方根以內的質數。我們舉個簡單的例子,149是不是質數?如果我們直接這樣看的話,可能肯定是看不出來的。那如果從2開始一直往上,一個數一個數試,(據說電腦是這麼判斷的,直到試到這個數本身為止),我們也不知道具體要試到哪個數為止才不至於遺漏?
  • 正整數的性質 C3
    證明:毎一個大於 11 的整數都是兩個合數的和.解: 設 n 是大於 11 的整數.(5) 若 n 的個位數字為 8,則 n=33+5k (k≥3 為奇數).綜上所述,不小於 40 的任一偶數,都可以表示成兩個奇合數之和.11. 若 n 為正整數,n+3 與 n+7 都是質數.求 n 除以 3 所得的餘數.解: 我們知道,n 除以 3 所得的餘數只可能為 0、1、2 三種.
  • 正整數的性質 C6
    證明:存在無窮多個正整數,它不能表示為一個完全平方數與一個質數之和.解: 抓住質數不能表示為兩個大於 1 的正整數之積這個特性,引導我們到完全平方數中去尋找符合要求的數,因為此時我們可用平方差公式.設 y 是正整數,我們尋找使 y² 不能表示為一個完全平方數與一個質數之和的條件.
  • 100以內質數的快速判斷方法
    對於30以內質數,大部分老師都會要求學生記憶,所以瞬間就可以判斷,但對於100以內任意自然數,如何快速判斷它是否是質數呢?其實只要掌握正確的方法,不需要任何專門的訓練,都可以在3秒內判斷出來。一、首先要明確質數的意義質數和合數是根據因數的個數來分類的,質數只有2個因數,合數至少有3個因數。二、探究判斷質數的方法課本例1提供了一個方法,依次劃掉某些數的倍數,把不是質數的都排除了,剩下的就都是質數。
  • C/C++語言中將一個正整數圓整為2的n次方的方法
    問題提出在數位訊號處理領域,常遇到需要將一個正整數向上圓整為2的n次方的數據的情況,如對採集到的時域信號做頻譜分析時,常要求數據點數必須滿足為2的n次方,滿足此種情況才可用傅立葉變換的基2快速算法,以達到較好的運算速度。
  • 如何快速判斷一個自然數是不是質數,除了試除法外還有更好的方法
    100以內有多少個質數呢?總共有25個。大家可以看一下100以內質數表。關於質數,還有個比較特殊的地方。除了5以外,任意多位尾數是5的自然數,一定是合數。因為尾數是5的自然數,一定是5的奇數倍數。那麼如何快速判斷一個數字是否是質數呢?可能大家會想到的是用試除法。這個方法可以嗎?可以,只是效率相對來說有些低。
  • 正整數的性質 C7,D1
    在 1,2,…,2000 中只有 11 個正整數是 2 的冪:1=20,2=21,4=2²,…,1024=210,於是 101+1,10²+1,…,102000+1 中至少有 1989 個數不是質數,即至少有 1989/2000>99% 的數不是質數.28.
  • 小學數學題,判斷3599是質數還是合數,這兩種方法你覺得哪種好用
    我們在小學數學要背的東西不多,但有一個是大家必須無條件要背的,就是九九乘法表了,這個還真沒有任何技巧,可一定要把它背得滾瓜爛熟,甚至說倒背如流,形成一種條件反射。因為它是我們做整數乘除法,包括以後覺得小數乘除法、通分、約分都是需要用到。
  • 正整數的性質 D4
    設 p 是質數,且 p4 的全部正約數之和是一個平方數,求 p.解: 因為 p 是質數,所以 p4 有 5 個正約數1、p、p²、p³、p4.)²<(2n)²<(2p²+p+2)²由於 2p²+p,2n, 2p²+p+2 均為正整數.
  • 一分鐘算法 —— Miller-Rabin 質數判斷法
    對於任何一個質數 P 和整數 a,其中 a 和 P 互質,那麼有 a ^ ( P-1 ) ≡ 1 ( mod P)(≡ 是同餘,在費馬小定理裡有講到)。既然如此,我們不妨可以將問題轉化一下,反過來想:如果數 P(不知道是否為質數),存在整數 a < P,並且 a ^ (P-1 ) ≡ 1 ( mod  ),P 是不是就是質數了呢?