素數判定的一些討論(Miller Rabin演算法)

2021-08-31 18:46:43 字數 1965 閱讀 1410

一類問題: 判定乙個整數n(n>1)是否為素數。

演算法一:

直接根據素數的定義列舉從到,如果n%i==0n為合數。

時間複雜度:o(n)

int is_prime(int n)

演算法二:發現若存在使得n%i==0,則必有n%(n/i)==0

所以只需列舉從到即可。

時間複雜度:

int is_prime(int n)

如果要找到成1~n的所有素數那麼這個時間代價就變為o(n^2),很多時候是不可接受的。

所以隨著學習的深入,我們了解到了素數篩法,即從2開始,2的倍數肯定不是素數,再向右掃瞄,如果掃瞄到素數,則重複之前的過程,剔除之後的部分合數(準確的說是關於當前質數的倍數),如果掃瞄到合數則跳過(表示前面已經更新過這個數不是素數)。然後都掃瞄一遍即可把1~n的素數求解出來。這個演算法的複雜度略高於o(n)。素數篩**如下:

#include#includeusing namespace std;  

const int maxn = 500000;

bool isprime[maxn];

int prime[maxn];

int cnt = 0;//儲存素數個數

void getprime()

} int main()

但是這個演算法的弊端在於,為了判斷乙個大數是否是素數必須從從頭開始掃瞄,而且空間代價也受不了,故不能離散的判斷。

看完了上面的引理,那就可以正式開始miller-rabin演算法的講解了。

背景:素性測試(即測試給定的數是否為素數)是近代密碼學中的乙個非常重要的課題。雖然wilson定理(對於給定的正整數n,n是素數的充要條件為

演算法:首先要知道費馬定理只是n是素數的必要條件。即費馬定理不成立,n一定是合數;費馬定理成立,n可能是素數。接下來請看miller-rabin演算法的分析過程。

}這裡有另乙個版本的解釋

素數判定的一些討論(Miller Rabin演算法)

很久沒有寫部落格了。最近軍訓加開學,感覺刷題速度有降低,要補一補。回歸正題,正式進入數論階段,討論一下關於素數判定的那些事。直接根據素數的定義列舉 i 從2到 n 1 如果n i 0 n 為合數。時間複雜度 o n bool is prime int n 發現若存在 i n 使得n i 0,則必有n...

關於Session的一些討論

眾所周知,session是jsp的九大內建物件之一,也是伺服器二次識別客戶端的橋梁,它的生命週期非常長,一般都是存在於乙個會話 同一瀏覽器 之中,與 天地同壽 伺服器 有如下例子 1 在不關閉瀏覽器的情況下,建立乙個session,你始終可以訪問到這個session。2 在不關閉瀏覽器的情況下,建立...

關於素數的一些題目

看了czyuan的總結,決定先找幾道素數的題目玩玩.首先,判定素數的方法除了暴力列舉到根號n外還有篩法,不要小看,他可以演變出一些題目 for i 2 i maxn i 短短幾行,可以在0.9s左右篩出一千萬內的素數,應該夠用了 這個題 是篩素數的好題,當然要先知道威爾遜定理.不知道的話搜一下吧.這...