计算机程序设计艺术一扩展欧几里得算法

    xiaoxiao2021-03-25  47

    计算机程序设计艺术一扩展欧几里得算法

    概念:

            对于不完全为 0 的非负整数 a,b,gcd(a,b)表示 a,b 的最大公约数,必然 存在整数对 x,y ,使得 gcd(a,b)=ax+by。

    书中描述:

    可能是我数学太差了,完全找不到相关性。。。

    证明:

            设 a>b。

            1,显然当 b=0,gcd(a,b)=a。此时 x=1,y=0;         2,ab!=0 时         设 ax1+by1=gcd(a,b);         bx2+(a mod b)y2=gcd(b,a mod b);        根据朴素的欧几里德原理有 gcd(a,b)=gcd(b,a mod b);则:ax1+by1=bx2+(a mod b)y2;

           即:ax1+by1=bx2+(a-(a/b)*b)y2=ay2+bx2-(a/b)*by2;        根据恒等定理得:x1=y2; y1=x2-(a/b)*y2;        这样我们就得到了求解 x1,y1 的方法:x1,y1 的值基于 x2,y2。

           终于知道了其相关性了,证明思想来自于递归。

    代码:

    1.递归思想实现:

    int exgcd(int a,int b,int &x,int &y) { if(b==0) { x=1; y=0; return a; } int r=exgcd(b,a%b,x,y); int t=x; x=y; y=t-a/b*y; return r; }

    2.非递归思想实现:

    int exgcd(int m,int n,int &x,int &y) { int x1,y1,x0,y0; x0=1; y0=0; x1=0; y1=1; x=0; y=1; int r=m%n; int q=(m-r)/n; while(r) { x=x0-q*x1; y=y0-q*y1; x0=x1; y0=y1; x1=x; y1=y; m=n; n=r; r=m%n; q=(m-r)/n; } return n; }

    转载请注明原文地址: https://ju.6miu.com/read-32484.html

    最新回复(0)