根據數的不同範圍和要求,我總結主要有三種常用的方法判斷一個數是否是素數
直接判斷在sqrt(n)範圍內有沒有整數能整除n,如果有則不是素數,否則就是素數。
但這種方法比較暴力,如果n過大是不行的,而且一個一個去計算太慢了,如果我要找出10000000以內的所有素數,那計算量是相當大,效率不高。
如果要找出10000000以內的所有素數,那麼就要使用線性篩法了。基本原理是:先把所有整數列出來,然後把2的倍數全部剔除,然後是三的,以此類推,遍歷所有素數,把倍數全部劃去。劃去的是合數,剩下的就是素數了。
那麼,如果n特別大的時候呢,比如n=10^12,又怎麼判斷呢? 這時候就需要Miller-Rabin素數測試方法了。
它是基於二次探測定理進行判斷的,定理描述如下
程式碼實現比較長,截圖在下面
一般情況下第二種和第三種方法用得最多。
不知道現在世界上不用計算機,最先進判定質數的方法是什麼,我自以為有較先進的方法。比如已知1萬內所有質數,分解58965539是質還是合。要多長時間。
根據數的不同範圍和要求,我總結主要有三種常用的方法判斷一個數是否是素數
一. 一般方法直接判斷在sqrt(n)範圍內有沒有整數能整除n,如果有則不是素數,否則就是素數。
但這種方法比較暴力,如果n過大是不行的,而且一個一個去計算太慢了,如果我要找出10000000以內的所有素數,那計算量是相當大,效率不高。
二. 基於線性篩法如果要找出10000000以內的所有素數,那麼就要使用線性篩法了。基本原理是:先把所有整數列出來,然後把2的倍數全部剔除,然後是三的,以此類推,遍歷所有素數,把倍數全部劃去。劃去的是合數,剩下的就是素數了。
那麼,如果n特別大的時候呢,比如n=10^12,又怎麼判斷呢? 這時候就需要Miller-Rabin素數測試方法了。
三. Miller-Rabin素數測試它是基於二次探測定理進行判斷的,定理描述如下
程式碼實現比較長,截圖在下面
一般情況下第二種和第三種方法用得最多。