zoukankan      html  css  js  c++  java
  • 扩展欧几里德算法求逆元1

     1 int exgcd(int a,int b,int &x,int &y)
     2 {
     3     if(b==0)
     4     {
     5         x=1;
     6         y=0;
     7         return a;
     8     }
     9     int ret=exgcd(b,a%b,x,y);
    10     int tmp=x;
    11     x=y;
    12     y=tmp-a/b*y;
    13     return ret;
    14 }
    View Code

    该算法目的在于计算gcd(a,b)=d=ax+by式x和y的值,最后求得x即为a的逆元

    •定理:对于不完全为0的非负整数a,b,gcd(a,b)表示a,b的最大公约数d,必然存在整数对x,y,使得gcd(a,b)=d=ax+by
    •对于gcd(a,b) = d,对(a, b)用欧几里德辗转相除会最终得到(d, 0)。此时对于把a =d, b = 0 代入a*x + b*y = d,显然x = 1,y可以为任意值。
    •我们可以用a = d, b = 0的情况逆推出来任何gcd(a, b) = d 满足a*x + b*y = d的解。如果x0,y0是b*x + (a%b)*y = d 的解,那么对于a*x + b*y = d的解呢?

    b*x + (a%b)*y = d →

    b*x + (a - [a/b]*b)*y = d →

    a*y + b*(x - [a/b]*y) = d

    所以a*x + b*y = d的解

    x1 = y0,y1= x0 - [a/b]*y0;

  • 相关阅读:
    cordova的安装与配置
    JavaScript-string
    JavaScript-Number
    android-适配器
    网络操作-转码(乱码情况处理)
    网络操作-请求优先级
    Android读取权限
    I/O-<File区别>
    I/O-<File实例>
    I/O-<文件读写、输出>
  • 原文地址:https://www.cnblogs.com/wsruning/p/4673244.html
Copyright © 2011-2022 走看看