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)$,证毕.

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

  • 相关阅读:
    September 17th 2016 Week 38th Saturday
    【2016-09-16】UbuntuServer14.04或更高版本安装问题记录
    September 16th 2016 Week 38th Friday
    September 11th 2016 Week 38th Sunday
    September 12th 2016 Week 38th Monday
    September 10th 2016 Week 37th Saturday
    September 9th 2016 Week 37th Friday
    c++暂停
    八皇后问题
    ( 转转)Android初级开发第九讲--Intent最全用法(打开文件跳转页面等)
  • 原文地址:https://www.cnblogs.com/barrier/p/6546094.html
Copyright © 2011-2022 走看看