欧几里得算法:

int gcd(int x,int y){if(y) return gcd(y,x%y);return x;
}

扩展欧几里得算法:

先说一个整体思路:
先求Ax+By=gcd(A,B);的一个解x,y
然后我们可以求他的通解
然后求Ax+By=C的通解

我们先看看怎么求Ax+By=gcd(A,B);的一个解x,y
设 a>b。
1,显然当 b=0,gcd(a,b)=a。此时 x=1,y=0;
2,a>b>0 时
设 ax1+ by1= gcd(a,b);
bx2+ (a mod b)y2= gcd(b,a mod b);
根据朴素的欧几里德原理有 gcd(a,b) = gcd(b,a mod b);
则:ax1+ by1= bx2+ (a mod b)y2;
即:ax1+ by1= bx2+ (a - [a / b] * b)y2=ay2+ bx2- [a / b] * by2;
也就是ax1+ by1 == ay2+ b(x2- [a / b] *y2);

根据恒等定理得:x1=y2; y1=x2- [a / b] *y2;
这样我们就得到了求解 x1,y1 的方法:x1,y1 的值基于 x2,y2.
上面的思想是以递归定义的,因为 gcd 不断的递归求解一定会有个时候 b=0,所以递归可以结束。

void Ex_gcd(int a, int b, int &x, int &y)
{if(b == 0)//递归出口{x = 1;y = 0;return;}int x1, y1;Ex_gcd(b, a%b, x1, y1);x = y1;y = x1-(a/b)*y1;
}

上面已经列出找一个整数解的方法,我们接下来找通解

取另外一组解(x2,y2)
则ax1+by1=ax2+by2=gcd(a,b)
变形得a(x1-x2)=b(y1-y2)
假设gcd(a,b)=g
方程左右两边同时除以g
a’(x1-x2)=b’(y2-y1),a’=a/g,b’=b/g
此时a’和b’互为素数
因此x1-x2一定是b’的整数倍,设为kb’
因此若方程一组整数解为(x0,y0)
他的任意整数解都可写成
(x0+kb’,y0-ka’)
a’=a/gcd(a,b)
b’=b/gcd(a,b)

结论:在找到Ax+By = Gcd(A, B)的一组解x0,y0后,Ax+By = Gcd(A, B)的其他整数解满足:
x = x0 + B/Gcd(A, B) * t
y = y0 - A/Gcd(A, B) * t(其中t为任意整数)

明白了原始的Ax+By=gcd(A,B)情况,我们可以扩展到一般的情况,即

Ax+By=C

对于Ax+By=c的整数解,只需将Ax+By = Gcd(A, B)的每个解乘上 C/Gcd(A, B) 即可
但是所得解并不是该方程的所有解,找其所有解的方法如下:
找到Ax+By= Gcd(A, B)的一组解x0,y0后,可以
得到Ax+By = C的一组解x1 = x0*(C/Gcd(A,B)),y1 = y0*(C/Gcd(A,B)),Ax+By = C的其他整数解满足:
x = x1 + B/Gcd(A, B) * t
y = y1 - A/Gcd(A, B) * t(其中t为任意整数)
y就是Ax+By=C的所有整数解。

练习题目:

Now tell you two nonnegative integer a and b. Find the nonnegative integer X and integer Y to satisfy Xa + Yb = 1. If no such answer print “sorry” instead.
Input
The input contains multiple test cases.
Each case two nonnegative integer a,b (0< a, b< =2^31)
Output
output nonnegative integer X and integer Y, if there are more answers than the X smaller one will be choosed. If no answer put “sorry” instead.
Sample Input
77 51
10 44
34 79
Sample Output
2 -3
sorry
7 -3

分析与解答

代码参考:只有这个代码才是这个算法的真谛

