欧几里得算法 这个就是常说的辗转相除法,用于计算两个整数 $a,b$ 的最大公约数,即$$gcd(a,b)=gcd(b,a\;mod\;b)$$

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

View Code

  展欧几里德算法 是用来在已知 $a,b$ 求一组整数解 $x,y$ 使它们满足等式$$ax+by=gcd(a, b)$$

  (解一定存在 根据数论中的相关定理 具体怎么证明我也不清楚)

  那么问题来了 如何求出一组 $x,y$

  证明如下(重点):

  设 $a>b$

  显然当 $b=0$ , $gcd(a,b)=a$ 时,$x=1$ , $y=0$ ;

  当 $a>b>0$ 时,设$$ax_1+by_1= gcd(a,b)$$$$bx_2+(a\;mod\;b)y_2=gcd(b,a\;mod\;b)$$

  根据朴素的欧几里得算法,可得$$ax_1+by_1=bx_2+(a\;mod\;b)y_2$$$$ax_1+by_1=bx_2+(a- \lfloor \frac{a}{b} \rfloor b)y_2$$$$ax_1+by_1=ay_2+b(x_2- \lfloor \frac{a}{b} \rfloor y_2)$$

  根据恒等定理得$$x_1=y_2$$$$y_1=x_2- \lfloor \frac{a}{b} \rfloor y_2$$

  这样我们就得到了求解 $x_1,y_1$ 的方法:$x_1,y_1$ 的值基于 $x_2,y_2$

  上面的思想是以递归定义的,因为 $gcd$ 不断的递归求解一定会有个时候 $b=0$ ,所以递归可以结束

int exgcd(int a,int b,int &x1,int &y1){if(!b){x1=1;y1=0;return a;}ans=exgcd(b,a%b,x1,y1);int t=x1;x1=y1;y1=t-a/b*y1;return ans;
}

View Code

  下面是一些重要的结论

  结论一 设 $a,b,c$ 为任意整数,若方程 $ax+by=c$ 的一组整数解为 $(x_0,y_0)$ ,则他们的任意整数解都可以写成 $(x_0+kb',y_0-ka')$ ,其中 $a'=\frac{a}{gcd(a,b)}$ , $b'=\frac{b}{gcd(a,b)}$ , $k \in Z$

  结论二 设 $a,b,c$ 为任意整数,$g=gcd(a,b)$ ,方程 $ax+by=g$ 的一组整数解为 $(x_0,y_0)$ ,则当 $c$ 是 $g$ 的倍数时,$ax+by=c$ 的一组整数解是 $(x_0 \frac{c}{g},y_0 \frac{c}{g})$ ;当 $c$ 不是 $g$ 的倍数时,无整数解

  然后洛谷上有道关于扩展欧几里得很经典的题 青蛙的约会 下面是AC代码

#include <cstdio>
#include <algorithm>
using namespace std;
#define ll long longll x,y,m,n,l;
ll ans,x1,y1;ll exgcd(ll a,ll b,ll &x1,ll &y1){if(!b){x1=1;y1=0;return a;}ans=exgcd(b,a%b,x1,y1);ll t=x1;x1=y1;y1=t-a/b*y1;return ans;
}int main(){scanf("%lld%lld%lld%lld%lld",&x,&y,&m,&n,&l);ll a=n-m,c=x-y;if(a<0){a=-a;c=-c;}exgcd(a,l,x1,y1);if(c%ans) printf("Impossible");else printf("%lld",((x1*(c/ans))%(l/ans)+(l/ans))%(l/ans));//处理负数的神奇方法 return 0;
}

View Code

转载于:https://www.cnblogs.com/Pedesis/p/10339787.html

