int babystep(int A,int C,int B)
{
    int i,d,tmp,m,w,mm,ans;
    __int64 D;
    top = INF; ++ idx;
    d=0;
    D=1;
    ans=1;
    for(i=0;i<=100;i++)
    {
        if(ans==B) return i;
        ans=(__int64)ans*A%C;
    }
    tmp=gcd(A,C);
    while(tmp!=1)
    {
        if(B%tmp) return -1;
        ++d;
        C/=tmp;
        B/=tmp;
        D=D*A/tmp%C;
        tmp=gcd(A,C);
    }
    m=ceil(sqrt((double)C));
    ans=1;
    for(i=0;i<=m;i++)
    {
        ins(i,ans);
        ans=(__int64)ans*A%C;
    }
    mm=pow_mod(A,m,C); //A^m%C
    for(i=0;i<=m;i++) // mm^i
    {
        tmp=Inval((int)D,C,B);
        if(tmp>=0 && (w=find(tmp))!=-1) return i*m+w+d;
        D=D*mm%C;
    }
    return -1;
}
Пример #2
0
int BabyStep(int A,int B,int C){
	top=maxn;++idx;
	ll buf=1%C,D=buf,K=0;
	int i,d=0,tmp;
	for (i=0;i<=100;buf=buf*A%C,++i)
		if (buf==B) return i;
		while ((tmp=gcd(A,C))!=1){
			if (B%tmp) return -1;
			++d;
			C/=tmp;
			B/=tmp;
			D=D*A/tmp%C;
		}
		int M=(int)ceil(sqrt(double(C)));
		for (buf=1%C,i=0;i<=M;buf=buf*A%C,++i)
			insert(i,buf);
		for (int i=0,K=fastpow(A,M,C);i<=M;D=D*K%C,++i){
			tmp=Inval(int(D),B,C);int w;
			if (tmp>0&&(w=find(tmp))!=-1)
				return i*M+w+d;
		}
	return -1;
}