码迷,mamicode.com
首页 > 其他好文 > 详细

平方剩余

时间:2018-12-06 14:32:27      阅读:224      评论:0      收藏:0      [点我收藏+]

标签:code   col   表示   最小   turn   ==   平方剩余   for   mod   

template<class T> T fast_mod(T a,T b,T Mod){
    if(b==0) return 1;
    T ans=1,base=a;
    while(b!=0){
        if(b&1)ans=(ans*base)%Mod;
        base=(base*base)%Mod;
        b>>=1;
    }
    return ans;
}
//求 x^2 = a mod(n)的最小整数解x ,n,为素数
//返回-1表示无解
int modsqr(int a,int n){
    int b,k,i,x;
    if(n==2) return a%n;
    if(fast_mod(a,(n-1)/2,n)==1){
        if(n%4==3) x=fast_mod(a,(n+1)/4,n);
    }else {
        for(b=1;fast_mod(b,(n-1)/2,n)==1;b++);
        i=(n-1)/2;
        k=0;
        do{
            i/=2;
            k/=2;
            if((fast_mod(a,i,n)*(long long )fast_mod(b,k,n)+1)%n==0) 
            k+=(n-1)/2;
        }while(i%2==0);
        x=(fast_mod(a,(i+1)/2,n))*(long long)fast_mod(b,k/2,n)%n;
        if(x*2>n) x=n-x;
        return x;
    }
    return -1;
}

 

平方剩余

标签:code   col   表示   最小   turn   ==   平方剩余   for   mod   

原文地址:https://www.cnblogs.com/033000-/p/10075934.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!