zoukankan      html  css  js  c++  java
  • 关于Euclid算法

    Euclid算法大概是我最早接触的东西了吧,下面是学长传授的代码:

    1 int GCD(int a,int b){
    2     return b==0?a:GCD(b,a%b);   
    3 }

    短小精悍。当时也没理解为什么这段代码可以求出$a$和$b$的最大公因数。现补下证明。

    $a$和$b$的最大公因数记为$gcd(a,b)$,简写为$(a,b)$.

    证明Euclid算法的正确性,即证明$(a,b)=(a,b-ka)$.

    设$x=(a,b)$,$y=(a,b-ka)$,

    $ecause x=(a,b)$,

    $ herefore x|a$,$x|b$,

    $ herefore x|(-ka+b)$,

    $ herefore x|(a,b-ka)=y$,

    故$x leqslant y$.

    $ecause y=(a,b-ka)$,

    $ herefore y|a$,$y|(b-ka)$,

    $ herefore y|[ka+(b-ka)]=b$,

    $ herefore y|(a,b)$,即$y|x$,

    故$y leqslant x$.

    $ herefore x=y$.

    即$(a,b)=(a,b-ka)$.证毕.

    当$k=lfloor frac{a}{b} floor$时,即为Euclid算法.

    上述Euclid算法仅求出$(a,b)$,而不能得到$(a,b)$关于$a$和$b$的线性表示,故有了拓展的Euclid算法:

     1 int EXGCD(int a,int b,int &x,int &y){
     2     if(b==0){
     3         x=1;y=0;
     4         return a;
     5     }
     6     int d=EXGCD(b,a%b,x,y);
     7     int t=x;
     8     x=y;y=t-a/b*y;
     9     return d;
    10 }

    上述算法可求得$x$和$y$,使满足$(a,b)=ax+by$.

    为便于证明,以非递归版本为例:

     1 int EXGCD(int a,int b,int &x,int &y){
     2     int x0=1,x1=0,x2=a;
     3     int y0=0,y1=1,y2=b;
     4     while(y2!=0){
     5         int q=x2/y2;
     6         int t0=x0,t1=x1,t2=x2;
     7         x0=y0;x1=y1;x2=y2;
     8         y0=t0-q*y0;y1=t1-q*y1;y2=t2-q*y2;
     9     }
    10     x=x0;y=x1;
    11     return x2;
    12 }

    若$ax_0+bx_1=x_2$,$ay_0+by_1=y_2$,

    不难得到$a(x_0-qy_0)+b(x_1-qy_1)=x_2-qy_2$.

    上述等式正式保证了拓展Euclid算法的正确性。

    拓展Euclid算法可用来求模线性方程$ax+by=(a,b)$的解。

    特别地,当$(a,b)=1$时,$x$即为$a$在$b$下的乘法逆元。

    求$1$到$n$的数在$p$下的乘法逆元可以做到$O(n)$的复杂度:

    令$inv_i$为$i$在$p$下的逆元,则有$inv_x equiv [(p- lfloor frac{p}{x} floor ) imes inv_{p\%x}](mod p)$.

    证明:设$p=kx+r$,其中$0 leqslant r < x$,

    那么原式等于$inv_x equiv [(p-k) imes inv_r](mod p)$

    $Leftarrow r equiv [(p-k) imes x](mod p)$

    $Leftarrow r equiv -kx(mod p)$

    即$kx+r equiv p equiv 0(mod p)$,证毕.

    故我们可以递推得到各个逆元。

  • 相关阅读:
    微服务
    Ubunt16.04下安装PHP7+Nginx+MySQL
    Ubuntu Linux 14.04 LTS 上安装php7+mysql+nginx
    magento2 重置后台密码
    crontab命令
    解决linux buffer/cache 消耗内存过高引发的问题
    Linux配置自动发送邮件
    buff/cache 内容释放
    利用Linode面板Clone克隆搬家迁移不同VPS数据及利用IP Swap迁移IP地址
    css3动画(从上、左下、左、右进入页面)
  • 原文地址:https://www.cnblogs.com/barrier/p/6546094.html
Copyright © 2011-2022 走看看