欧几里得算法 & 扩展欧几里得算法

一、欧几里得算法
  欧几里得算法,也叫辗转相除,简称 gcd,用于计算两个整数的最大公约数
  引理:gcd(a,b)=gcd(b,a%b)
  证明
    设 r=a , c=gcd(a,b)
    则 a=xc , b=yc , 其中 x,y 互质
    r=a%b=apb=xcpyc=(xpy)c
    而 b=yc
    假设 yxpy 不互质:
    设 y=nk , xpy=mk , 且 k>1 (互质)
    将 y 带入可得
    xpnk=mk
    x=(pn+m)k
    则 a=xc=(pn+m)kc , b=yc=nkc
    那么此时 gcd(a,b)=kck,矛盾!
    所以 yxpy 互质,gcd(r,b)=c
    即 gcd(b,r)=c=gcd(a,b)
    得证!

  当 a%b=0 时, gcd(a,b)=b

int gcd(int a,int b){return b?gcd(b,a%b):a;}

二、扩展欧几里得算法
  扩展欧几里得算法,简称 exgcd,一般用来求解不定方程,求解线性同余方程,求解模的逆元等
  引理:存在 x , y 使得 gcd(a,b)=ax+by
  证明
    当 b=0 时,gcd(a,b)=a,此时 x=1,y=0
    当 b0 时,
    设 ax1+by1=gcd(a,b)=gcd(b,a%b)=bx2+(a%b)y2
    又因 a%b=aab×b
    则 ax1+by1=bx2+(aab×b)y2
    ax1+by1=bx2+ay2ab×by2
    ax1+by1=ay2+bx2b×ab×y2
    ax1+by1=ay2+b(x2ab×y2)
    解得 x1=y2 , y1=x2ab×y2
    因为当 b=0 时存在 x , y 为最后一组解
    而每一组的解可根据后一组得到
    所以第一组的解 x , y 必然存在
    得证!

  根据上面的证明,在实现的时候采用递归做法
  先递归进入下一层,等到到达最后一层即 b=0 时就返回x=1 , y=0
  再根据 x=y , y=xab÷yxy 为下一层的 xy)得到当层的解
  不断算出当层的解并返回,最终返回至第一层,得到原解

void exgcd(int a,int b)
{
    if(b)
    {
        exgcd(b,a%b);
        int k=x;
        x=y;
        y=k-a/b*y;
    }
    else y=(x=1)-1;
}
  • 应用一:exgcd 解不定方程(使用不将 ab 转为互质的方法)
      对于 ax+by=c 的不定方程,设 r=gcd(a,b)
      当 c%r0 时无整数解
      当 c%r=0 时,将方程右边 ×r÷c 后转换为 ax+by=r 的形式
      可以根据扩展欧几里得算法求得一组整数解 x0 , y0
      而这只是转换后的方程的解,原方程的一组解应再 ×c÷r 转变回去
      则原方程解为 x1=x0×c÷r , y1=y0×c÷r
      通解 x=x1+b×r÷t , y=y1a×r÷t ,其中 t 为整数

  • 应用二:exgcd 解线性同余方程
      关于 x 的模方程 ax%b=c 的解
      方程转换为 ax+by=c 其中 y 一般为非正整数
      则问题变为用 exgcd 解不定方程
      解得 x1=x0×c÷r
      通解为 x=x1+b÷r×t
      设 s=br (已证明 br 为通解的最小间隔)
      则 x 的最小正整数解为 (x1%s+s)%s

posted @   XLoffy  阅读(61)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探
点击右上角即可分享
微信分享提示