1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
| 扩展欧几里得算法
给定两个非0整数a,b,求一组整数解(x,y),使得ax+by=gcd(a,b)成立
其中gcd(a,b)表示a和b的最大公约数
int exgcd(int a,int b,int &x,int &y){
if(b==0){
x=1;
y=0;
return a;
}
int g=exgcd(b,a%b,x,y);//递归计算exgcd(b,a%b)
int temp=x;
x=y;
y=temp-a/b*y;
return g;//g是gcd
/*
通过x=y(old); y=x(old)-a/b*y(old);来倒推结果
tips:a%b=a-(a/b)*b和ax1+by1=bx2+(a%b)y2退出上式
*/
}
通过上面的方法求出的是一组解,
ax+by=gcd(a,b)的通解为:
x'=x+b/gcd*K (K为任意整数)
y'=y-a/gcd*K
其中,最小的非负整数解为x=(x%(b/gcd)+b/gcd)%(b/gcd);y同理
再者:得到ax+by=c的解为(存在解的充要条件为c%gcd==0)
x'=x+b/gcd*K=cx0/gcd+b/gcd*K; (K为任意整数,注意周期不能变为cb/gcd^2,因为周期会放大,漏解)
y'=y-a/gcd*K=cy0/gcd-b/gcd*K;
-----------------
同余式ax==c(mod m)的求解(如果m整除a-b即(a-b)%m==0,那么就说a与b模m同余 )
设a,c,m是整数,其中m>=1,则
1、若c%gcd(a,m)!=0,则同余方程ax==c(mod m)无解
2、若c%gcd(a,m)==0,则同余方程ax==c(mod m)恰好有gcd(a,m)个模m意义下不同的解,
且解的形式为:x'=x+m/gcd(a,m)*K;其中K=0,1,....gcd(a,m)-1,x是ax+my=c的一个解
--------------
逆元
假设a、b、m是整数,m>1,且有ab==1(mod m)成立,那么就说a和b互为模m的逆元
如果gcd(a,m)!=1,那么同余式ax==1(mod m)无解,a不存在模m的逆元
若果gcd(a,m)==1,那么同余式ax==1(mod m)在(0,m)上有唯一解
int inverse(int a,int m){
int x,y;
int g=exgcd(a,m,x,y);
return (x%m+m)%m;
}
费马小定理:设m是素数,a是任意整数且a!==0(mod m),则a^(m-1)==1(mod m);
其中a^(m-1)=a*a^(m-2)=1(mod m);得到a^(m-2)%m就是a模m的逆元
|