1、互质
中国剩余定理是求解下面这一类问题
设m1,m2,…,mk是两两互素的正整数,即gcd(mi,mj) =1,i≠j,i,j = 1,2,…,k
则同余方程组:
x≡b1 (mod m1)
x≡b2 (mod m2)
…
x≡bk (mod mk)
模[m1,m2,…,mk]有唯一解,即在[m1,m2,…,mk]的意义下,存在唯一的x,满足:x≡bi mod [m1,m2,…,mk],i = 1,2,…,k
求解满足x的值
一个经典例题:
《孙子算经》中的题目:有物不知其数,三个一数余二,五个一数余三,七个一数又余二,问该物总数几何?
上面的例子化成数学公式就是
x ≡ 2 (mod 3) 式①
x ≡ 3 (mod 5) 式②
x ≡ 2 (mod 7) 式③
求解x
要懂中国剩余定理首先要知道两个定理:
定理1:两个数相加,如果存在一个加数,不能被整数a整除,那么它们的和,就不能被整数a整除。即:如果a%b=c,则 (a+k*b)%b=c
定理2:两数不能整除,若除数扩大(或缩小)了几倍,而被除数不变,则其商和余数也同时扩大(或缩小)相同的倍数(余数必小于除数)。即:如果a%b=c,(a * k)%c=k*c
假设x1%3=2,x2%5=3,x3%7=2;
根据定理1:
1、
要使(x1+x2)%3=2,x2必须是3的倍数
要使(x1+x2)%5=3,x1必须是5的倍数
2、
要使(x1+x2+x3)%3=2,则x2、x3必须是3的倍数;
要使(x1+x2+x3)%5=3,则x1、x3必须是5的倍数;
要使(x1+x2+x3)%7=2,则x1、x2必须是7的倍数;
3、所以
x1是5、7的倍数;
x2是3、7的倍数;
x3是3、5的倍数;
求解过程:
- 假设x1=5 * 7=35;
35%3=2 满足式①
x1=35;
即求(35 * x)+(3 * y)=2,中x的值(用扩展欧几里得求解) - 假设x2=3 * 7=21;
21%5=1
根据定理2:(21 * 3)%5=3 满足式②
x2=63
即求(21 x)+(5 * y)=3,中x的值* - 假设x3=3 * 5=15;
15%7=1
根据定理2:(15 * 2)%5=2 满足式③
x3=30
即求(35 * x)+(3 * y)=2,中x的值 - (x1+x2+x3)满足式①②③,但求得的值不一定是最小正整数,最后在对(3 * 5 * 7)取模即可
2、不互质
这个我不太会证明,下面这张图解释的也挺详细的
模板1
//除数两两互质的模板
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
const int Max=1e5+10;
typedef long long ll;
ll m[Max],r[Max];
ll exgcd(ll a,ll b,ll &x,ll &y)
{
if(b==0)
{
x=1,y=0;
return a;
}
ll gcd=exgcd(b,a%b,x,y);
ll t=y;
y=x-(a/b)*y;
x=t;
return gcd;
}
ll China(int n)
{
ll sum=1,a,b,c,gcd,ans=0,x,y;
for(int i=0;i<n;i++)
sum*=m[i];
for(int i=0;i<n;i++)
{
a=sum/m[i];b=m[i];c=r[i];
gcd=exgcd(a,b,x,y);
ans=(ans+a*x*(c/gcd))%sum;
}
return (ans