トピックポータル
ソル: Pollard_Rhoテンプレートの質問は、物事Pollard_Rho原則をたくさん読んで、Miller_Rabinは読んでいないが、やっと結論がコードをノック思い出すことができます。
- Pollard_Rho
#include " cstdioを" の#include " cstdlib " の#include " アルゴリズム" の#include " ctimeの" 使用して 名前空間はstdを、 typedefの長い 長いLL。 LLのGCD(LL、LL b)は{ 戻り Bの== 0?A:GCD(B、%のB)。 } LLのmuli_mod(LLのN、LL K、LLのP){ LLのM = 0 。 一方、(K){ 場合(K&1)M =(M + N)%のP。 n個=(N + N)%のP。 K >> = 1 。 } 戻りM。 } LLのpow_mod(LLのN、LL K、LLのP){ LLのM = 1 。 一方、(K){ 場合(K&1)M = muli_mod(M、N、P)。 N = muli_mod(N、N、P)。 K >> = 1 。 } 戻りM。 } LLのmiller_rabin(LLのN){ 場合(N == 2)を返す 真。 もし(N < 2|| !(N&1))を返す 偽。 LL M = N - 1。int型 S = 0 ; しばらく(!(M&1))S ++、M >> = 1 ; 以下のために(int型 I = 1 ; = iが< 5 ; iは++ ){ LLのR =ランド()%(N - 1)+ 1 。 LLのY = pow_mod(R、M、N)。 用(INT J = 1 ; J <= Sであり、j ++ ){ LL X= muli_mod(Y、Y、N)。 もし(Xの== 1 && Y =!1 && Y = N! - 1)を返す 偽。 Y =のX。 } もし(!Y = 1)を返す 偽。 } を返す 真。 } LLのpollard_rho(LLのN、LLのC){ int型 I = 1、K = 2 。 LL X =ランド()%(N - 1)+ 1 。 LL Y =のX。 同時に(真){ X =(muli_mod(X、X、N)+ C)%N。 LLのP = GCD((Y - X + N)%N、N) もし(P> 1つの && P <n)の戻りP。 もし(x == y)はリターンN。 もし(++ I == k)は{ K << = 1 。 Y =のX。 } } } (LL n)が{llの発見 であれば(miller_rabin(n))をリターンN。 LLのP = N; 同時に(P> = N)P = pollard_rho(P、ランド()%(N - 1)+ 1 )。 戻り分((見つける)P(見つけるN / P))。 } int型のmain(){ int型のT。LLのn; // srand関数(時間(NULL)); scanf関数(" %のD "、&T)。 一方、(t-- ){ scanf関数(" %のLLD "、&N) LLのP = (n)を見つけます。 もし(のp == n)のプット(" プライム" ); 他のprintf(" %LLDの\ nを" 、P); } 戻り 0 ; }
POJ使用をさせない__gcd下ユニバーサルヘッド、アルゴリズムを使用しません。これでキーにsrandはまた、非常にピットを再度。