zoukankan      html  css  js  c++  java
  • 关于扩展欧几里得算法和逆元

    关于扩展欧几里得算法和逆元

    1.扩欧

    a*x1+b*y1=gcd(a,b);

    b*x2+(a%b)*y2=gcd(b, (a%b))= gcd(a,b);

    a%b=a-(a/b)*b;

    联立可得

    x1=y2

    y1=x2-(a/b)*y2;

    递归的边界为b=0

    此时x=1,y=0,然后回溯即可。

    为什么要x=1,y=0呢?

    因为此时gcd(a,b)=gcd(a,0)=a,故a*1+b*0=gcd(a,b)=a;其实y!=0也可以,但是会爆int。

    //17.11.6
    扩欧的条件是a*x1+b*y1=gcd(a,b),=右边一定是gcd(a,b),如果gcd(a,b)前面有系数k,在求出来一组解之后,再*k就好了。

    //2019.3.26

    a*x1+b*y1=c,如果c不是gcd(a,b)的倍数,就没有整数解

    怎么求最小正整数解呢
    在用扩欧求出一组 ax+by=c 特解之后,比如(x2,y2),对于任意一个通解(x1,y1), ax1+by1=ax2+by2, 移项之后,a(x1-x2)=b(y1-y2),令g=gcd(a,b),a'=a/g,b'=b/g,则a'(x1-x2)=b'(y1-y2), 因为 gcd(a',b')=1,  (x1-x2)=kb' ,同理(y1-y2)=k1 a' ,所以x1=x2+kb',所以最小正整数解就是特解x0的 (x0%b'+b')%b', 这样就不用管特解的正负了。
    如果对于读入的a,b,c存在小于0的,令flag=-1,x*=flag就完事了

  • 相关阅读:
    Python
    Python
    Python
    Python
    python
    python
    Python
    pure css做的pc登陆界面
    MvcAdmin功能介绍
    pure css做的手机版博客园(我自己博客)
  • 原文地址:https://www.cnblogs.com/war1111/p/7586798.html
Copyright © 2011-2022 走看看