知道大家比較關心正確,網上教程好難找到資料,我就自己去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...