模意义下的数和运算

模意义下的数和运算

一共有12个苹果,平分给5个小朋友,最后会剩下几个苹果?

12➗5 = 2…2

第一个2叫商,可以用12/5得到,第二个2叫余数,可以用12%5得到,%叫做模,也就是mod

定义1:模

对于整数a,b,满足b>0,则存在唯一的整数q,r,满足 a = b q + r a=bq+r a=bq+r,其中 0 ≤ r < b 0\leq r<b 0r<b 。其中称q为商、r为余数。余数用a mod b或者a%b来表示

1. ( a + b ) % M = ( a % M + b % M ) % M (a+b)\% M=(a\% M+b\% M)\% M (a+b)%M=(a%M+b%M)%M

将a个苹果分给小朋友剩下2个苹果,将b个苹果分给小朋友剩下3个苹果,那么将a+b个苹果分给小朋友剩下的苹果数量,等于把5个苹果分给小朋友剩下的数量

2. ( a − b ) % M = ( a % M − b % M ) % M (a-b)\% M=(a\% M-b\% M)\% M (ab)%M=(a%Mb%M)%M

即使有 a ≥ b a\geq b ab,但是也不能保证 a % M ≥ b % M a\% M\geq b\% M a%Mb%M,所以这种情况下我们可以优化

( a − b ) % M = ( a % M − b % M + M ) % M (a-b)\% M=(a\% M-b\% M+M)\% M (ab)%M=(a%Mb%M+M)%M

3. ( a × b ) % M = ( a % M × b % M ) % M (a\times b)\% M=(a\% M\times b\% M)\% M (a×b)%M=(a%M×b%M)%M
∃ a = x a M + r a , b = x b M + r b ∴ r a = a % M , r b = b % M a × b = x a x b M M + x b r a M + x a r b M + r a r b ∴ a × b = ( x a x b M + r a x b + r b x a ) M + r a r b ∵ x / M × M + ( x % M ) = x ∴ r a r b = r a r b / M × M + r a r b % M ∴ a × b = ( x a x b M + r a x b + r b x a + r a r b / M ) M + r a r b % M ∵ a % M % M = a % M ∴ ( a × b ) % M = ( r a × r b ) % M \exists a=x_aM+r_a,b=x_bM+r_b\\ \therefore r_a=a\%M,r_b=b\%M\\ a\times b=x_ax_bMM+x_br_aM+x_ar_bM+r_ar_b\\ \therefore a\times b=(x_ax_bM+r_ax_b+r_bx_a)M+r_ar_b\\ \because x/M\times M+(x\%M)=x\\ \therefore r_ar_b=r_ar_b/M\times M+r_ar_b\%M\\ \therefore a\times b=(x_ax_bM+r_ax_b+r_bx_a+r_ar_b/M)M+r_ar_b\%M\\ \because a\%M\%M=a\%M\\ \therefore (a\times b)\%M=(r_a\times r_b)\%M a=xaM+ra,b=xbM+rbra=a%M,rb=b%Ma×b=xaxbMM+xbraM+xarbM+rarba×b=(xaxbM+raxb+rbxa)M+rarbx/M×M+(x%M)=xrarb=rarb/M×M+rarb%Ma×b=(xaxbM+raxb+rbxa+rarb/M)M+rarb%Ma%M%M=a%M(a×b)%M=(ra×rb)%M
除法不成立

所有数mod b只有b种可能,分别是0,1,…,b-1,所以可以把所有整数分为b种类型

如果两个数mod b的结果相同,就分为同一类,叫做同余。

定义2:同余

若两数x,y除以b的余数相等,则称x,y模b同余,记作 x ≡ y ( m o d    b ) x\equiv y(\mod b) xy(modb)

同余的性质:

1.反身性: x ≡ x ( m o d    M ) x\equiv x(\mod M) xx(modM)

2.对称性:若 x ≡ y ( m o d    M ) x\equiv y(\mod M) xy(modM),则 y ≡ x ( m o d    M ) y\equiv x(\mod M) yx(modM)

3.传递性:若 x ≡ y ( m o d    M ) , y ≡ z ( m o d    M ) x\equiv y(\mod M),y\equiv z(\mod M) xy(modM),yz(modM),则 x ≡ z ( m o d    M ) x\equiv z(\mod M) xz(modM)

4.同加性:若 x ≡ y ( m o d    M ) x\equiv y(\mod M) xy(modM),则 x + z ≡ y + z ( m o d    M ) x+z\equiv y+z(\mod M) x+zy+z(modM)

5.同乘性:若 x ≡ y ( m o d    M ) x\equiv y(\mod M) xy(modM),则 x × z ≡ y × z ( m o d    M ) x\times z\equiv y\times z(\mod M) x×zy×z(modM)

