同余问题详解

同余问题学习笔记

1.同余符号

若任意两个整数 a , b a,b a,b m m m 的值是相同的,那么我们可以表示成以下形式
a ≡ b ( m o d m ) a\equiv b \pmod m ab(modm)
读作: a a a 同余于 b b b m m m ,或读作 a a a b b b 对模 m m m 同余

2.同余符号的性质

1.反身性: a ≡ a ( m o d m ) a \equiv a \pmod m aa(modm)

证明: a a a m m m 一定等于 a a a m m m

2.对称性:若 a ≡ b ( m o d m ) a \equiv b \pmod m ab(modm),则 b ≡ a ( m o d m ) b \equiv a \pmod m ba(modm)

证明: a a a b b b 同余, b b b 一定和 a a a 同余。

3.传递性:若 a ≡ b ( m o d m ) a \equiv b \pmod m ab(modm) b ≡ c ( m o d m ) b \equiv c \pmod m bc(modm),则 a ≡ c ( m o d m ) a \equiv c \pmod m ac(modm)

证明:设 a , b , c a,b,c a,b,c m m m 取余分别为 x , y , z x,y,z x,y,z ,那么 x = y , y = z , x = z x=y,y=z,x=z x=y,y=z,x=z

4.同余式相加:若 a ≡ b ( m o d m ) a \equiv b \pmod m ab(modm) c ≡ d ( m o d m ) c \equiv d \pmod m cd(modm),则 , a ± c ≡ b ± d ( m o d m ) a \pm c \equiv b \pm d \pmod m a±cb±d(modm)

5.同余式相乘:若 a ≡ b ( m o d m ) a \equiv b \pmod m ab(modm) c ≡ d ( m o d m ) c \equiv d \pmod m cd(modm),则 a c ≡ b d ( m o d m ) ac \equiv bd \pmod m acbd(modm)

然后当 a , b a,b a,b m m m 同余的时候,那么 m ∣ ( a − b ) m|(a-b) m(ab)

那么我们 a a a 看成 k m + r km+r km+r ,这里 k k k a / m a/m a/m 的商, r r r a m o d    m a \mod m amodm ,同理,我们将 b b b 看成 l m + r lm+r lm+r

那么我们将 m m m 提出来,两数相减即为 ( k − l ) m (k-l)m (kl)m 所以 a − b a-b ab 即为 m m m 的倍数。

3.相关定理

1.裴蜀定理

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 = d ax+by=d ax+by=d 成立

证明:

既然是求 gcd ⁡ \gcd gcd ,我们就可以模拟一下欧几里得算法(可以先看后面)

我们设 a ≤ b a \leq b ab ,由辗转相除法的过程 gcd ⁡ ( x , y ) = gcd ⁡ ( y , x m o d    y ) \gcd(x,y)=\gcd(y,x \mod y) gcd(x,y)=gcd(y,xmody),可以得到

b = a x 1 + r 1 b=ax_1+r_1 b=ax1+r1,那么 b m o d    a b \mod a bmoda b = r 1 b=r_1 b=r1

重复过程,得到以下式子:
b = a x 1 + r 1 a = a x 2 + r 2 r 1 = r 2 x 3 + r 3 . . . . . . r k − 3 = r k − 2 x k − 1 + r k − 1 ( 1 ) r k − 2 = r k − 1 x k + r k ( 2 ) r k − 1 = r k x k + 1 + r k + 1 b=ax_1+r_1\\ a=ax_2+r_2\\ r_1=r_2x_3+r_3\\ ......\\ r_{k-3}=r_{k-2}x_{k-1}+r_{k-1}(1)\\ r_{k-2}=r_{k-1}x_k+r_{k}(2)\\ r_{k-1}=r_{k}x_{k+1}+r_{k+1} b=ax1+r1a=ax2+r2r1=r2x3+r3......rk3=rk2xk1+rk1(1)rk2=rk1xk+rk(2)rk1=rkxk+1+rk+1
因为辗转相除法最后得到的余数为 0 0 0,在这里,我们不妨设 r k + 1 = 0 r_{k+1}=0 rk+1=0 ,那么, r k r_k rk 就是 a , b a,b a,b 的最大公约数,即 r k = d r_k=d rk=d ,将这个东西带入 ( 2 ) (2) (2) 式子,那么这个时候我们得到以下式子
r k − 2 = r k − 1 x k + d r_{k-2}=r_{k-1}x_k+d rk2=rk1xk+d
移项得到
d = r k − 2 − r k − 1 x k ( 3 ) d=r_{k-2}-r_{k-1}x_k(3) d=rk2rk1xk(3)
( 1 ) (1) (1) 式子移项
r k − 1 = r k − 3 − r k − 2 x k ( 4 ) r_{k-1}=r_{k-3}-r_{k-2}x_{k}(4) rk1=rk3rk2xk(4)
( 4 ) (4) (4) 式带入 ( 3 ) (3) (3)

