同余的一些知识点整理

同余

定义

数论讲义上给的定义是

给定一个正整数 m m m ,如果用 m m m 去除两个整数 a a a b b b 所得到的余数相同,我们就说 a , b a,b a,b 对模数 m m m 同余,记作 a ≡ b ( m o d    m ) a \equiv b(\mod m) ab(modm).

同时给出 a , b a,b a,b 对模数 m m m 同余的充要条件是

m ∣ ( a − b ) m \vert (a - b) m(ab)

欧几里得算法

欧几里得算法,即辗转相除法,用于计算两个数的最大公约数 gcd ⁡ \gcd gcd

公式 gcd ⁡ ( a , b ) = gcd ⁡ ( b , a m o d    b ) , b ≠ 0 \gcd(a,b) = \gcd(b, a \mod b), b \neq 0 gcd(a,b)=gcd(b,amodb),b=0

同时,若 a m o d    b = 0 a \mod b = 0 amodb=0 , b b b 即为最大公约数

int gcd(int a, int b){
    return b ? gcd(b, a % b) : b;
}
裴蜀定理

百度百科的定义如下

a , b a,b a,b 是整数,且 gcd ⁡ ( a , b ) = d \gcd(a,b) = d gcd(a,b)=d,那对任意的整数 x , y , a x + b y x,y,ax+by x,y,ax+by 都一定是 d d d 的倍数,特别地,一定存在整数 x , y x,y x,y, 使得 a x + b y = gcd ⁡ ( a , b ) ax+by=\gcd(a, b) ax+by=gcd(a,b)

也就是说二元一次不定方程 a x + b y = c ax+by = c ax+by=c 有解的充要条件是 gcd ⁡ ( a , b ) ∣ c \gcd(a,b) | c gcd(a,b)c

扩展欧几里得算法

根据裴蜀定理有
a x + b y = gcd ⁡ ( a , b ) b x 0 + ( a m o d    b ) y 0 = gcd ⁡ ( b , a m o d    b ) ax+by = \gcd(a,b)\\ bx_0 + (a \mod b)y_0=\gcd(b, a \mod b) ax+by=gcd(a,b)bx0+(amodb)y0=gcd(b,amodb)

