zoukankan      html  css  js  c++  java
  • 扩展欧几里得

    首先接触的就是欧几里得求最大公约数(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 }
  • 相关阅读:
    最近总结
    公开MQTT服务器列表
    MQTT资料收集
    开源游戏
    B站学习资料
    MQTT资料
    都2020年了,还再问GET和POST的区别?【深度好文】
    以“用户登录”测试谈用例编写
    接口自动化测试框架9项必备功能
    一篇文章了解软件测试基础知识
  • 原文地址:https://www.cnblogs.com/ouyang_wsgwz/p/9126289.html
Copyright © 2011-2022 走看看