1. 程式人生 > >米勒羅賓素性測試(Miller–Rabin primality test)

米勒羅賓素性測試(Miller–Rabin primality test)

如何判斷一個素是素數 效率很高的篩法 打個表 (素數的倍數一定是合數) 就可以解決問題。

篩選法的效率很高,但是遇到大素數就無能為力了。

米勒羅賓素性測試是一個相當著名的判斷是否是素數的演算法

核心為費馬小定理:

假如a是整數,p是質數,且a,p互質(即兩者只有一個公約數1),那麼a的(p-1)次方除以p

的餘數恆等於1。

逆推一下即p的 a^(p-1)%p !=1 (0<a<p) ,它一定是合數。

如果 a^(p-1)%p ==1 (0<a<p) 則它可能是合數可能是素數。概率演算法的概率就在這個 a上體現。

具體過程:

1 隨機取一個 a

2 如果 它不滿足 a^(n-1)%n ==1

3 則它一定是 合數

4 退出

5 如果它滿足 a^(n-1)%n ==1

6  則它是一個素數的概率是1/2

7 回到 1

可以通過拉賓米勒素數測試的合數為偽素數與Carmichael(強偽素數)

Carmichael數是非常少的,在1~100000000範圍內的整數中,只有255個Carmichael數。

為此有二次探測定理以確保該數為素數:

如果p是一個素數,0<x<p,則方程x^2≡1(mod p)的解為x=1,p-1

說明:
Miller-Rabin是隨機演算法
如果對這個過程重複100次,每次都沒說它是合數,那這個數是素數的概率只有(1/2)^5100可能不是素數

相關推薦

素性測試MillerRabin primality test

如何判斷一個素是素數 效率很高的篩法 打個表 (素數的倍數一定是合數) 就可以解決問題。 篩選法的效率很高,但是遇到大素數就無能為力了。 米勒羅賓素性測試是一個相當著名的判斷是否是素數的演算法 核心為

素數,費馬!—拉 素性測試MillerRabin primality test

chapter 1 Fermat's little theorem  費馬小定理 費馬小定理說的是:如果p是一個素數,那麼對於任意一個整數a,a p − a 能被p整除,也可以用模運算表示如下: (p是素數,a是整數) 這個定理又如下變式:如果p是一個素數,且整數a與p互素,那麼 a p−1 

(模板)素數測試大數素數判斷&&搜尋離合數最近的素數

現在ZRain要讓n個孩子變成天使,每個孩子都有一個RP值,當RP值為一個質數時孩子就能變成天使。但是改變孩子的RP值是有代價的,比如rp從x改到y需要付出|x-y|的代價。ZRain真的太喜歡這些孩子了,他希望這些孩子都變成可愛的天使,但又希望付出最小的代價。   &nbs

千萬級高效簡便判斷是否為素數,若為合數,向左右搜尋最近的素數。素數測試演算法

現在ZRain要讓n個孩子變成天使,每個孩子都有一個RP值,當RP值為一個質數時孩子就能變成天使。但是改變孩子的RP值是有代價的,比如rp從x改到y需要付出|x-y|的代價。ZRain真的太喜歡這些孩子了,他希望這些孩子都變成可愛的天使,但又希望付出最小的代價。   &nbs

素數測試版-哥德巴赫猜想

#include <stdio.h> #include <iostream> #include <algorithm> #include <string.h> #include <math.h> #include &

(模板)素數測試

// 18位素數:154590409516822759 // 19位素數:2305843009213693951 (梅森素數) // 19位素數:4384957924686954497 LL prime[6] = {2, 3, 5, 233, 331}; LL qmul(L

素數測試

#include<iostream> #include<cstdio> #include<algorithm> #include<cmath> #define maxn 0x7fffffff using name

素數與素性測試Miller-Rabin測試(目前為止我見過最好的部落格

素數的個數無限多(不存在最大的素數) 存在任意長的一段連續數,其中的所有數都是合數(相鄰素數之間的間隔任意大) 所有大於2的素數都可以唯一地表示成兩個平方數之差。 當n為大於2的整數時,2n+1和2n-1兩個數中,如果其中一個數是素數,那麼另

洛谷4714數論+

log names cpp 代碼 anti class turn operator per 看到沒有矩陣乘法的題解 一開始我是因為被推薦矩陣乘法才來寫這一題的 樓下大佬們的數學公式很強 學到了 矩陣乘法是用矩陣優化達到遞推logN解法的一種算法(大佬們無視) 可以用矩陣做的

HDU 2138 How many prime numbers素數測試演算法

How many prime numbers Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 7120  

Miller_Rabin()素數測試

dir amp 可能 image 法則 卡內基 strong 概率 mod 2018-03-12 17:22:48 米勒-拉賓素性檢驗是一種素數判定法則,利用隨機化算法判斷一個數是合數還是可能是素數。卡內基梅隆大學的計算機系教授Gary Lee Miller首先提出了基於廣

-拉素性檢測演算法

米勒-拉賓素性檢測就是目前應用比較廣的一種隨機化素性檢測演算法。  它是基於下面兩個定理: (費馬小定理)如果 p 為素數,且 a 無法被 p 整除,則對於所有大於0小於 p 的整數 a,有

poj 3641 快速冪+判斷大素數

題意: 判斷一個數p是否滿足: 1.p不是素數; 2.pow_mod(a, p, p) == a % p。 程式碼: #include <iostream> #include <c

hdu 2138(—拉素數測試)

     How many prime numbers Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Problem Description   Give

Goldbach (素數判斷)

Description: Goldbach’s conjecture is one of the oldest and best-known unsolved problems in number theory and all of mathematics.

Fermat素性測試Miller-Rabin素性測試

昨天看了看spoj的第2題(坑啊~), 說的是找出 A,B之間的素數, 有T<=10組資料, A, B均小於10^9, A,B之差小於10^5。 打表是不可能了, 只能一個一個判斷。 這是我們需要一個強力的方法來判斷一個數是素數呢,還是合數。 所以可以想到這個素性測

A/B 測試的基本概念舉例理解以及具體實現方法【傳統A/B測試基於後端的 A/B 測試Back-end AB test,現在基本上基於前端js在客戶端進行分流,有更多優點,請看裡面】

文章來源:http://www.aliued.cn/2010/09/27/ab-testing-realization-method.html 什麼是A/B測試?以及如何進行? 很多朋友都問我怎麼進行A/B測試,我一般都不直接回答他們的問題,而是首先問一句:“你的日

【日記】Miller-Rabin Primality Test

Miller-Rabin 素性檢測   參考wiki—— https://en.wikipedia.org/wiki/Miller–Rabin_primality_test 其中a的選擇: 所以base可以查表,當n不夠大時: pri

演算法素性測試

米勒拉賓素性測試 對於一個數n,如果想要判斷它是否為素數,常規的方法為試除法。即,讓n依次除以2到sqrt(n)以內的整數。如果有出現除盡的情況,則為合數。 該方法的時間複雜度為O(sqrt(n))在面對n為長整型的時候有可能超出時間要求。 因此普遍採用米

-拉(MillerRabbin)素性測試演算法詳解

寫在前面 網上有很多關於米勒拉賓素性測試演算法的部落格  但是大多數都是轉載,或者只有模板程式碼沒有分析講解的,甚至還有的分析的都是錯的。花了一早上,借鑑了幾十篇部落格,總算是把這個演算法理解了差不多,並且詳細整理了一下我的理解。 講解很細,篇幅較長,要是想看,準備好耐心。