[15/08/19] BSGS&EX-BSGSの研究ノート

  BSGS

  \(BSGS(\)\(ベビー\) \(ステップ\) \(Gaint \) \(ステップ)\) 大步スーパー大きな一歩小さなステップアルゴリズムは、高次の合同式と最小の正の整数解のために一般的に使用されるアルゴリズムです。一般形式の方程式を解くために使用される\(A ^ X \ Yを等量(MOD \) \(P)\)(\ (P \)\(A \) 確立最小\(X \)

  \(BSGS \)同様の数学的スケーリング則におけるアルゴリズムの実装は、インデックスシークする\(x \)の中に\(P- + Bの\ SQRT \)列挙によって、\(\)を解決します。

  次のように具体的なプロセスは、次のとおりです。

    :

    \(\大A ^ X \当量Y(MOD \) \(\大P)\)

    \(\大A ^ {K \ lceil \ FRACのXKの\のrceil-(K \ lceil \ FRACのXKの\のrceil-X)} \当量のY(MOD \) \(\大P)\)  \(\大きな(K = \ lceil \ sqrtのP \ rceil)\)

    \(\大{(A ^ K)} ^ N * A ^ { - M} \当量のY(MOD \) \(\大P)\)  \(\大きな(N = \ lceil FRAC \のXKの\ rceil、 M = K \ lceil \ FRACのXKの\のrceil-X)\)

    \(\ N ^ {(^ K)}大\当量INV _ {(^ { - M})} * yは^ {M} * Y \ =)を

    

    2:

    设\(\大kは= \ lceil \ SQRT P \ rceil \) \(X = N *キロ\) \(N [1、Kで\)\) \([1、K)におけるM \ \)

    则求\(\大{(^ K)} ^ N \当量INV _ {(^ { - M})} * yは^ {M} * Y \ =)を

    

  だから我々は、前後にを列挙することができます\(m個\)をする(のy *(^メートル\ \)MODP)を標準で、\(m個\は)に格納された値です\(地図\) 前処理のための)、次に列挙\(N- \)存在する場合\(MAP [{(A ^ K)} ^ N-] \) 次いで\(X = N * K-マップ[{(A ^ K)} ^ n個] \)

  複雑\(O(\ sqrtのPログ P)\)

コード:

//P3846
#include<bits/stdc++.h>
using namespace std;
int p,x,y,k,n,a;
map<int,int>M;
int qp(int x,int y){
    int s=1;
    while(y){if(y&1)s=1ll*s*x%p;x=1ll*x*x%p;y>>=1;}
    return s;
}
int main(){
    cin>>p>>a>>y;
    int k=ceil(sqrt(p));n=y;
    for(int i=0;i<k;i++){         //预处理 
        M[n]=i;
        n=1ll*n*a%p;
    }
    int t=qp(a,k);x=1;
    for(int i=1;i<=k;i++){       //枚举答案 
        x=1ll*x*t%p;
        if(M.count(x)){printf("%d\n",i*k-M[x]);return 0;}
    }
    puts("no solution");return 0;
}

おすすめ

転載: www.cnblogs.com/alexiswithlucifer/p/11355725.html