同余、中国剩余定理

同余:a≡b (mod m),表示a % m==b % m

同余式的运算法则:

--------------------------------------------------------------------------------------------------------------

 

中国剩余定理出自《孙子算经》中的一个问题:
  有物不知其数,三三数之剩二,五五数之剩三,七七数之剩二。问物几何?
这道题实际上就是解这么一个同余方程组:
x≡2 (mod 3)
x≡3 (mod 5)
x≡2 (mod 7)  求解x

 

中国剩余定理:求解同余方程组
n≡a[1] (mod m[1])
n≡a[2] (mod m[2])
......
n≡a[i]  (mod m[i])
该方程组有解的条件:m[i]两两互质


至于该方程的解法,wikipedia上解释得很详细:

 1  int extend_gcd(int a,int b,int &x,int &y){
 2      if (b==0){
 3          x=1;y=0;
 4          return a;
 5      }
 6      else{
 7          int r=extend_gcd(b,a%b,y,x);
 8          y=y-x*(a/b);
 9          return r;
10      }
11  }
12  
13  int CRT(int a[],int m[],int n)
14  {
15      int M=1;
16      for (int i=1;i<=n;i++) M*=m[i];
17      int ret=0;
18      for (int i=1;i<=n;i++)
19      {
20          int x,y;
21          int tm=M/m[i];
22          extend_gcd(tm,m[i],x,y);
23          ret=(ret+tm*x*a[i])%M;
24      }
25      return (ret+M)%M;
26  }
27 
28  

 

//Reference:http://blog.csdn.net/cyendra/article/details/38402869
    中国剩余定理还有一种迭代解法:
    Reference:http://scturtle.is-programmer.com/posts/19363.html

转载于:https://www.cnblogs.com/pdev/p/4067291.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值