POJ-1811-プライムテスト(pollard_rhoテンプレート、すぐに最小の素因数を見つけます。)

トピックポータル

ソル: Pollard_Rhoテンプレートの質問は、物事Pollard_Rho原則をたくさん読んで、Miller_Rabinは読んでいないが、やっと結論がコードをノック思い出すことができます。

  • Pollard_Rho
    #include " cstdioを" 
    の#include " cstdlib " 
    の#include " アルゴリズム" 
    の#include " ctimeの" 
    使用して 名前空間はstdを、
    typedefの長い 長いLL。
    LLのGCD(LL、LL b)は{ 
        戻り Bの== 0A: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 - 1int型 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はまた、非常にピットを再度。

おすすめ

転載: www.cnblogs.com/Angel-Demon/p/11593930.html