• 中国剩余定理


    设正整数两两互素,则同余方程组

                                 

    有整数解。并且在模下的解是唯一的,解为

                                   

    其中,而的逆元。

    ll e_gcd(ll a,ll b,int &x,int &y){
        if (b==0){
            x=1; y=0; return a;
        }
        ll d=e_gcd(b,a%b,x,y);
        ll t=x; x=y;
        y=t-(a/b)*y;
        return d;
    }
    void CRT(int n){
        int M=1; ans=0;
        for (int i=1;i<=n;i++) M*=m[i];
        for (int i=1;i<=n;i++){
            int x,y,Mi=M/m[i];
            e_gcd(Mi,m[i],x,y);
            ans=mo(ans+a[i]*Mi*x,M);
        } 
    }

    普通的中国剩余定理要求所有的互素,那么如果不互素呢,怎么求解同余方程组?

    这种情况就采用两两合并的思想,假设要合并如下两个方程

          

    那么得到

           

    在利用扩展欧几里得算法解出的最小正整数解,再带入

           

    得到后合并为一个方程的结果为

           

    这样一直合并下去,最终可以求得同余方程组的解。

    ll e_gcd(ll a,ll b,ll &x,ll &y){
        if (b==0){
            x=1; y=0; return a;
        }
        ll d=e_gcd(b,a%b,x,y);
        ll t=x; x=y;
        y=t-(a/b)*y;
        return d;
    }
    ll e_crt(int n)
    {
        ll M=m[1],R=r[1],x,y,d;
        for (int i=2;i<=n;++i)
        {
            d=e_gcd(M,m[i],x,y);
            if ((r[i]-R)%d) return -1;
            x=(r[i]-R)/d*x%(m[i]/d);
            R+=x*M; M=M/d*m[i]; R%=M;
        }
        return R>0?R:R+M;
    }

    转自:http://blog.csdn.net/acdreamers/article/details/8050018

    证明:可以参考百度百科。

     
  • 相关阅读:
    web.xml中的contextConfigLocation在spring中的作用
    folder、source folder、package 区别与联系
    mysql
    十六进制浮点转十进制浮点型
    float浮点数的二进制存储方式及转换
    API -- java.lang.Integer
    MyISAM与InnoDB区别
    mysql timestamp类型字段的CURRENT_TIMESTAMP与ON UPDATE CURRENT_TIMESTAMP属性
    刷新当前页面
    正则表达式
  • 原文地址:https://www.cnblogs.com/SXia/p/7260239.html
Copyright © 2020-2023  润新知