ミラー・ラビン素数検出

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。 = {] 235233331 };
 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 }

 

おすすめ

転載: www.cnblogs.com/meanttobe/p/11354747.html