#include <iostream>
#include <cstdio>
#include <cmath>
#include <cstring>
#include <string>
#include <cstdlib>
using namespace std;long long gcd(long long a,long long b){if(!b) return a;return gcd(b,a%b);
}void exgcd(long long a,long long &x,long long b,long long  &y){if(!b){x=1;y=0;}else{exgcd(b,y,a%b,x);y-=x*(a/b);}
}
int main(){long long t,A,B,x,y;while(cin>>A>>B){if(gcd(A,B)!=1)cout<<"sorry"<<endl;else{exgcd(A,x,B,y);//已经得到了一个特解xywhile(x<0) {x+=B;y-=A;}//找最小的正整数解cout<<x<<' '<<y<<endl;}}return 0;
}

欧几里得算法和扩展欧几里得算法详解相关推荐

  1. 欧几里得算法和扩展欧几里得算法——杨子曰数学

    欧几里得算法和扩展欧几里得算法--杨子曰数学 超链接:数学合集 不说废话,咱们直接开始 欧几里得算法 一句话: g c d ( a , b ) = g c d ( b , a m o d b ) gc ...

  2. 密码学基础算法(一)基于整数的欧几里得算法和扩展欧几里得算法

    图片来源: 随便谷歌的一个图片 图片地址: https://jason-chen-1992.weebly.com/uploads/1/0/8/5/108557741/euclidean_3_orig. ...

  3. 欧几里得算法和扩展欧几里得算法(Euclidean_Algorithm and Extended_Euclidean_Algorithm)

    一.基本概念 欧几里得算法:又名辗转相除法,计算两个整数a,b的最大公约数. 扩展欧几里得算法:对于不完全为 0 的非负整数 a,b,gcd(a,b)表示 a,b 的最大公约数,必然存在整数对 x,y ...

  4. 欧几里得算法和扩展欧几里得算法的简单例子

    欧几里得算法: #include <cstdio> #include <cstdlib>/* * 挑战...p113 */struct point{ //格点int x;int ...

  5. 【算法学习】欧几里得算法详解(包括扩展、同余方程)

    欧几里得算法详解(包括扩展.同余方程) 1.普通欧几里得算法(求最大公约数) 2.扩展欧几里得算法(求解a*x+b*y=c中(x,y)) 3.同余方程 1.普通欧几里得算法(求最大公约数) 欧几里得算 ...

  6. 一文速学数模-时序预测模型(四)二次指数平滑法和三次指数平滑法详解+Python代码实现

    目录 前言 二次指数平滑法(Holt's linear trend method) 1.定义 2.公式 二次指数平滑值: 二次指数平滑数学模型: 3.案例实现 三次指数平滑法(Holt-Winters ...

  7. PHP扩展代码结构详解

    PHP扩展代码结构详解 : 这个是继: 使用ext_skel和phpize构建php5扩展  内容 (拆分出来) Zend_API:深入_PHP_内核:http://cn2.php.net/manua ...

  8. python源程序文件的扩展名_python程序文件扩展名知识点详解

    python程序文件的扩展名称是什么 python程序的扩展名有.py..pyc..pyo和.pyd..py是源文件,.pyc是源文件编译后的文件,.pyo是源文件优化编译后的文件,.pyd是其他语言 ...

  9. 安卓miracast花屏_创维酷开电视多屏互动Miracast玩法详解

    创维酷开电视多屏互动Miracast玩法详解 安卓手机是可以通过多屏互动Miracast玩法直接让我们手机与创维酷开电视进行无线投屏的,但是有些创维电视的Miracast功能找不到怎么办? 创维酷开电 ...

最新文章

  1. mysql当前用户user()与current_user()
  2. Mysql InnoDB Plugin安装 install
  3. 技巧:使用User Control做HTML生成
  4. gcc和g++有什么区别?
  5. oracle rollup分组没有数据时为0_Hive 入门数据分析基础 5
  6. 【Vue】自定义指令(全局定义 局部定义)
  7. bzoj 2528: [Poi2011]Periodicity【kmp+构造】
  8. easyUI表单验证扩展
  9. java GC垃圾回收
  10. 盛京剑客系列17:市场暴跌下投资组合的调整
  11. mssql2000跟mssql2005共享问题
  12. python查找客户总金额_如何使用python中的spark查找每个月的总金额
  13. vue+elementui 字体改用思源黑体
  14. eclipse配置jsp页面模板
  15. dell服务器监控中起什么作用,Dell服务器管理软件 | 戴尔服务器监控 - ManageEngine OpManager...
  16. (转载)0201 0402 0603 0805 1206焊盘封装尺寸
  17. 复习JQuery validate验证规则
  18. 阿里云 Aliplayer高级功能介绍(三):多字幕 1
  19. 联想y7000电脑未正确启动_win10无法开机提示“你的电脑未正确启动”的解决方案...
  20. Python库turtle的趣味性用法,欢迎来品尝。

热门文章

  1. zoj 1074 To the MAX
  2. java成员方法的一般格式为_Java基本知识(四)
  3. 在阿里云服务器Windows Server 2012r IIS 上部署.NET网站
  4. 全连接条件随机场_深圳机场在国内机场中率先推出全流程“行李门到门”服务...
  5. python读取sqlserver的数据_Python实现读取SQLServer数据并插入到MongoDB数据库的方法示例...
  6. oracle分组后伪列,Oracle伪列和伪表和分组函数(row_number,Rank)
  7. win7电脑假死机怎么办
  8. 网页打开微信公众号关注界面
  9. nodejs 安装后 npm-v 无效,node全局环境配置
  10. MySQL-locate()函数