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

    Ps:很久以前学的,一直以来都是套模板,感觉忘得差不多了,所以复习一下- -

    欧几里得算法

    作用:
    计算两个数的最大公约数。
    算法:
    欧几里德算法又称辗转相除法,用于计算两个整数a,b的最大公约数。
    用gcd(a, b)表示a和b的最大公约数。
    gcd函数的基本性质:gcd(a,b)=gcd(b,a)=gcd(-a,b)=gcd(|a|,|b|)=gcd(a,b-a)

    C实现:

    1 typedef long long int64;
    2 
    3 int64 gcd(int64 a, int64 b)
    4 {
    5     return b == 0 ? a : gcd(b, a% b);
    6 }
    View Code

    扩展欧几里得算法

    作用:

    计算两个数a, b的最大公约数的同时,求出两个整数x, y使得a*x + b*y = gcd(a, b),且|x| + |y|取得最小值。

    算法:

    用以下过程进行模拟:

    用类似辗转相除法,求二元一次不定方程47x+30y=1的整数解。

    • 47=30*1+17
    • 30=17*1+13
    • 17=13*1+4
    • 13=4*3+1

    然后把它们改写成“余数等于”的形式

    • 17=47*1+30*(-1) //式1
    • 13=30*1+17*(-1) //式2
    • 4=17*1+13*(-1) //式3
    • 1=13*1+4*(-3)

    然后把它们“倒回去”

    • 1=13*1+4*(-3) //应用式3
    • 1=13*1+[17*1+13*(-1)]*(-3)
    • 1=13*4+17*(-3) //应用式2
    • 1=[30*1+17*(-1)]*4+17*(-3)
    • 1=30*4+17*(-7) //应用式1
    • 1=30*4+[47*1+30*(-1)]*(-7)
    • 1=30*11+47*(-7)

    得解x=-7, y=11

    C实现:

     1 typedef long long int64;
     2 
     3 void ext_gcd(int64 a, int64 b, int64& d, int64& x, int64& y)
     4 {
     5     if (!b) d = a, x = 1, y = 0;
     6     else{
     7         ext_gcd (b, a%b, d, y, x);
     8         y -= x * (a / b);
     9     }
    10 }
    View Code
    ------------------------------------------------------------------
    现在的你,在干什么呢?
    你是不是还记得,你说你想成为岩哥那样的人。
  • 相关阅读:
    驱动开发之基本
    Bitmap文件格式+生成一个BMP文件
    PPP 转义字符 编码 和 解码
    数组数据整体按位左移或右移一位
    一个assert的写法
    c++11 右值引用 && std::move()
    openMP一小时初探
    linux命令学习_实验楼(一)
    50 行 Python 代码完成图片转字符
    LFW精确度验证__c++双线程读写txt
  • 原文地址:https://www.cnblogs.com/plumrain/p/ext_gcd.html
Copyright © 2011-2022 走看看