同时根据欧几里得算法有
gcd ⁡ ( a , b ) = gcd ⁡ ( b , a m o d    b ) a x + b y = b x 0 + ( a m o d    b ) y 0 a x + b y = b x 0 + ( a − ⌊ a b ⌋ ∗ b ) y 0 a x + b y = a y 0 + b ∗ ( x 0 − ⌊ a b ⌋ ∗ y 0 ) \gcd(a,b) = \gcd(b, a \mod b) \\ ax+by =bx_0 + (a \mod b)y_0\\ ax+by =bx_0 + (a - \lfloor \frac a b \rfloor * b) y_0 \\ ax + by = ay_0 + b* (x_0 -\lfloor \frac a b \rfloor * y_0 ) gcd(a,b)=gcd(b,amodb)ax+by=bx0+(amodb)y0ax+by=bx0+(abab)y0ax+by=ay0+b(x0bay0)
因此我们得到了 x , y x,y x,y 的一组解
{ x = y 0 y = x 0 − ⌊ a b ⌋ ∗ y 0 \left\{ \begin{array}{rcl} x = y_0\\ y = x_0 -\lfloor \frac a b \rfloor * y_0 \end{array}\right. {x=y0y=x0bay0

特别地,当 b = 0 b = 0 b=0 ,显然有 x 0 = 1 , y 0 = 0 x_0 = 1, y_0 = 0 x0=1,y0=0

因此我们可以在 gcd ⁡ \gcd gcd 的同时递归更新 x , y x,y x,y

int ecgcd(int a, int b,int &x, int &y){
    if (b == 0){
        x = 1, y = 0;
        return a;
    }
    int d = exgcd(b, a % b, x, y);
    int tmp = x;
    x = y;
    y = tmp - a / b * y;
    return d;
}

以上程序给出了二元一次不定方程 a x + b y = gcd ⁡ ( a , b ) ax+by = \gcd(a,b) ax+by=gcd(a,b) 的一组解。但实际应用中一般是给你 a , b , c a,b,c a,b,c,让你求
a x + b y = c ax+by=c ax+by=c
的最小整数解 x x x

根据裴蜀定理,我们知道二元一次不定方程 a x + b y = c ax+by = c ax+by=c 有解的充要条件是 gcd ⁡ ( a , b ) ∣ c \gcd(a,b) | c gcd(a,b)c

对于 gcd ⁡ ( a , b ) ∤ c \gcd(a,b) \nmid c gcd(a,b)c,显然是无解。

d = gcd ⁡ ( a , b ) d = \gcd(a,b) d=gcd(a,b),假设我们已经求出 a x + b y = d ax+by = d ax+by=d 的一组解 x 0 , y 0 x_0, y_0 x0,y0,两边同乘 c d \frac c d dc,得
a x 0 ∗ c d + b y 0 ∗ c d = d ∗ c d = c ax_0 *\frac c d + by_0 * \frac c d = d * \frac c d = c ax0dc+by0dc=ddc=c
因此我们得到一组解
{ x ′ = x 0 ∗ c d y ′ = y 0 ∗ c d \left\{ \begin{array}{rcl} x' = x_0 *\frac c d \\ y' = y_0 * \frac c d \end{array}\right. {x=x0dcy=y0dc

当然这个 x ′ x' x 显然不是最小整数解,考虑将 x ′ x' x k ∗ b d k*\frac b d kdb 。为保证等式成立, y ′ y' y 应该加上 k ∗ a d k * \frac a d kda

因此我们得到了方程的一般解
{ x = x 0 ∗ c d − k ∗ b d y = y 0 ∗ c d + k ∗ a d \left\{ \begin{array}{rcl} x = x_0 *\frac c d - k*\frac b d\\ y = y_0 * \frac c d + k * \frac a d \end{array}\right. {x=x0dckdby=y0dc+kda
而对于的最小整数解 x x x ,我们可以通过取模运算来得到

x *= abs(c / d);
x = (x % abs(b / d) + abs(b / d)) % abs(b / d); 
扩展欧几里得算法解同余方程

给定同余方程
a x ≡ 1 ( m o d    b ) ax \equiv 1 (\mod b) ax1(modb)
求最小整数解 x x x

根据同余的充要条件,有
b ∣ ( a x − 1 ) b \vert (ax - 1) b(ax1)
不妨设
a x − 1 = b y ′ ax - 1 = by' ax1=by

移项得
a x − b y ′ = 1 ax - by' = 1 axby=1


y = − y ′ y = -y' y=y
因此原题就是求二元一次不定方程 a x + b y = 1 ax+by = 1 ax+by=1 的解。

逆元

给定正整数 a a a m m m ,如果有 a x ≡ 1 ( m o d    m ) ax \equiv 1(\mod m) ax1(modm), 那么把这个同余方程中 x x x 的最小整数解叫做 a a a m m m 的逆元,其中这个 x x x 记作 a − 1 a^{-1} a1 ,其中逆元又被称为数论倒数。

求解逆元的方法即为上述扩展欧几里得算法解同余方程。

特别地,当 m m m 为质数,根据费马小定理有 x = a m − 2 x = a^{m - 2} x=am2

中国剩余定理(孙子定理)

给定同余方程组
{ x ≡ a 1 ( m o d    m 1 ) x ≡ a 2 ( m o d    m 2 ) x ≡ a 3 ( m o d    m 3 ) ⋯ x ≡ a n ( m o d    m n ) \left\{ \begin{array}{rcl} x \equiv a_1 (\mod m_1) \\ x \equiv a_2 (\mod m_2) \\ x \equiv a_3 (\mod m_3) \\ \cdots\qquad\qquad\\ x \equiv a_n (\mod m_n) \\ \end{array}\right. xa1(modm1)xa2(modm2)xa3(modm3)xan(modmn)
m i m_i mi 两两互质,则方程有唯一解。


M = ∏ i = 1 n m i M i = M m i M i t i ≡ 1 ( m o d    m i ) M =\prod\limits_{i = 1}^n m_i \\ M_i = \frac{M}{m_i}\\ M_it_i \equiv 1(\mod m_i) M=i=1nmiMi=miMMiti1(modmi)
则唯一解
x = ( ∑ i = 1 n a i M i t i ) m o d    M x =( \sum \limits_{i = 1}^n a_iM_it_i) \mod M x=(i=1naiMiti)modM
说明一点,这个解是构造出来的,不是求出来的。因此不给出证明,读者可带入自行验证即可领会构造原理。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值