欧几里得及扩展欧几里得算法相关推荐

  1. 数论:欧几里得与扩展欧几里得算法

    文章目录 欧几里得算法 历史发展 表示 证明 代码 例题 扩展欧几里得算法 表示 求解方法 代码 其他定理: 例题 欧几里得算法 历史发展 欧几里得算法用来求得两个数的最大公约数,大约公元前300年首 ...

  2. 欧几里得与扩展欧几里得算法(含推导过程及代码)

    文章目录 前言 一.欧几里得算法 二.扩展欧几里得算法 2.1.认识裴蜀定理 2.2.推导ax+by=gcd(a, b)得到x与y 2.2.1.推导过程 2.2.2.代码实现 2.3.推导ax+by= ...

  3. 欧几里得和扩展欧几里得算法

    欧几里得算法 又称为辗转相除法,c语言代码如下: 分析:a,b的关系可表示为a=kb+t, 即 a-kb=t, t=a%b, 假设c为a,b的一个公约数,将a-kb=t等式两边同除c, 得 a/c-k ...

  4. 欧几里得与扩展欧几里得算法

    原博客:https://www.cnblogs.com/haveyoueverbeen/p/4612753.html 关于扩展欧几里得算法(Extended Euclidean Algorithm), ...

  5. 欧几里得  拓展欧几里得算法 讲解 (Euclid Extend- Euclid Algorithm)

    欧几里得& 拓展欧几里得(Euclid & Extend-Euclid) 欧几里得算法(Euclid) 背景: 欧几里德算法又称辗转相除法,用于计算两个正整数a,b的最大公约数.   ...

  6. 欧几里得扩展欧几里得算法及相关的数学证明

    //欧几里得算法求最大公约数 int gcd(int m,int n) {int u0=m,u1=n,t;if( u0<u1 )// 保证u0>=u1u0^=u1,u1^=u0,u0^=u ...

  7. 欧几里得扩展欧几里得算法

    #朴素的欧几里得算法大家应该知道 g c d ( a , b ) gcd(a,b) gcd(a,b)表示a,b的最大公约数 朴素的欧几里得算法其实就是所谓的辗转相除法 辗转相除法 g c d ( a ...

  8. 扩展欧几里得算法_扩展欧几里得递推算法

    欧几里得算法 表示 整数 a 与 b 的最大公约数. 若 t = a % b, 则 证明略. 递推版 gcd 算法 gcd 接受变量元组 (a, b) 作为输入,输出最大公约数 (r). 我们很难直接 ...

  9. c语言中欧几里得模乘法逆元,扩展欧几里得算法同余方程模m乘法逆元详解

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

最新文章

  1. .NET CORE迁移踩坑
  2. VTK:Snippets之RestoreSceneFromFile
  3. kali linux 2.0 web 渗透测试 电子书
  4. JAVA错误:无法从静态上下文中引用非静态变量 this
  5. Tensorflow-gpu 2.4.1与CUDA11.1,cuDNN8.1配置问题
  6. 三菱FX3S,FX3G,FX3U序列PLC控制器编程手册-基本应用指令篇下载
  7. java socket 发对象_Java Socket 发送对象
  8. 使用阿里云接口进行银行卡四要素实名认证
  9. HTML为标题栏添加图片
  10. 根据经纬度获取地理位置
  11. AWS中联网Amazon VPC相关概念
  12. android手机性能如何界定,手机性能测试最新资讯
  13. 解决 E45: 'readonly' option is set (add ! to override)
  14. 鸿蒙子系统解读-分布式任务调度篇
  15. 使用esp 8266物联网开发板 + Mqtt制作远程控制LED小灯
  16. React Native之样式
  17. ElasticSearch + Kibana
  18. RISC-V 指令格式
  19. 第一只python小爬虫
  20. 创业是红海好还是蓝海好?

热门文章

  1. 实战SSM_O2O商铺_20【商铺编辑】View层开发
  2. Java-CGLib动态代理
  3. Oracle-Oracle数据库结构
  4. linux之用 grep -r 关键字
  5. 一个对象的属性_【前端冷知识】如何判断一个对象的某个属性是可写的?
  6. Toast弹不出来之谜
  7. 2021-04-15 深入理解SLAM技术 【2】 SLAM的框架
  8. 原生js实现轮播图实例教程
  9. 在 Element-UI 的 Table 组件上添加列拖拽效果
  10. 『ES6』ES6 - 学习笔记