模意义下的数和运算

模意义下的数和运算

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

12➗5 = 2......2

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

定义1:模

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

1.\((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\geq b\),但是也不能保证\(a\% M\geq b\% M\),所以这种情况下我们可以优化

\((a-b)\% M=(a\% M-b\% M+M)\% M\)

3.\((a\times b)\% M=(a\% M\times b\% M)\% 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 \]

除法不成立

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

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

定义2:同余

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

同余的性质:

1.反身性:\(x\equiv x(\mod M)\)

2.对称性:若\(x\equiv y(\mod M)\),则\(y\equiv x(\mod M)\)

3.传递性:若\(x\equiv y(\mod M),y\equiv z(\mod M)\),则\(x\equiv z(\mod M)\)

4.同加性:若\(x\equiv y(\mod M)\),则\(x+z\equiv y+z(\mod M)\)

5.同乘性:若\(x\equiv y(\mod M)\),则\(x\times z\equiv y\times z(\mod M)\)

6.同幂性:若\(x\equiv y(\mod M)\),则\(x^z\equiv y^z(\mod M)\)

7.\(x\equiv y(\mod M)\Longleftrightarrow b|(x-y)\)

\[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) \]

定义3:不定方程

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

在本节中,只需要考虑\(ax+by=c\)的二元一次方程

定理1:裴蜀定理

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

那么如何通过裴蜀定理来解决一般的\(ax+by=c\)的不定方程问题?

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

对于整数a,b,c,\(ax+by=c\)有整数解,当且仅当\(gcd(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 \]

所以我们只需要考虑\(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时,\(ax+by=d\)的解为\(x=\frac{d}{a}\),y任意

2.求出\(bx+(a\mod b)y=d\)的一组解,设为\((x_0,y_0)\)

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

那么问题在于如何将(x0,y0)生成一个新的(x,y)

\[已知:\\ 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\\ \]

所以只要令\((x,y)=(y_0,x_0-a/b\times y_0)\),就可以解决不定方程问题

求解\(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
}

\[求解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\)的一组解:\(x=-1,y=3\)

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

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

\(\Delta x=x'-x,\Delta y=y'-y\),那么一定满足\(a\Delta x+b\Delta y=0\)

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

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

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

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

所以最小的一组非零解就是\((x_{min},y_{min}=(\frac{b}{gcd(a,b)}),\frac{-a}{gcd(a,b)})\)

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

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

青蛙的约会

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

\[青蛙A:(x+km)\%L\\ 青蛙B:(y+kn)\%L\\ \therefore x+km \equiv y+kn(\mod L)\\ k(m-n)+zL=y-x\\ \]

//求最小值的板子
#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;
}
posted @ 2022-09-04 22:26  钰见梵星  阅读(74)  评论(0编辑  收藏  举报