zoukankan      html  css  js  c++  java
  • 中国剩余定理的应用

     http://www.cnblogs.com/keam37/ keam所有 转载请注明出处 

    一、中国剩余问题:

    对方程组

         x≡ai(mod ni) i=1,2,3……

    求解x的问题。

       结合拓展欧几里得算法我们可以知道

    对于一个同余方程

                x≡a(mod n)等价于  x+ny=a

    利用拓展欧几里得算法可以将其解出

    对于方程组很容易想到求 解的交集 的方法

    对于两个方程

                 x≡a1 (mod m1);

                 x≡a2 (mod m2);

    令 x=m1*k+a1……①

       则有 m1*k+a1≡a2 (mod m2);

       可以得到 k*m1≡(a2-a1) (mod m2)

       可以用欧几里得算法求出k0=x0*((a2-a1)/gcd(m1,m2)) mod m2;

       k=k0+i*(m2/gcd(m1,m2));i=0,1,2……(注意 这里要使k有解 必满足 gcd(m1,m2)|(a2-a1))

       有k≡k0 (mod m2/gcd(m1,m2))  

       即k=(m2/gcd(m1,m2))*t+k0;代入式①

       有x=[m1,m2]*t+m1*k0+a1;([m1,m2]为m1 和 m2 的最小公倍数)

       则可重新构造同余方程

                x≡(m1*k0+a1) (mod [m1,m2])

       再用新的方程联立下一个 最后得到的(m1*k0+a1)即为方程组的解。

       代码

       

     1 __int64 exgcd(__int64 a,__int64 b,__int64 &x,__int64 &y)//拓展欧几里得,返回gcd(a,b)
     2 {
     3     __int64 r;
     4     if(b==0)
     5     {
     6         x=1;y=0;
     7         return a;
     8     }
     9     r=exgcd(b,a%b,x,y);
    10     __int64 t=x;
    11     x=y;
    12     y=t-a/b*y;
    13     return r;
    14 }
    15 __int64 build(__int64 &x1,__int64 &y1,__int64 x2,__int64 y2)
    16 {
    17     __int64 k,x,y,d;
    18     d=exgcd(y1,y2,x,y);
    19     if((x2-x1)%d) return -1;
    20     k=(x*(x2-x1)/d)%y2;
    21     if(k<0) k+=y2;
    22     __int64 lcd;
    23     if(y1%y2 && y2%y1) lcd=y1*y2/d;
    24     else lcd=y1>y2?y1:y2;           //lcd为y1,y2的最小公倍数
    25     x1=(y1*k+x1)%lcd;y1=lcd;
    26     return x1;
    27 }
    View Code

       下面讨论的是中国剩余定理更多的应用:

      

       二、利用中国剩余定理的计算机算术运算(待完善)

    参考书目:《算法导论》、《初等数论及其应用》

  • 相关阅读:
    RAM,ROM,内存还有硬盘到底有什么区别呢
    MySQL中的这个池子
    apk安装包介绍(下载安装,存储的位置,路径,可以对里面的文件进行修改吗)
    论文查询
    PID算法
    数组指针与指针数组
    2020 最佳开源项目出炉
    反射机制调用无参和有参方法以及调用私有方法
    CSS概述 CSS声明
    WEB概述
  • 原文地址:https://www.cnblogs.com/keam37/p/3417244.html
Copyright © 2011-2022 走看看