最大公约数与最小公倍数
1. 求最大公约数
// 欧几里得算法
int gcf(int a, int b){
return !b?a:gcf(b,a%b);
}
2. 求最小公倍数
最小公倍数=数1*数2/最大公约数
3. 二元一次方程整数解
方程 存在整数解的充要条件是 .
设 是方程 的一组整数解,则 为方程 的一组整数解。
设 是方程 的一组整数解,则方程的通解为
// 求解方程 ax+by=gcf(a,b) ,最后函数返回 gcf
int exgcf(int a, int b, int& x, int& y){
if(b==0){
x=1;
y=0;
return a;
}
int g=exgcf(a,a%b,x,y);
int tmp=x;
x=y;
y=tmp-a/b*y;
return g;
}
// 求解方程 ax+by=c
int solve(int a, int b, int c, int& x, int& y){
int g=exgcf(a,b,x,y);
if(c%gcf!=0) return 0; // 无整数解
x=c*x/gcf;
y=c*y/gcf;
return 1;
}
4. 同余式求解
同余式 等价于 ,即存在整数 y ,使得 。
- 若 ,则同余式方程 无解。
- 若 ,则同余式方程 恰有 个模 意义下不同的解,解为 ,其中 , 是方程 的一个解。
5. 乘法逆元求解
已知 ,则 ,其中 .这里需要用到逆元。
设 且有 ,则称 互为乘法逆元。求解逆元即求解同余式方程 ,且在 内有唯一解,实际使用中一般称方程在 内的解为 的逆元。
由此
- 若 ,则 不存在模 的逆元。
- 若 ,则存在逆元如下
int inverse(int a, int m){
int x, y;
int g=exgcf(a,m,x,y);
return (x%m+m)%m;
}
费马小定理:设 是素数, 是任意整数且 ,则
当 时,逆元等于
6. ChangeLog
2018.09.04 初稿