6.同幂性:若 x ≡ y ( m o d    M ) x\equiv y(\mod M) xy(modM),则 x z ≡ y z ( m o d    M ) x^z\equiv y^z(\mod M) xzyz(modM)

7. x ≡ y ( m o d    M ) ⟺ b ∣ ( x − y ) x\equiv y(\mod M)\Longleftrightarrow b|(x-y) xy(modM)b(xy)
12 % 5 = 2 22 % 5 = 2 ∴ 22 ≡ 12 ( m o d    5 ) 多出来的 22 − 12 = 10 个苹果平分给了 5 个小朋友 每个小朋友多分到了 2 个苹果,一共多了 2 × 5 = 10 个苹果 如果每个小朋友多分到 x 个苹果,那么一共多了 5 x 个苹果,并且 5 一定是 5 x 的约数 所以可以表示成 : 5 ∣ ( 22 − 12 ) 12\%5=2\\ 22\%5=2\\ \therefore 22\equiv12(\mod5)\\ 多出来的22-12=10个苹果平分给了5个小朋友\\ 每个小朋友多分到了2个苹果,一共多了2\times5=10个苹果\\ 如果每个小朋友多分到x个苹果,那么一共多了5x个苹果,并且5一定是5x的约数\\ 所以可以表示成:5|(22-12) 12%5=222%5=22212(mod5)多出来的2212=10个苹果平分给了5个小朋友每个小朋友多分到了2个苹果,一共多了2×5=10个苹果如果每个小朋友多分到x个苹果,那么一共多了5x个苹果,并且5一定是5x的约数所以可以表示成:5∣(2212)

定义3:不定方程

不定方程:通常涉及两个或者更多未知数的多项式方程,求解尽在整数范围内进行

在本节中,只需要考虑 a x + b y = c ax+by=c ax+by=c的二元一次方程

定理1:裴蜀定理

裴蜀定理:对于整数a,b,设它们的最大公约数 g c d ( a , b ) = d gcd(a,b)=d gcd(a,b)=d,一定存在一组整数(x,y)使得 a x + b y = d ax+by=d ax+by=d

那么如何通过裴蜀定理来解决一般的 a x + b y = c ax+by=c ax+by=c的不定方程问题?

定理2:拓展欧几里得算法

对于整数a,b,c, a x + b y = c ax+by=c ax+by=c有整数解,当且仅当 g c d ( a , b ) ∣ c gcd(a,b)|c gcd(a,b)c时成立
充分性 : 若 c 为 g c d ( a , b ) 的倍数,那么可以先通过裴蜀定理找到一组 ( x , y ) 使得 a x + b y = g c d ( a , b ) 然后将 x , y 同时乘以 c g c d ( a , b ) ( 必然为整数 ) 就能得到 a x + b y = c 的一组解 必要性 : 若不定方程有解,则 a = t × g c d ( a , b ) , b = p × g c d ( a , b ) a x + b y = t × g c d ( a , b ) × x + p × g c d ( a , b ) × y = g c d ( a , b ) × ( t x + p y ) = m × g c d ( a , b ) ∴ g c d ( a , b ) ∣ c 充分性:\\ 若c为gcd(a,b)的倍数,那么可以先通过裴蜀定理找到一组(x,y)使得ax+by=gcd(a,b)\\ 然后将x,y同时乘以\frac{c}{gcd(a,b)}(必然为整数)\\ 就能得到ax+by=c的一组解\\ 必要性:\\ 若不定方程有解,则\\ a=t\times gcd(a,b),b=p\times gcd(a,b)\\ ax+by=t\times gcd(a,b)\times x+p\times gcd(a,b)\times y=gcd(a,b)\times(tx+py)=m\times gcd(a,b)\\ \therefore gcd(a,b)|c 充分性:cgcd(a,b)的倍数,那么可以先通过裴蜀定理找到一组(x,y)使得ax+by=gcd(a,b)然后将x,y同时乘以gcd(a,b)c(必然为整数)就能得到ax+by=c的一组解必要性:若不定方程有解,则a=t×gcd(a,b),b=p×gcd(a,b)ax+by=t×gcd(a,b)×x+p×gcd(a,b)×y=gcd(a,b)×(tx+py)=m×gcd(a,b)gcd(a,b)c
所以我们只需要考虑 a x + b y = g c d ( a , b ) = d ax+by=gcd(a,b)=d ax+by=gcd(a,b)=d的一组解就可以了

我们可以使用扩展欧几里得算法(exgcd)

欧几里得算法求出a,b的最大公约数

1.当b=0时,a,b的最大公约数就是a

2.求出b,a mod b的最大公约数,设为g0

3.令g=g0,g就是a,b的最大公约数

仿照这个过程,来求解不定方程

1.当b=0时, a x + b y = d ax+by=d ax+by=d的解为 x = d a x=\frac{d}{a} x=ad,y任意

