内側そう素数5に、単純な数論を直接(4)までのガウス消去した後、決定され、簡単な数論5ガウスの消去法を書きますがアウトグーためにもともと用意
単純な数論(5)------ミラーラビン素数
PartI 素数判定
あなたは今、数Nを与えた場合、どのようにあなたは彼が素数であるかどうかを判断しない、あなたが特定の複合番号にすることができた場合、我々は直接、か割り切れるNの1-SQRTの数(N)を列挙することができます明確です
しかし、この時の複雑さは非常に良いです
その後、我々はミラーラビンのアルゴリズムを使用する必要があります
パートII事前知識---フェルマーの小定理と二次プロービング
(1):フェルマーの小定理:Pは素数であり、そして場合(A、P)= 1、P-1 ≡1(P MOD)
(2)二次検出は:素数Pについては、満たすことができるX 2 ≡1(P MOD)合同クラスX のみx≡1(MOD P)とx≡p-1(MOD P)
PartIIIアルゴリズム・プロセス(Nの場合)
(1)であっても選別
(2):最大値を見つけるように2 S 、S * = N-T 1。
(3):ランダムに選択された素数、我々は最初に計算 し、次に(実行二次検出の二乗に引き続き 2回)。
#include <ビット/ STDC ++ H> 使用して名前空間STDを、 インラインint型リード() { int型、F = 1、X = 0 。 char型のCH; 実行 { CH = GETCHAR()。 もし(CH == ' - ')、F = - 1 。 } 一方、(CH < ' 0 ' || CH> ' 9 ' )。 実行 { X =(x << 3)+(X << 1)+ CH- ' 0 " ; CH = GETCHAR()。 } 一方、(CH> = ' 0 ' && CH <= ' 9 ' )。 リターンのF *のX; } のtypedef 長い 長LL。 LLのn; LLのP [ 12 ] = { 2、3、5、7、11、13、17、19、23、29、31、37 }。 インラインLL捕虜(-1,11,11-のB、LL c)は { LL ANS = 1、MUL = A。 一方、(b)は、 { もし、(B&1 ) { ANS * = MUL。 ANS%= C。 } MUL * = MUL。 MUL%= C。 B >> = 1 。 } 戻り ANS%のCと、 } インラインBOOL Miller_Rabin(LLのX) { 場合(Xの== 1 ){ 返す 偽; } 場合(Xの== 2)を返す 真。 もし(xは%2 == 0)を返す 偽。 BOOL F = 1 。 以下のために(LL i = 0 ; iは< 12 ; iは++ ) { 場合(P [I] == x)を返す 真。 LL T = X- 1、S = 0 。 一方、(T%2 == 0 ){ T / =2 ; S ++ ; } LL CUR = パウ(P [i]は、T、X)。 もし(CURの== 1)続けます。 用(LLのJ = 1 ; J <= Sであり、j ++ ) { LL NXT = CUR * CUR%X。 もし(NXTの== 1 && CUR =!1 && CUR = X-!1 ) { F = 0 。 破ります; } CUR =NXT; もし(CURの== 1)ブレーク。 } もし(!CUR = 1)F = 0 。 もし(F!)破ります。 } 戻りF。 } int型のmain() { N = )(読み取ります。 もし(Miller_Rabin(N)) { COUTは << " 素数" << ENDL。 } 他の裁判所未満<< " 素数でない" << てendl; }