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

2021-02-19 JA計算思維

質數又稱素數。一個大於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和它本身兩個因數的為質數,質數也稱為素數。
  • 數學小知識 | 判斷質數的方法
    自古以來,數學家們就想弄明白:自然數中到底有多少個質數,質數的分布有什麼規律,如何去尋找質數。公元前300多年,希臘學者埃拉託色尼提出了一種方法,先把自然數列的數寫在一個表中,然後把其中的合數一個一個地挖去。
  • Python如何實現超長整數
    當你使用像C這樣的低級語言編寫代碼時,你需要為整數選擇正確的數據類型和限定符; 在每一步中,你都需要考慮int是否足夠,或者你是否應該使用
  • 整數、自然數、奇數、偶數、質數、合數再也不會混了
    01整數(1)像−2,−1,0,1,2,…這樣的數統稱為整數(2)整數包括正整數,0,負整數(3)整數包括自然數
  • Python基礎教程判斷(if)語句
    >中,if 語句 就是用來進行判斷的,格式如下:python if 要判斷的條件: 條件成立時,要做的事情 ……注意:代碼的縮進為一個tab鍵,或者 我們可以把整個 if 語句看成一個完整的代碼塊2.2 判斷語句演練 —— 判斷年齡需求定義一個整數變量記錄年齡
  • 如何快速判斷一個自然數是質數
    在大於1的自然數中除了1和這個數本身外,沒有其他因數的數稱為質數。質數也叫素數。除了2以外,所有的質數全部都是奇數。
  • 如何快速判斷149與281是否為質數,判斷過程最關鍵
    昨天我們說了質數的一些特點。其中也講到了一點,怎樣快速判斷一個自然數是否是質數?當然這個數字不能太大,1000以內還是相對比較快能判斷出來。採用的方法是找到小於並且最接近這個自然數的完全平方數。用我們要檢驗的這個數除以該完全平方數的平方根以內的質數。我們舉個簡單的例子,149是不是質數?如果我們直接這樣看的話,可能肯定是看不出來的。那如果從2開始一直往上,一個數一個數試,(據說電腦是這麼判斷的,直到試到這個數本身為止),我們也不知道具體要試到哪個數為止才不至於遺漏?
  • C語言判斷一個數是否為整數
    C語言判斷一個數是否為整數,這是一個很常見但是又往往讓人感覺無從下手的一個問題,其實解決辦法很簡單。對於輸入的double a;使用floor(a+0.5) == a來判斷即可。這是因為有時候使用 double 型變量存儲整數時,會有損失部分精度,比如本來想存的是1,而實際上存的可能是 0.9999999 , 所以這樣四捨五入一下,能有效避免存儲精度上產生的問題。下面是一個簡單的例子
  • 正整數的性質 C6
    證明:存在無窮多個正整數,它不能表示為一個完全平方數與一個質數之和.解: 抓住質數不能表示為兩個大於 1 的正整數之積這個特性,引導我們到完全平方數中去尋找符合要求的數,因為此時我們可用平方差公式.設 y 是正整數,我們尋找使 y² 不能表示為一個完全平方數與一個質數之和的條件.
  • Python 判斷文件是否存在的三種方法
    ,不然某些處理方法可能會使程序出錯。所以最好在做任何操作之前,先判斷文件是否存在。這裡將介紹三種判斷文件或文件夾是否存在的方法,分別使用os模塊、Try語句、pathlib模塊。1.使用os模塊os模塊中的os.path.exists()方法用於檢驗文件是否存在。
  • 一文詳解Python字符串條件判斷方法
    而py最最最致命的是,我之前已經用過這個方法了,但是在實際使用的時候,我沒有用上。我大可以說,這個是粗心,就和考試的時候一樣,問什麼數字平方等於4,我只寫了個2,然後因此丟了-2那半分,但我知道,這其實就是基礎不夯實的體現。是一種憑藉直接經驗獲取知識的思維方式。畢竟python字符串判斷方法,在日常開發中,用的比較少,因此被我忽視掉了。為了避免以後再犯類似的錯誤,就趁此機會撿起爛筆頭。
  • Python|計算魅力的質數
    質數指在大於1的自然數中,除了1和該數自身外,無法被其他自然數整除的數,又稱「素數」。換句話說,只有兩個正因數(1和自己)的自然數整數的數為質數,其它大於1但不是質數的數稱為「合數」。解釋:小於10的質數一共有4個,它們分別是2,3,5,7通過示例可以知道解答問題的實質就是求小於輸入值n的質數個數,那麼重點就在於統計質數個數和質數的求法,質數可以用for循環遍歷n,然後通過判斷條件求得質數,統計個數就可以用count統計。
  • python中的這些坑,早看早避免.
    else的使用場景 在刷pythontip的時候遇到這道題,覺得很有必要和大家普及下for。。else的用處,好了下面我們開始:輸出100以內的所有素數,素數之間以一個空格區分(注意,最後一個數字之後不能有空格)。#在一般領域,對正整數n,如果用2到根號N之間的所有整數去除,均無法整除,則n為質數又叫素數。