欧几里得算法:

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. java监控多个线程的实现
  2. Admin注册和路由分发详解
  3. AngularJS快速入门指南04:指令
  4. 鼓浪屿天气预报软件测试,厦门鼓浪屿天气预报15天
  5. springboot中DataSource数据源实例产生时机及所需环境
  6. DCMTK:读取DICOM图像,添加模态LUT并将其写回
  7. python中定义字符串_Python中的字符串String
  8. ajax获取get请求,get请求
  9. 无法定位程序输入点adddlldirectory 于动态_小程序能力只能“单身”?“乐高”组合玩法了解一下...
  10. RecognizerIntent(语音识别)
  11. 让cxGrid只取一部分数据
  12. Vue.js 的开始!
  13. opencv学习之------在算法设计中使用策略模式
  14. SAP软件财务年结步骤
  15. centos7系统开启ftp服务器,centos7开启ftp服务器
  16. 黑猫带你学eMMC协议第1篇:全网最全emmc协议中文详讲,这份学习框架图,你值得拥有!!!(持续更新中...)
  17. 台式计算机wifi老掉线,电脑连接WiFi容易断线或速度慢怎么回事 教你怎么解决
  18. 计算机模拟人脑,人造突触问世,计算机模拟人脑不是梦
  19. 一般试卷的纸张大小是多少_试卷,考试试卷是多大的纸
  20. 已解决SyntaxError: invalid syntax

热门文章

  1. 利用Seafile搭建私有文件同步云盘
  2. SpringBoot 集成WebSocket
  3. C#利用反射将实体类ListT转化为Datatable
  4. python 发红包import random用redenv,Python微信发红包编码案例 微信发红包的架构模式 - push博客...
  5. apache支持mysql ubuntu_Ubuntu+Apache+PHP+Mysql环境搭建(完整版)
  6. python不能卸载原因_linux上python卸载不了是什么原因?
  7. python安装rarfile模块_python windows下安装pip及rarfile
  8. 打印更无缝:微软改善Win11中通用打印体验
  9. 电脑公司win11 32位官方版镜像v2021.07
  10. tomcat 配置https安全认证协议报错解决方案