2.求出 b x + ( a m o d    b ) y = d bx+(a\mod b)y=d bx+(amodb)y=d的一组解,设为 ( x 0 , y 0 ) (x_0,y_0) (x0,y0)

3.令 ( x , y ) = f ( ( x 0 , y 0 ) ) (x,y)=f((x_0,y_0)) (x,y)=f((x0,y0)),那么(x,y)就是ax+by=d的一组解。其中f((a,b))指的是将一对数(a,b)做一种变换

那么问题在于如何将(x0,y0)生成一个新的(x,y)
已知 : b x 0 + ( a m o d    b ) y 0 = d ∵ a m o d    b = a − a / b × b ∴ b x 0 + ( a − a / b × b ) y 0 = d ∴ a y 0 + b ( x 0 − a / b × y 0 ) = d 已知:\\ bx_0+(a\mod b)y_0=d\\ \because a\mod b=a-a/b\times b\\ \therefore bx_0+(a-a/b\times b)y_0=d\\ \therefore ay_0+b(x_0-a/b\times y_0)=d\\ 已知:bx0+(amodb)y0=damodb=aa/b×bbx0+(aa/b×b)y0=day0+b(x0a/b×y0)=d
所以只要令 ( x , y ) = ( y 0 , x 0 − a / b × y 0 ) (x,y)=(y_0,x_0-a/b\times y_0) (x,y)=(y0,x0a/b×y0),就可以解决不定方程问题

求解 16 x + 6 y = g c d ( 16 , 6 ) = 2 16x+6y=gcd(16,6)=2 16x+6y=gcd(16,6)=2的一组整数解,并求出所有整数解

void exgcd(int a,int b,int &x,int &y){	//求解ax+by=gcd(a,b)
    if(b==0){
        x=1,y=0;
        //此时gcd(a,b)=gcd(a,0)=a,a*1+0*0=a
        return ;
    }
    exgcd(b,a%b,y,x);
    //求解bx0+(a%b)y0=gcd(b,a%b)
    //执行完这个语句后暂时x=y0,y=x0
    y-=a/b*x;
    //y=x0-a/b*y0
}

求解 16 x + 6 y = 2 求解 6 x + ( 16 % 6 ) = 6 x + 4 y = 2 求解 4 x + ( 6 % 4 ) y = 4 x + 2 y = 2 求解 2 x + ( 4 % 2 ) y = 2 x + 0 y = 2 x 0 = 1 , y 0 = 0 x 1 = y 0 = 0 , y 1 = x 0 − 4 / 2 y 0 = 1 x 2 = y 1 = 1 , y 2 = x 1 − 6 / 4 y 1 = − 1 x 3 = y 2 = − 1 , y 3 = x 2 − 16 / 6 y 2 = 3 求解16x+6y=2\\ \qquad \qquad \qquad \qquad 求解6x+(16\%6)=6x+4y=2\\ \qquad \qquad \qquad \qquad \qquad 求解4x+(6\%4)y=4x+2y=2\\ \qquad \qquad \qquad \qquad \qquad \qquad 求解2x+(4\%2)y=2x+0y=2\\ \qquad \qquad \qquad \qquad \qquad \qquad x_0=1,y_0=0\\ \qquad \qquad \qquad \qquad \qquad \qquad x_1=y_0=0,y_1=x_0-4/2y_0=1\\ \qquad \qquad \qquad \qquad \qquad x_2=y_1=1,y_2=x_1-6/4y_1=-1\\ \qquad \qquad \qquad \qquad x_3=y_2=-1,y_3=x_2-16/6y_2=3 求解16x+6y=2求解6x+(16%6)=6x+4y=2求解4x+(6%4)y=4x+2y=2求解2x+(4%2)y=2x+0y=2x0=1,y0=0x1=y0=0,y1=x04/2y0=1x2=y1=1,y2=x16/4y1=1x3=y2=1,y3=x216/6y2=3

由此求出 16 x + 6 y = 2 16x+6y=2 16x+6y=2的一组解: x = − 1 , y = 3 x=-1,y=3 x=1,y=3

现在已经求出了一组解,那么如何求出所有解呢?

假设这个不定方程还有一组解 ( x ′ , y ′ ) (x',y') (x,y),那么就有 a x ′ + b y ′ = c ax'+by'=c ax+by=c,就可以得到 a ( x ′ − x ) + b ( y ′ − y ) = 0 a(x'-x)+b(y'-y)=0 a(xx)+b(yy)=0

Δ x = x ′ − x , Δ y = y ′ − y \Delta x=x'-x,\Delta y=y'-y Δx=xx,Δy=yy,那么一定满足 a Δ x + b Δ y = 0 a\Delta x+b\Delta y=0 aΔx+bΔy=0

