扩展欧几里德算法是用来在已知a, b求解一组x,y,使它们满足贝祖等式: ax+by = gcd(a, b) =d(解一定存在,根据数论中的相关定理)。扩展欧几里德常用在求解模线性方程及方程组中。

我们先来看欧几里德算法(即gcd算法)的一个重要性质:gcd(a,b)=gcd(b,a%b)。这一性质的证明可以见百度百科,在此不再赘述。由此可以写出gcd算法的递归形式:

int gcd(int a,int b)
{return b ? gcd(b,a%b) : a;
}

只有一行语句,十分简洁。

而扩展欧几里德算法是为了求方程组ax+by=gcd(a,b)中的x和y,且x和y为整数。它是欧几里德算法的扩展,我们先来看代码:

int exgcd(int a,int b,int &x,int &y)
{if(b==0){x=1;y=0;return a;}int r=exgcd(b,a%b,x,y);int t=x;x=y;y=t-a/b*y;return r;
}

第一眼看上去有些难以理解,我第一眼看上去总是被这个递归搞混。。。而且对于x和y为什么在递归过程中要这样变化弄得不知所云。不要紧,我们先来看解析:

对于以上代码,因为在每一次gcd的递归中,我们令现阶段的a`=b,b`=a mod b,其中a和b是上一阶段的数值。对于现阶段我们的问题转化成了:求x,y使得a`x+b`y=gcd(a`,b`)=gcd(a,b)。由于b`=a mod b=a-a/b*b,我们带入式中有:a`x+b`y=gcd(a,b)--->bx+(a-a/b*b)y=gcd(a,b)--->ay+b(x-a/b*y)=gcd(a,b)

比较始末式子,观察到转换过程为:

  • x=y;
  • y=x-a/b*y

这也是我们程序里后面几句代码的意思。

那么为什么b==0时要把x设为1,y设为0呢?我们用一个实例来看这个函数递归的过程:

#include<stdio.h>
#include<string.h>
#include<iostream>
#include<algorithm>
using namespace std;
int exgcd(int a,int b,int &x,int &y)
{if(b==0){x=1;y=0;return a;}int r=exgcd(b,a%b,x,y);int t=x;x=y;y=t-a/b*y;cout<<"r:"<<r<<endl;cout<<"x:"<<x<<endl;cout<<"y:"<<y<<endl;cout<<"a:"<<a<<endl;cout<<"b:"<<b<<endl;cout<<"a/b:"<<a/b<<endl;system("pause");return r;
}
int main()
{int a,b,x,y;while(cin>>a>>b){x=y=-1;int r=exgcd(a,b,x,y);}return 0;
}

我们输入a,b的值,来看递归中exgcd里的值怎么变化的。我取a=36,b=21

一开始我们递归到b=0时,此时值因为程序写的问题没有显示出来,不过可以推断出:

r:3

x:1

y:0

a:3

b:0

我们发现此时x,y,a,b满足方程ax+by=gcd(a,b)=r=3。也就是说,在初始状态,因为a=r,b=0,所以满足这个方程x只能取1,y取0,也就是代码里赋值的含义。

接着递归,我们有:

此时是初始状态的上一层递归状态,其中x和y的值由语句

int t=x;x=y;y=t-a/b*y;

变化而来,仍然满足方程ax+by=gcd(a,b)=r=3。

后面几个递归都一样,一直到最后一层,我们计算一下:36*3-5*21=3,嗯,得到了我们要求的x和y。

现在我们知道了exgcd函数的计算流程:先由

int r=exgcd(b,a%b,x,y);

递归到最后一层,然后在每一层返回中逐步更新当前状态x,y的值,最终得到解答。

说了这么多,不如来做个练习吧?

练习题:http://codeforces.com/problemset/problem/7/C

数论基础——扩展欧几里德算法解析相关推荐

  1. 【数论基础】欧几里德算法及其各种应用

    目录: 欧几里德算法(辗转相除法) 1.问题引入:线段上格点的个数 2.输入两个正整数,求最大公约数和最小公倍数 3.P1029 最大公约数和最小公倍数问题 欧几里德算法(辗转相除法) 辗转相除法, ...

  2. 数论基础_欧几里德算法

    定理:gcd(a,b) = gcd(b,a mod b) (a>b 且a mod b 不为0) 证明:a可以表示成a=kb+r,则r=a mod b       假设d是a,b的一个公约数,则有 ...

  3. 扩展欧几里德算法详解

    转自:http://blog.csdn.net/zhjchengfeng5/article/details/7786595 扩展欧几里德算法 谁是欧几里德?自己百度去 先介绍什么叫做欧几里德算法 有两 ...

  4. poj 2115 C Looooops(扩展欧几里德算法)

    题意: 对于for(i=A ; i!=B ;i+=C)循环语句,问在k位存储系统中循环几次才会结束. 比如:当k=4时,存储的数 i 在0-15之间循环.(本题默认为无符号) 若在有限次内结束,则输出 ...

  5. 欧几里德和扩展欧几里德算法

    1.欧几里德算法 欧几里德算法又称辗转相除法,用于计算两个整数a,b的最大公约数.其计算原理依赖于下面的定理: 定理:gcd(a,b) = gcd(b,a mod b) 证明:a可以表示成a = kb ...

  6. 欧几里德与扩展欧几里德算法——密码学笔记(五)

    一.欧几里德算法 又称辗转相除法,用于计算两个整数a,b的最大公约数. 基本算法:设a=qb+r,其中a,b,q,r都是整数,则gcd(a,b)=gcd(b,r),即gcd(a,b)=gcd(b,a% ...

  7. 欧几里德算法与扩展欧几里德算法

    欧几里德算法 欧几里德算法又称辗转相除法,用于计算两个整数a,b的最大公约数. 基本算法:设a=qb+r,其中a,b,q,r都是整数,则gcd(a,b)=gcd(b,r),即gcd(a,b)=gcd( ...

  8. (扩展欧几里德算法)zzuoj 10402: C.机器人

    10402: C.机器人 Description Dr. Kong 设计的机器人卡尔非常活泼,既能原地蹦,又能跳远.由于受软硬件设计所限,机器人卡尔只能定点跳远.若机器人站在(X,Y)位置,它可以原地 ...

  9. Bailian2793 孙子问题【扩展欧几里德算法+中国剩余定理】

    2793:孙子问题 总时间限制: 15000ms 内存限制: 65536kB 描述 我国古代<孙子算经>中,记有如下算题:"今有物不知其数,三三数之剩二,五五数之剩三,七七数之剩 ...

  10. 欧几里德算法 扩展欧几里德算法 求解丢番图方程

    欧几里德算法 即辗转相除法,计算整数A, B最大公约数. 基本算法:设 a = kb + r,其中a,b,k,r都是整数,则 gcd(a,b) = gcd(b,r),即 gcd(a,b) = gcd( ...

最新文章

  1. 2020下半年新机最新消息_2020下半年新机汇总,除了iPhone 12,还有这些旗舰
  2. java httpclient 进度条_如何使用Apache HttpClient 4获取文件上传的进度条?
  3. 解决打开虚拟机 VMware Workstation 报错无法改变虚拟机的电源状态 Operation inconsistent with current state问题
  4. USACO Training Section 1.2 挤牛奶Milking Cows
  5. 广东网络借贷中介整改验收,留给平台的时间只有8天!
  6. 奥鹏计算机基础18秋在线作业答案,18秋华师《计算机基础》在线作业1(标准答案).doc...
  7. c语言实现输入输出功能需要调用库函数,C语言学习笔记(二)
  8. PDF文件编辑方法:PDF怎么插入图片背景
  9. HUSTOJ SPJ 示例
  10. 1分钟激活任意Windows 系统
  11. EDK2编译报错,请帮我看看这个是什么错误
  12. 阿木P230无人机指点飞行实验记录
  13. 前端代码 (html css JavaScript DOM JSON)
  14. 简单图文解释冯诺依曼体系结构(通俗易懂版)
  15. Feature Selection详解(附带Relief、Relief-F、LVM详解)(一)
  16. Johnson-Trotter 生成全排列算法
  17. 家乐福618保卫战二-零售O2O场景中的万级并发交易情况下的极限性能调优
  18. 潭州课堂25班:Ph201805201 第四课:Linux的命令以及VIM的使用 (课堂笔记)
  19. 垃圾ACMer的暑假训练220716
  20. CVPR2020 步态论文:Gait Recognition via Semi-supervised Disentangled Representation Learning to Identit

热门文章

  1. 思维导图—Git命令全集
  2. 【web前端技术】dicebear一句话生成头像
  3. OpenGL游戏程序设计——————关于这本书
  4. ESP32-CAM摸索经历1.0
  5. 测试用例设计方法——等价类划分法
  6. 等价类划分法-案例剖析-设计测试用例
  7. 一文搞懂什么是禁忌搜索算法Tabu Search【附应用举例】
  8. Elasticsearch添加拼音搜索支持
  9. 拼音搜索 拼音首字母搜索 (pinyin-match) js
  10. 账户验证业务规则及改造要点介绍