zoukankan      html  css  js  c++  java
  • 由不定方程想到的——数论选讲

    所谓二元一次不定方程,指的是关于$x,y$的,形如$ax+by=c$的方程

    在这里我们约定$a,b,c$均为整数。

    那么我们遇到的问题是:如何判断这个方程有解呢?

    裴蜀定理:设$a,b,d$均为整数,且$(a,b)=d$,则存在$u,v$使得$ua+vb=d$

    证明:由$(a,b)=d$知$且d|a且d|b$,那么就有$d|ua+vb$

    ​            记$ua+vb$的最小正值为$s$,则$d|s$

    ​            对a做带余除法得:$,且与均为整数a=qs+r(0leq r<s,且q与r均为整数)$

    ​            则$r=a-qs=a-q(ua+vb)=(1-qu)a+(-qv)b$,故r为a,b的线性组合(你可以将线性组合理解为一个整数z可以被表示成ax+by(都是整数))

    ​            而s为$ua+vb$的最小正值且$0leq r<s$,所以$r=0$,即$a=qs$

    ​            所以$s|a$

    ​            同理可证$s|b$

    ​            故$即s|(a,b)即s|d$,又由$d|s$知$d=s$

    在明确了裴蜀定理之后,我们便可以得出二元一次不定方程有解的条件:$gcd(a,b)|c$

    证明:设$d=gcd(a,b),a=a_1d,b=b_1d,c=c_1d$,则原方程可化为$a_1x+b_1y=c_1,gcd(a_1,b_1)=1$

    ​            由裴蜀定理知,存在整数$x_0,y_0$,使得$a_1x_0+b_1y_0=1$

    ​            所以$a_1(x_0c_1)+b_1(y_0c_1)=c_1$

    ​            从而原方程有一组整数解$x=x_0c_1,y=y_0c_1$

    我们在刚刚的证明中构造出了方程的一组解,很明显的发现如果按照上述方法求解明显是行不通的,所以我们必须得想一个方法求出不定方程的一组解

    在上面的证明过程中,除了已知数,我们反复提到了另一个数$gcd(a,b)$

    我们来看一下能否从这个数中发现一些端倪

    先解这个方程$ax+by=gcd(a,b)$

    (1)若$b=0$,则$gcd(a,b)=a$,原方程即$a·x+0·y=a$,显然$x=1,y=0$

    (2)若$b eq 0$,则$gcd(a,b)=gcd(b,a mod b)$

    ​    由此可以知道$ax+by=bx_0+(a mod b)y_0=bx_0+(a-a div b*b)y_0=ay_0+b(x_0-a div b*y_0)$

    因此$x=y_0,y=x_0-a div b*y_0$

    而我们已经知道了最后一次的$与x_0与y_0$的值

    所以逐层往上倒推即可

    由于所有过程是建立在求$gcd(a,b)$的基础上的,所以这个方法叫做扩展欧几里得

    代码如下

     1 #include<iostream>
     2 #include<string>
     3 #include<string.h>
     4 #include<stdio.h>
     5 #include<algorithm>
     6 #include<vector>
     7 #include<queue>
     8 #include<map>
     9 using namespace std;
    10  
    11 void exgcd(int a,int b,int &x,int &y)
    12 {
    13     if (b==0) {x=1;y=0;return;}
    14     exgcd(b,a%b,x,y);
    15     int tmpx=x,tmpy=y;
    16     x=tmpy;y=tmpx-(a/b)*tmpy;
    17 }
    18  
    19 int main()
    20 {
    21     int a,b;
    22     cin >> a >> b;
    23     int x,y;
    24     exgcd(a,b,x,y);
    25     cout << x << " " << y;
    26     return 0;
    27 }


    若不定方程为$ax+by=k*gcd(a,b)$,则直接在所求得的$x,y$的基础上乘上$k$即可

    我们在求出了原不定方程的一组解后,能否用它来推出所有解呢?

    假设我们当前求出的解是$(x_0,y_0)$,下一组解是$(x_0+d_1,y_0+d_2)(其中d_1是满足条件的最小的正整数)$

    则$a(x_0+d_1)+b(y_0+d_2)=c,ax_0+by_0=c$

    带入解得$ad_1+bd_2=0$,即$frac{d_1}{d_2}=-frac{b}{a}$

    化简得$frac{d_1}{d_2}=-frac{frac{b}{gcd(a,b)}}{frac{a}{gcd(a,b)}}$

    因而二元一次不定方程$ax+by=c$的一般解可表示为

    $$x=x_0+k*frac{b}{gcd(a,b)},y=y_0-k*frac{a}{gcd(a,b)}$$,其中$kin Z$

    线性同余方程

    所谓线性同余方程,指的是最简单的同余方程,形如$其中axequiv c(mod b),其中(b>0)$

    一般讨论同余方程的解$x$满足$0leq x <b$

    原同余方程等价于$ax+by=c$,即上面的不定方程

    所以原线性同余方程有解的条件是$gcd(a,b)|c$

    但是在这里我们还关心一点——解的个数(因为x已经被限制了)

    可以证明,对于上面的线性同余方程,只要有解,就会有$d=gcd(a,b)$个解

    证明什么的不是重点(逃

    由上面知第一个解为$x=(x_0*(c/d))mod b$

    剩下的$d-1$个解可以加上$b/d$的倍数得到

    即$x_i=(x_0+i*(b/d))mod b(1leq ileq d-1)$


  • 相关阅读:
    3星|《失败课》:投资人写给创业者的经验谈,有点标题党
    3星|《给你一门人工智能入门生意经》:机器所知胜于其所能言传
    3星|《财经》2018年第5期:西伯利亚冻土层的猛犸象牙是合法的,一根能卖到数万美元
    3星|《增长黑客》:增长黑客是一个牵强的概念
    2星|《只管去做》:做年度计划的入门级介绍,信息浓度太低
    创业者融资过程中需要了解的大坑小坑:《风投的技术》,4星
    4星|吴军《见识》:李开复上级的工作经验、投资经验与人生忠告
    4星|《基因转》:从孟德尔、达尔文到人类胚胎转基因
    3星|《人机平台》:数字化时代的三大类新的再平衡:人脑与机器、产品与平台,以及核心与大众
    3星|《知识的边界》:知识存在于网络中,分歧永远存在
  • 原文地址:https://www.cnblogs.com/encodetalker/p/9782210.html
Copyright © 2011-2022 走看看