【专题】欧几里得算法、扩展欧几里得、乘法逆元

17 篇文章 0 订阅
10 篇文章 1 订阅

1.欧几里得

  • 用途
    最大公因数和最小公倍数
  • 定理:
      gcd(a,b)=gcd(b,a%b)
     

  • 证明:
    我们令 c=gcd(a,b)
    a=nc , b=mc
    a%b=akb=nmkc ,可知,c也是 a%b 的因子,

    现在只需证明c是b和a%b的最大因子,用反证法:
    假设 gcd(b,a%b)=d>c
    b=n1d a%b=m1d
    可推出 a=m1d+k1b=m1d+k1n1d
    从而推出 gcd(a,b)=d
    矛盾
    证明完毕

  • 代码

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

2.扩展欧几里得算法

  • 扩展欧几里得定理
    对于不完全为0的非负整数a,b,gcd(a, b)表示a, b的最大公约数,必定存在整数对x,y,满足 ax+by==gcd(a,b)

  • 用途
    求出整数x,y使得 ax+by=gcd(a,b)

  • 应用
    扩展欧几里得主要有三个应用:

    • 求解不定方程
    • 求解模的逆元
    • 求解同余方程
  • 证明
    由于 gcdab=gcdba%b
    所以 bx1+(a%b)y1=gcd(a,b)
    a%b=a(a/b)b
    所以 gcd(a,b)=bx1+(a(a/b)b)y1
    =bx1+ay1(a/b)by1
    =ay1+b(x1a/by1)
    对于我们所求的x,y使得 ax+by=gcd(a,b)
    则有 x=y1
    y=x1a/by1
  • 代码
int Exgcd(int a,int b,int &x,int &y)
{
      if(b==0)
      {
            x=1;
            y=0;
            return a;
      }
      int ans=Exgcd(b,a%b,x,y);
      int temp=x;
      x=y;
      y-temp-a/b*y;
      return ans;
}

3.乘法逆元

  • 定义:
    bb11(modc) ,那么称 b1 为b模c的乘法逆元。

  • 定理:
    ab(modc)=ab1(modc) ,条件是 b1 存在(或b与c互质)。

  • 用途
    乘法逆元可以用来求解部分除法的取模问题(分母是一个整数,并且与被取模数互质)

知道了乘法逆元的用途之后关键是怎么求出乘法逆元 b1 的问题,由定义 bb11(modc) 可以设:
bb1=kc+1
=> bb1kc=1=gcd(b,c) ,(因为 b,c )
所以问题就变成了用扩展欧几里得的求 b1k ,用前面的扩展欧几里得算法就可以得到

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值