同时对于不定方程 a Δ x + b Δ y = 0 a\Delta x+b\Delta y=0 aΔx+bΔy=0的任何一组解 ( Δ x , Δ y ) (\Delta x,\Delta y) (Δx,Δy) a ( x + Δ x ) + b ( y + Δ y ) = ( a x + b y ) + ( a Δ x + b Δ y ) = c + 0 = c a(x+\Delta x)+b(y+\Delta y)=(ax+by)+(a\Delta x+b\Delta y)=c+0=c a(x+Δx)+b(y+Δy)=(ax+by)+(aΔx+bΔy)=c+0=c

( x + Δ x , y + Δ y ) (x+\Delta x,y+\Delta y) (x+Δx,y+Δy)也一定是原不定方程的一组解

所以只需要求出 a Δ x + b Δ y = 0 a\Delta x+b\Delta y=0 aΔx+bΔy=0的所有解,再将这些解加上原来求出的特解,就可以得到原不定方程的所有解

首先求出 a x + b y = 0 ax+by=0 ax+by=0的最小一组非零解 ( x m i n , y m i n ) (x_{min},y_{min}) (xmin,ymin)(指绝对值最小),考虑 a x + b y = 0 ax+by=0 ax+by=0,则 ∣ a x ∣ = ∣ b y ∣ |ax|=|by| ax=by,那么 ∣ a x ∣ |ax| ax或者说 ∣ b y ∣ |by| by,一定同时是a,b的倍数,想让|x|尽量小,也就是让a,b的公倍数尽量小,最小就是a,b的最小公倍数 l c m ( a , b ) = a × b / g c d ( a , b ) lcm(a,b)=a\times b/gcd(a,b) lcm(a,b)=a×b/gcd(a,b)

所以最小的一组非零解就是 ( x m i n , y m i n = ( b g c d ( a , b ) ) , − a g c d ( a , b ) ) (x_{min},y_{min}=(\frac{b}{gcd(a,b)}),\frac{-a}{gcd(a,b)}) (xmin,ymin=(gcd(a,b)b),gcd(a,b)a)

于是我们就可以求出形如 a x + b y = c ax+by=c ax+by=c的方程的所有解了。对于本样例不定方程来说, a x + b y = 0 ax+by=0 ax+by=0的最小的一组非零解是 x ′ = 3 , y ′ = − 8 x'=3,y'=-8 x=3,y=8。所以 16 x + 6 y = 2 16x+6y=2 16x+6y=2的所有解就是 x = − 1 + 3 k , y = 3 − 8 k x=-1+3k,y=3-8k x=1+3k,y=38k

如果想要求出 16 x + 6 y = 6 16x+6y=6 16x+6y=6的解呢?因为6是2的3倍,所以求出来的特解就是 16 x + 6 y = 2 16x+6y=2 16x+6y=2求出的特解的3倍,也就是 x = − 3 , y = 9 x=-3,y=9 x=3,y=9,同时 16 x + 6 y = 0 16x+6y=0 16x+6y=0的解是不变的,所以最后的解为 x = − 3 + 3 k , y = 9 − 8 k x=-3+3k,y=9-8k x=3+3k,y=98k

青蛙的约会

以纬度线东经0度为起点,由东向西为正方向,总长为L米,青蛙A的起始点为x,一次能向正方向跳m米,青蛙B的起始点为y,一次能向正方向跳n米,跳一次花费时间相同,问跳几次会相遇

青蛙 A : ( x + k m ) % L 青蛙 B : ( y + k n ) % L ∴ x + k m ≡ y + k n ( m o d    L ) k ( m − n ) + z L = y − x 青蛙A:(x+km)\%L\\ 青蛙B:(y+kn)\%L\\ \therefore x+km \equiv y+kn(\mod L)\\ k(m-n)+zL=y-x\\ 青蛙A:(x+km)%L青蛙B:(y+kn)%Lx+kmy+kn(modL)k(mn)+zL=yx

//求最小值的板子
#include <bits/stdc++.h>
using namespace std;
long long x,y,m,n,L,d,k,z;
int f=1;
long long exgcd(long long a,long long b,long long &x,long long &y){		//ax+by=gcd(a,b)
    if(b==0){
        x=1,y=0;
        return a;
    }
    long long d=exgcd(b,a%b,y,x);
    y-=a/b*x;
    return d;
}
int main()
{
    cin>>x>>y>>m>>n>>L;
    if(m<n){		//处理m-n为负数的情况
        swap(n,m);
        f=-1;
    }
    d=exgcd(m-n,L,k,z);		//k(m-n)+zL=y-x
    if((y-x)%d!=0){			//判断是否无解
        cout<<"Impossible"<<endl;
        return 0;
    }
    k=k*f*(y-x)/d;			//求解k*(m-n)+zL=y-x
    k=(k%(L/d)+(L/d))%(L/d);		//求出最小的正数x
    cout<<k<<endl;
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

钰见梵星

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值