最大公约数与最小公倍数

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 初稿

results matching ""

    No results matching ""