#1096. 同余问题

同余问题

No testdata at current.

No submission language available for this problem.

一、同余概述


基本定义和定理

定义1:给定正整数 mm,若用 mm 除两个整数 aabb 所得得余数相同,称 aabb 对模 mm 同余,记作 ab(mod m)a≡b(mod\ m)

定义2:整数的集合被分为 mm 个不同的集合,这些集合被称为模 mm 剩余类(同余类)。每个同余类中的任意两个整数都是模 mm 同余的。


定理1ab(mod m)a≡b(mod\ m) 当且仅当 m(ab)m|(a-b)

:令 a=k1m+ra = k_1*m+rb=k2m+rb=k_2*m+r,两式相减有 ab=(k1k2)ma-b = (k_1-k_2)*m,证毕。


定理2ab(mod m)a≡b(mod\ m) 当且仅当存在整数 kk,使得 a=b+kma =b+km


费马小定理:若 pp 是质数,则对于任意整数 aa,有 apa(mod p)a^p≡a(mod\ p)视频讲解


欧拉定理:若正整数 aa, nn 互质,则 aφ(n)1(mod n)a^{\varphi(n)}≡1(mod\ n) 其中 φ(n)\varphi(n) 为欧拉函数。

欧拉定理的推论:若正整数 aa, nn 互质,则对于任意正整数 bb,有 abab mod φ(n)(mod n)a^b≡a^{b\ mod\ \varphi(n)}(mod\ n)

扩展欧拉定理:若正整数 aann 不互质,则对于任意正整数 bb,有 abab mod φ(n)+φ(n)(mod n)a^b≡a^{b\ mod\ \varphi(n)+\varphi(n)}(mod\ n)

计算星期几


同余的性质

对于整数 aa, bb, cc 和自然数 mm, nn, 对模 mm 同余满足:

自反性aa(mod m)a≡a(mod\ m)

对称性:若 ab(mod m)a≡b(mod\ m),则 ba(mod m)b≡a(mod\ m)

传递性:若 ab(mod m)a≡b(mod\ m)bc(mod m)b≡c(mod\ m),则 ac(mod m)a≡c(mod\ m)

同加性:若 ab(mod m)a≡b(mod\ m),则 a+cb+c(mod m)a+c≡b+c(mod\ m)

同乘性:若 ab(mod m)a≡b(mod\ m),则 acac(mod m)ac≡ac(mod\ m)

一般地,ab(mod m)a≡b(mod\ m)cd(mod m)c≡d(mod\ m),则有:acbd(mod m)ac≡bd(mod\ m)

同幂性:若 ab(mod m)a≡b(mod\ m),则 anbn(mod m)a^n≡b^n(mod\ m)

a mod p=xa\ mod\ p=xa mod q=xa\ mod\ q=x,其中 pp,qq 互质,则 a mod (pq)=xa\ mod\ (pq) = x


二、扩展欧几里得算法


欧几里得算法描述: a,bN\forall a, b \in N, b0b\not=0, gcd(a,b)=gcd(b,a%b)gcd(a, b) = gcd(b, a\% b)


定理1:设 aabb 不全为 00,则存在整数 xxyy,使得 ax+by=gcd(a,b)ax + by = gcd(a, b);

当欧几里得算法计算至最后一步时,当 b=0b = 0 时,gcd(a,b)=agcd(a,b) = a。因为 1a+00=a1*a+0*0 =a,所以 ax+by=gcd(a,b)ax + by = gcd(a, b) 存在一组解:(x,y)=(1,0)(x, y) = (1, 0)

b0b\not=0 时,递归计算 gcd(b,a%b)gcd(b, a\%b)。假设存在一组 (x,y)(x', y') 满足 bx+(a%b)y=gcd(b,a%b)=gcd(a,b)bx'+(a\%b)y'=gcd(b,a\%b) =gcd(a, b).

则,bx+(aa/bb)y=gcd(a,b)bx'+(a-a/b*b)y'=gcd(a, b),此刻 / 表示整除

整理得到:ay+b(xa/by)=gcd(a,b)ay'+b(x'-a/b*y')=gcd(a, b)

(x,y)=(y,xa/by)(x, y) = (y', x'-a/b*y'),则有 ax+by=gcd(a,b)ax+by=gcd(a,b)

递归运算至 b=0b=0 ,以 (x,y)=(1,0)(x,y) = (1,0) 归纳计算至 gcd(a,b)gcd(a,b) 即可。

参考代码

// 求解 ax+by=gcd(a,b) 的一组解 (x, y),d=gcd(a,b)

void exgcd(int a, int b, int &d, int &x, int &y) {
    int t;
    if (b == 0) { d = a; x = 1; y = 0; }
    else {
        exgcd(b, a%b, d, x, y);
        t = x; x = y; y = t - (a/b)*y;
    }
}

定理2:对于不定方程 ax+by=cax+by=c,当且仅当 gcd(a,b)cgcd(a,b)|c 时,方程有解