MillerRabin素數測試法

2021-09-24 09:58:15 字數 1949 閱讀 1452

知道大家比較關心正確,網上教程好難找到資料,我就自己去wiki翻了

if n < 2,047, it is enough to test a = 2;

if n < 1,373,653, it is enough to test a = 2 and 3;

if n < 9,080,191, it is enough to test a = 31 and 73;

if n < 25,326,001, it is enough to test a = 2, 3, and 5

我自己驗證了上面四組均通過

如果是uint範圍:if n < 4,759,123,141, it is enough to test a = 2, 7, and 61;

如果是10^12範圍:if n < 1,122,004,669,633, it is enough to test a = 2, 13, 23, and 1662803;

如果是10^14範圍:if n < 341,550,071,728,321, it is enough to test a = 2, 3, 5, 7, 11, 13, and 17.

如果是10^18範圍if n < 3,825,123,056,546,413,051, it is enough to test a = 2, 3, 5, 7, 11, 13, 17, 19, and 23.

如果是ull範圍:if n < 18,446,744,073,709,551,616 = 2^64, it is enough to test a = 2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, and 37.

給出乙個millerrabin的實現方式

我的思路大體是這樣的,由費馬小定理得 ap−

1≡1(

modp

)a^\equiv1 \pmod p

ap−1≡1

(mod

p),如果p是素數先要通過費馬小定理的檢測,然後再令k=p

−1

k=p-1

k=p−

1,不斷除2直到k為奇數,或者找到乙個ak≡

1(mo

dp

)a^k\equiv1 \pmod p

ak≡1(m

odp)

,但是k/2

k/2k/

2不同餘。

判斷一下這個數是不是1或者p-1即可。

//請注意下這題的詢問n是不正確的,而且還是乙個ll範圍的數。

//#include

#include

#include

using namespace std;

#define ll long long

ll mymul

(ll a, ll b, ll mod)

return ret;

}ll mypow

(ll a, ll b, ll mod)

return ret;}

bool pd

(ll a,ll p)

const

int maxn =

100010

;bool vis[maxn]

;int prime[maxn]

, cnt;

void

init()

}}//一下依次是ull,10^18,10^14,10^12,uint範圍

//ll pset[12] = ;

//ll pset[9] = ;

//ll pset[7] = ;

//ll pset[4] = ;

//ll pset[3] = ;

ll pset[4]

=;const

int num =4;

bool rabin

(ll p)

return1;

}int

main()

}

Miller Rabin素數測試

公尺勒拉賓素數測試 測試大素數的原基於 如果 n 是素數 且與a 互質 那麼則有 a n 1 1 mod n 這個和費馬小定理 a n a mod n 差不多 1 因此首先可以進行快速冪取模函式 qpow 2 先將y y n 1 的偶數倍先將其右邊為0 的部分去掉 然後進行快速冪求模 3 這裡求出的...

Miller Rabin 素數測試

miller rabin 是乙個基於小費馬定理的隨機演算法。先來介紹一下費小馬定理 費馬小定理 當 p 為質數,則有當 1 leqslant a leqslant p 1 時有 a equiv 1 mod p 可能是素數 然後介紹一下素數二次測試 如果 p 是素數 x 2 equiv 1 mod p...

Miller Rabin素數測試學習筆記

好幾天前看了算導上的miller rabin素數測試演算法,今天正好總結一下,寫寫筆記。說miller rabin測試以前先說兩個比較高效的求a b n 和 ab n 的函式,這裡都是用到二進位制思想,將b拆分成二進位制,然後與a相加 相乘 a b n 例如 b 1011101那麼a b mod n...