1の#include <iostreamの> 2の#include <cstdioを> 3。 使用した 名前空間STD; 4。 typedefのロング ロングLL; 5。 // 18は同位体番号:154590409516822759 。6 // 19素数:2305843009213693951(メルセンヌ数) 7つの // 19素数。 4,384,957,924,686,954,497 8。 LLプライム[ 6。 = {] 2、3、5、233、331 }; 9 LLのqmul(LL X、LL Y、LL MOD){ // のP * pが直接その後LLバーストしない場合、乗算は、オーバーフローを防ぎますO(1)、2進加算器又は乗算器に変換される 10 11。 12 リターン(のx * yを- (長い 長い)(X /(長い 二重)MOD * Y + 1E- 3)* MOD + MOD)%MOD。 13 / * 14 LL RET = 0。 15 一方、(Y){ 16 (Y&1)であれば 17 RET =(RET + X)%MOD。 18 X = X * 2%MOD。 19 Y >> = 1。 20 } 21 リターンRET。 22 * / 23 } 24 のLL qpow(-1,11,11- N、LL MOD){ 25 のLL RET = 1 。 26 しばらく(N){ 27 であれば(N - 1)RET = qmul(RET、MOD)。 28 A = qmul(、MOD)。 29 N >> = 1 。 30 } 31 リターンRET。 32 } 33 BOOL Miller_Rabin(LL P){ 34 であれば(pは< 2)戻り 0 ; 35 であれば(P =!2 && P%2 == 0)戻り 0 ; 36の LL S = P - 1 。 37 しばらく(!(S&1))■>> = 1 ; 38 のためには、(int型 iは= 0 ; iは< 5 ; ++ I){ 39 であれば(P ==プライム[i])とリターン 1 。 40 LL T = S、M = qpow(プライム[i]は、S、P)。 41 一方、(T = P - !1 && M =!1 && M = P! - 1 ){ 42 、M = qmul(M、M、P)。 43 T << = 1 。 44 } 45 もし(M = P - !1 &&(T&!1))戻り 0 ; 46 } 47 リターン 1 。 48 } 49 のint main()の 50 { 51 のLL N; 52 一方(CIN >> N) 53 { 54 であれば(Miller_Rabin(n))を 55 COUT << 真 << ENDL。 56 他の coutの<< 偽 << てendl; 57 } 58 リターン 0 。 59 }