d = r k − 2 − ( r k − 3 − r k − 2 x k ) x k d=r_{k-2}-(r_{k-3}-r_{k-2}x_{k})x_{k} d=rk2(rk3rk2xk)xk

把式子展开

d = m 1 r k − 2 + n 1 r k − 3 d=m_1r_{k-2}+n_1r_{k-3} d=m1rk2+n1rk3

很明显,我们上面用的都是整数,所以 m 1 , n 1 m_1,n_1 m1,n1 肯定也都是整数,那如果我们把原来的 ( 3 ) (3) (3) 式子转化成这种形式 d = m r k − 1 + n r k − 2 d=mr_{k-1}+nr_{k-2} d=mrk1+nrk2

我们将这个式子跟上面的一对比,是不是发现了什么规律?

d = m k a + n k b d = m_ka+n_kb d=mka+nkb

我们知道, m k m_k mk n k n_k nk 都是整数,故 a x + b y = d ax+by=d ax+by=d 一定有整数解。


推论1:对于方程 a x + b y = 1 ax + by = 1 ax+by=1 , 只有当整数 a , b a,b a,b 互质时,方程才有整数解.

反证法:

a , b a,b a,b 不是互质的,那么 a , b a,b a,b 可以表示成 a = q ∗ gcd ⁡ ( a , b ) a=q*\gcd(a,b) a=qgcd(a,b) b = p ∗ gcd ⁡ ( a , b ) b=p*\gcd(a,b) b=pgcd(a,b), 带入上面的式子,易得
q ∗ gcd ⁡ ( a , b ) ∗ x + p ∗ gcd ⁡ ( a , b ) ∗ y = 1 q*\gcd(a,b)*x+p*\gcd(a,b)*y=1 qgcd(a,b)x+pgcd(a,b)y=1
如果两边同时除以一个 gcd ⁡ ( a , b ) \gcd(a,b) gcd(a,b),得到:
q x + p y = 1 gcd ⁡ ( a , b ) qx+py=\frac{1}{\gcd(a,b)} qx+py=gcd(a,b)1
显然,如果 a , b a,b a,b 不是互质的话,那么等式右边就是一个小数,所以该方程不存在整数解,得证。

另外,可以得到 a , b a,b a,b 互质的充要条件就是 a x + b y = 1 ax+by=1 ax+by=1 要有整数解


推论2: 对于方程 a x + b y = z ax+by=z ax+by=z , 只有满足 gcd ⁡ ( a , b ) ∣ z \gcd(a,b)|z gcd(a,b)z ,方程才有整数解

证明:

d = gcd ⁡ ( a , b ) d=\gcd(a,b) d=gcd(a,b) z = d ∗ q z=d*q z=dq

对于方程 a x + b y = d ax+by=d ax+by=d ,我们有一组解 x 1 , y 1 x_1,y_1 x1,y1,那么就有:
a x 1 + b y 1 = d ax_1+by_1=d ax1+by1=d
两边同时乘上 q q q ,易得:
a x 1 ∗ q + b y 1 ∗ q = d ∗ q ax_1*q+by_1*q=d*q ax1q+by1q=dq
因为 z = d ∗ q z=d*q z=dq

所以方程 a x + b y = z ax+by=z ax+by=z ,一定存在一组整数解 x = x 1 ∗ q , y = y 1 ∗ q x=x_1*q,y=y_1*q x=x1q,y=y1q,得证。

2.欧几里得算法

欧几里得算法的目的是简单的求出两个正整数的最大公因数。

那么我们证明一下这个算法:

