• 扩展欧几里得


    首先接触的就是欧几里得求最大公约数(GCD)

    1 int gcd(int a, int b){
    2     // b < a
    3     while(b){
    4         int t = a%b;
    5         a = b;
    6         b = t;
    7     }
    8     return a;
    9 }

    递归的写法:

    1 int gcd(int a, int b){
    2    if(!b) return a;
    3    return gcd(b, a%b);
    4 }

    在扩展欧几里得中,设法求 ax + by = gcd(a, b) 中的一组 x 和 y 的解

    当 b = 0 的时候, gcd(a, b) = a,此时的 x = 1, y = 0为其中的一组的解

    当 b ≠ 0 的时候 , 设 

      ax1 + by1 = gcd(a, b)

    又辗转相除法得:

      gcd(a, b) = gcd(b, a%b)

    设 bx2 + (a%b)y2 = gcd(b, a%b) = gcd(a, b)

    所以综合得到一个等式:  ax1 + by1 = bx2 + (a%b)y2  (想得到x1, y1)

    又 a%b = a - (a/b)*b ,带入上式中

    得  bx2 + [ a - (a/b)*b]y2 = ax1 + by1

       ay2 + bx2 - (a/b)*b*y2 = ax1 + by1

    所以在知道x2, y2 之后,便可以推出

      x1 = y2

      y1 = x2 - (a/b)*y2

    然后推回去就行了

     1 int ex_gcd(int a, int b, int &x, int &y){
     2     if(b == 0){
     3         x = 1;
     4         y = 0;
     5         return a;
     6     }
     7     int r = ex_gcd(b, a%b, x, y);
     8     int t = x;
     9     x = y;
    10     y = t - floor(a/b)*y;
    11     return r;
    12 }
  • 相关阅读:
    sys模块
    os模块
    datetime模块
    time模块

    random模块
    python文件两种用途
    模块的搜索路径
    如何修改cnblogs的文本编辑器
    socket状态
  • 原文地址:https://www.cnblogs.com/ouyang_wsgwz/p/9126289.html
Copyright © 2020-2023  润新知