c = gcd ⁡ ( a , b ) c=\gcd(a,b) c=gcd(a,b),设 a = m c , b = n c a=mc,b=nc a=mcb=nc
a ÷ b = k . . . . . . r a÷b=k......r a÷b=k......r可得 r = a − k b = m c − k n c = ( m − k n ) c r=a-kb=mc-knc=(m-kn)c r=akb=mcknc=(mkn)c
第二步不难看出, c c c 也是 r r r 的因数;
列出 b = n c b=nc b=nc r = ( m − k n ) c r=(m-kn)c r=(mkn)c ,如果 n n n m − k n m-kn mkn 互质,即两者公约数只有 1 1 1 ,则表明 c c c b b b r r r 的最大公约数,后续证明 n n n m − k n m-kn mkn 互质;
假设 m − k n m-kn mkn n n n 不是互质,两者有一非零的最大公约数 d d d ,且 d > 1 d>1 d1
则有 $m-kn=xd , , n=yd$,得 m = k n + x d = k y d + x d = ( k y + x ) d m=kn+xd=kyd+xd=(ky+x)d m=kn+xd=kyd+xd=(ky+x)d ,则 a = m c = ( k y + x ) d c a=mc=(ky+x)dc a=mc=(ky+x)dc b = n c = y c d b=nc=ycd b=nc=ycd,则 a a a b b b 的一个公约数 c d > c cd>c cdc,故 c c c 不是 a a a b b b 的最大公约数,这与前面提到的 c c c a a a b b b 的最大公约数假设矛盾;
m − k n m-kn mkn n n n 为互质,即 c c c b b b r r r 的最大公约数,且是 a a a b b b 的最大公约数,得证。

此算法实现流程图:

vK4hkD.png](https://imgtu.com/i/vK4hkD)

3.扩展欧几里得算法

对于求解方程 a x + b y = gcd ⁡ ( a , b ) ax+by=\gcd(a,b) ax+by=gcd(a,b)

先考虑特殊情况,如果 b = 0 b=0 b=0 ,那么 gcd ⁡ ( a , b ) = a \gcd(a,b)=a gcd(a,b)=a,显然存在一组解 x = 1 , y = 0 x=1,y=0 x=1,y=0

设之前的方程为 a x 1 + b y 1 = gcd ⁡ ( a , b ) ax_1+by_1=\gcd(a,b) ax1+by1=gcd(a,b) ,肯定存在式子 b x 2 + ( a m o d    b ) y 2 = gcd ⁡ ( b , a m o d    b ) bx_2 +(a\mod b)y_2=\gcd(b,a \mod b) bx2+(amodb)y2=gcd(b,amodb)

根据刚刚讲的欧几里得算法, gcd ⁡ ( a , b ) = gcd ⁡ ( b , a m o d    b ) \gcd(a,b)=\gcd(b,a \mod b) gcd(a,b)=gcd(b,amodb)

所以 a x 1 + b y 1 = b x 2 + ( a m o d    b ) ax_1+by_1=bx_2+(a \mod b) ax1+by1=bx2+(amodb)

因为 a m o d    b = a − a / b ∗ b a \mod b=a-a/b*b amodb=aa/bb

所以 a x 1 + b y 1 = b x 2 + ( a − a / b ∗ b ) ∗ y 2 ax_1+by_1=bx_2+(a-a/b*b)*y_2 ax1+by1=bx2+(aa/bb)y2

a x 1 + b y 1 = b x 2 + a − a / b ∗ b ∗ y 2 ax_1+by_1=bx_2+a-a/b*b*y_2 ax1+by1=bx2+aa/bby2

a x 1 + b y 1 = a y 2 + b ( x 2 − a / b ∗ y 2 ) ax_1+by_1=ay_2+b(x_2-a/b*y_2) ax1+by1=ay2+b(x2a/by2)

所以 x 1 = y 2 , y 1 = x 2 − a / b ∗ y 2 x_1=y_2,y_1=x_2-a/b*y_2 x1=y2,y1=x2a/by2

code:

void exgcd(ll a, ll b)
{
    if(b == 0)
    {
        x = 1, y = 0;
        return;
    }
    exgcd(b, a % b);
    ll t = x;
    x = y;
    y = t - a / b * y;
}

然后我们这个东西还能求逆元,怎么求呢?

x x x a a a p p p 意义下的逆元,那么满足式子:

a x ≡ 1 ( m o d m ) ax \equiv 1 \pmod m ax1(modm)

那么有 a x + m y = 1 ax + my=1 ax+my=1, 接着用扩展欧几里得定理来做即可。

更加详细的理解
更加详细的理解

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值