扩展欧几里德定理

C++ 拓展欧几里得算法 exgcd 二元一次不定方程(含证明) C++ 拓展欧几里得算法 exgcd 不定方程(含证明) 阅读详情

转自:点击打开链接

扩展欧几里德算法是用来在已知a, b求解一组p,q使得p * a+q * b = Gcd(p, q) (解一定存在,根据数论中的相关定理)。扩展欧几里德常用在求解模线性方程及方程组中。下面是一个使用C++的实现:
  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;
  }
  把这个实现和Gcd的递归实现相比,发现多了下面的x,y赋值过程,这就是扩展欧几里德算法的精髓。
  可以这样思考:
  对于a' = b, b' = a % b 而言,我们求得 x, y使得 a'x + b'y = Gcd(a', b')
  由于b' = a % b = a - a / b * b (注:这里的/是程序设计语言中的除法)
  那么可以得到:
  a'x + b'y = Gcd(a', b') ===>
  bx + (a - a / b * b)y = Gcd(a', b') = Gcd(a, b) ===>
  ay +b(x - a / b*y) = Gcd(a, b)
  因此对于a和b而言,他们的相对应的p,q分别是 y和(x-a/b*y)
  补充:关于使用扩展欧几里德算法解决不定方程的办法
  对于不定整数方程pa+qb=c,若 c mod Gcd(p, q)=0,则该方程存在整数解,否则不存在整数解。
  上面已经列出找一个整数解的方法,在找到p * a+q * b = Gcd(p, q)的一组解p0,q0后,p * a+q * b = Gcd(p, q)的其他整数解满足:
  p = p0 + b/Gcd(p, q) * t 
  q = q0 - a/Gcd(p, q) * t(其中t为任意整数)
  至于pa+qb=c的整数解,只需将p * a+q * b = Gcd(p, q)的每个解乘上 c/Gcd(p, q) 即可。

转:
首先扩展欧几里德主要是用来与求解线性方程相关的问题,所以我们从一个线性方程开始分析。现在假设这个线性方程为a*x+b*y=m,如果这个线性方程有解,那么一定有gcd(a,b) | m,即a,b的最大公约数能够整除m(m%gcd(a,b)==0)。证明很简单,由于a%gcd(a,b)==b%gcd(a,b)==0,所以a*x+b*y肯定能够整除gcd(a,b),如果线性方程成立,那么就可以用m代替a*x+b*y,从而得到上面的结论,利用上面的结论就可以用来判断一个线性方程是否有解。
 
       那么在a*x+b*y=m这个线性方程成立的情况下,如何来求解x和y呢?
 
       1.令a1=a/gcd(a,b),b1=b/gcd(a,b),m1=m/gcd(a,b)。如果我们能够首先求出满足a*x1+b*y1=gcd(a,b)这个方程的x1和y1,那么x=x1*m1,y=y1*m1就可以求出来了。由欧几里德算法gcd(a,b)=gcd(b,a%b),所以a*x1+b*y1=gcd(a,b)=gcd(b,a%b)=b*x2+(a%b)*y2,现在只要做一些变形就可以得到扩展欧几里德算法中的用到的式子了。令k=a/b(商),r=a%b(余数),那么a=k*b+r。所以r=a-k*b,带入上式,得到a*x1+b*y1=b*x2+(a-(a/b)*b)y2=a*y2+b*(x2-(a/b)*y2) => x1=y2,y1=x2-(a/b)*y2。有了这两个式子我们就知道了在用欧几里德求最大公约数的时候,相应的参数x,y的变化。现在再回过头来看一下扩展欧几里德算法的代码就很好理解了,实际上扩展欧几里德就是在求a和b的最大公约数的同时,也将满足方程a*x1+b*y1=gcd(a,b)的一组x1和y1的值求了出来。下面代码中突出的部分就是标准的欧几里德算法的代码。
 
__int64  exGcd( __int64  a, __int64  b, __int64  &x, __int64  &y){
     if (b==0){
         x=1;
         y=0;
         return  a;
     }
     __int64  g=exGcd(b,a%b,x,y);
     __int64  temp=x;
     x=y;
     y=temp-(a/b)*y;
     return  g;
}
 
      2.那么x,y的一组解就是x1*m1,y1*m1,但是由于满足方程的解无穷多个,在实际的解题中一般都会去求解x或是y的最小正数的值。以求x为例,又该如何求解呢?还是从方程入手,现在的x,y已经满足a*x+b*y=m,那么a*(x+n*b)+b*(y-n*a)=m显然也是成立的。可以得出x+n*b(n=…,-2,-1,0,1,2,…)就是方程的所有x解的集合,由于每一个x都肯定有一个y和其对应,所以在求解x的时候可以不考虑y的取值。取k使得x+k*b>0,x的最小正数值就应该是(x+k*b)%b,但是这个值真的是最小的吗??如果我们将方程最有两边同时除以gcd(a,b),则方程变为a1*x+b1*y=m1,同上面的分析可知,此时的最小值应该为(x+k*b1)%b1,由于b1<=b,所以这个值一定会小于等于之前的值。在实际的求解过程中一般都是用 while (x<0)x+=b1来使得为正的条件满足,为了更快的退出循环,可以将b1改为b(b是b1的倍数),并将b乘以一个倍数后再加到x上。
c++循环嵌套:不定方程求解 1101:不定方程求解 【题目描述】 给定正整数a,b,c。求不定方程 ax+by=c 关于未知数x和y的所有非负整数解组数。 【输入】 一行,包含三个正整数a,b,c,两个整数之间用单个空格隔开。每个数均不大于1000。 【输出】 一个整数,即不定方程的非负整数解组数。 【输入样例】 2 3 18 【输出样例】 4 #include<iostream> using namespace std; int main() { int a,b,c,x,y,i; //a、b、c这些是自己需要输入的 阅读详情

相关推荐

数论快速入门(同余、扩展欧几里德、中国剩余定理、大素数测定和整数分解、素数三种筛法、欧拉函数以及各种模板)

数学渣渣愉快的玩了一把数论,来总结一下几种常用的算法入门,不过鶸也是刚刚入门,  所以也只是粗略的记录下原理,贴下模板,以及入门题目(感受下模板怎么用的) 一、同余定理 简单粗暴的说就是:若 a-b == m 那么 a%m == b%m 这个模运算性质一眼看出。。。直接上入门水题: Reduced ID Numbers 附AC代码(这个也没啥模板。。。。知道就好) #includ

Must so 3950

[c++][1071] 不定方程求解

给定正整数a,b,ca,b,c。求不定方程 ax+by=cax+by=c 关于未知数x和y的所有非负整数解组数。一行,包含三个正整数a,b,ca,b,c,两个整数之间用单个空格隔开。每个数均不大于10001000。一个整数,即不定方程的非负整数解组数。

记录学习 1154

扩展欧几里德 中国剩余定理 合并模线性方程组

1.1.1 扩展欧几里得 要说扩展必须先从它的非扩展版本说起,对于求两个数的最大公约数,我们有辗转相除法,其核心就是gcd(a,b)=gcd(b,a%b) (a>=b) (1)为什么呢,我们来证明一下令a=k*b+t  则a%b=t ,若设d是a,b的一个公约数,a%d==0

foreverlin1204的专栏 2789

欧几里德算法的扩展-求解不定方程

扩展欧几里德算法是用来在已知a, b求解一组p,q使得p * a+q * b = Gcd(p, q) (解一定存在,根据数论中的相关定理)。扩展欧几里德常用在求解模线性方程及方程组中。下面是一个使用C++的实现: int exGcd(int a, int b, int &x, int &y) { if(b == 0) { x = 1; y = 0; return a;...

weixin_30377461的博客 539

二元一次不定方程求解 C++小程序

说明:此程序公式为 a*x+b*y=c,输入a、b和c的值,即可计算x和y的值。 注意:a,b,c,x和y都为正整数! 声明:版权归 优快云 用户“Schoolchild C++”所有,未经同意,不得转载,否则将视为侵权。

NVIDIA 2025 Board Design Engineer 校招笔试

电路分析,矩形波阶跃反馈驱动​,误差信号。非常简单,数电or​离散基础。第一题是考试规矩知情确认。大二暑假做的,纯体验​。五六题太长,下篇分享。

m0_74253823的博客 1130

裴蜀定理与扩展欧几里德算法

裴蜀定理又称贝祖定理:对于给定的正整数a,b,方程ax+by=c有解的充要条件为c是gcd(a,b)的整数倍。 裴蜀定理的推广:方程ax+by+cz+…+nm=f(其中a,b,c…n,f为整数)有解的充要条件是f为gcd(a,b,c,…,n)的整数倍。 裴蜀定理的应用: 给定一个序列{an},寻找一个整数序列{bn}使得a1b1+a2b2+…+an*bn值最小(要求最小值为正数),求这个最小值。 解:根据裴蜀定理的推广,原式最小值即为gcd(a1,a2…an)。 扩展欧几里德算法是为求解裴蜀定理服务的。即通

鼎寒的博客 631

别再手动调时间了!用Windows自带的tzutil命令,1分钟搞定时区错误

本文介绍了如何使用Windows自带的tzutil命令快速解决时区错误问题。通过简单的命令行操作,用户可以一键切换时区、查看全球时区代码库,并实现自动化时区同步。相比传统GUI设置,tzutil更可靠且高效,特别适合企业环境批量部署。

weixin_42531494的博客 315

HDU - 2669 Romantic (扩展欧几里德定理)

The Sky is Sprite. The Birds is Fly in the Sky. The Wind is Wonderful. Blew Throw the Trees Trees are Shaking, Leaves are Falling. Lovers Walk passing, and so are You. ................................Write in English class by yifenfei

hyesuixin的博客 277

【Linux】常见指令的使用

Linux常用指令

qq_74897518的博客 1479

Python调用Google Trends官方数据接口实战指南

Google Trends作为全球最权威的搜索热度分析工具,其数据本质是公开、结构化、可编程访问的时序指标,而非需爬取的网页内容。其底层基于标准HTTP协议与JSON API交互,核心原理在于复现用户浏览器行为——通过/explore接口获取token,再凭token请求/widgetdata/multiline等端点获取归一化(0-100)时间序列数据。该技术路径规避了Selenium渲染依赖与非官方库的脆弱性,具备高稳定性、易调试、可监控等工程优势,广泛应用于竞品监测、内容选题验证、地域营销策略制定等业

weixin_29789925的博客 421

【BZOJ1004】【Burnside定理】【DP】【扩展欧几里徳】cards

看到这道题,如果之前做过相关的一些题的话应该会很快知道这是一道重复计数类问题。解决这类问题的话不得不提到的就是:Burnside定理和Pólya计数法,由于我数学比较弱,所以这里也不介绍了。具体可见 <!-- @page {margin:2cm} p {margin-bottom:0.21cm; direction:ltr; color:#000000; text-ali

I'm dreamer 1855

结合qtdesigner,用pyqtgraph在界面上绘制波形图(一)

思路:先画图,然后在qtdesigner上放一个容器,给这个容器添加一个布局,然后把图当作一个Widget放入布局中。二、PyUIC把test.ui转换成test.py,再新建一个load_test.py写脚本。就这么简单,基础部分就完成了。也可以给它添加样式,我知道的样式不算多,但会继续写。一、随便拖进来一个容器控件,我拖了一个Widget。要想把波形图显示在界面上,核心思想其实很简单。三、load_test.py的代码。

learninger_lt7的博客 1804

复习数学之中国剩余定理和欧拉定理和扩展欧几里德

这几个玩意儿忘光了。。。中国剩余定理对于线性同余方程组: x≡a1(modm1)x\equiv a_1 \pmod {m_1} x≡a2(modm2)x\equiv a_2 \pmod {m_2} x≡a3(modm3)x\equiv a_3 \pmod {m_3} …\ldots x≡an(modmn)x\equiv a_n \pmod {m_n} 定义 M=∏ni=1mM=

黑历史 773

MIPI D-PHY TX 一致性测试实例解析 Part 01 续

本文为MIPI D-PHY TX一致性测试实例解析part01章节的第二部分

一只豌豆象的博客 6045

【参数配置】OpenClaw 的破解之道(Doom Loop)

本文深入解析了OpenClaw中的Doom Loop(死循环)问题及其应对策略。主要内容包括: Agent Loop的核心概念:基于ReAct范式,OpenClaw通过"思考-行动-观察"循环执行任务,但可能陷入无进展的死循环。 Doom Loop现象:Agent持续执行但任务进度为零,常见于四种工具调用场景:相同调用重复执行、调用不存在工具、轮询工具卡死、操作交替振荡。 OpenClaw的防御机制: 第一道防线:重试端断路器,通过上下文压缩熔断(最多3次)和总重试次数熔断(32-160次)防止无限重试。

海兰 4042

逆元巨详细解法(欧拉定理,费马小定理,扩展欧几里德算法,递推,递归)

( 应acm协会的以往的习惯,每届学长学姐都要给下一届的学弟们(对,我们的下一届没有学妹)讲一个知识点,菜菜的我没什么别的选择,只能硬着头皮给他们讲数论基础,历时整整一天半,终于把课件以及要讲的东西捋清楚了TVT。虽然真正讲课的时候 垮了,但是自己也真的把这些平常看着头大的定理理清楚了!!!) 好了进入正题: 一、欧几里德算法(这里直接供上ppt内容) 二、扩展欧几里德算法 这个算...

baymax__dabai的博客 607

基于强化学习控制策略的三相逆变器仿真

强化学习控制器的核心在于定义状态空间、动作空间、奖励函数以及选择合适的强化学习算法(例如DQN、DDPG等)。对于三相逆变器,状态可以是输出电压、电流等信息;动作则可能是调制指数的变化量;奖励函数则应鼓励快速准确地跟踪参考信号。定义状态空间和动作空间状态空间可以包括逆变器的输出电压、电流及其变化率等信息。动作空间则是控制器可执行的动作,例如PWM信号的调整幅度。matlab深色版本% 定义状态和动作空间维度numObs = 6;% 假设有六个状态变量(例如三相电压和电流)

amy_mhd的博客 135

取模运算的性质、扩展欧几里德定理

取模运算 对于整型数a,b来说,取模运算或者求余运算的方法都是: 1.求 整数商: c = a/b; 2.计算模或者余数: r = a - c*b. 求模运算和求余运算在第一步不同: 取余运算在取c的值时,向0 方向舍入(fix()函数);而取模运算在计算c的值时,向负无穷方向舍入(floor()函数)。 例如:计算-7 Mod 4 那么:a = -7;b = 4; ...

afvdxhq267883的博客 500

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

数论入门基础(同余定理/费马小定理/扩展欧几里德算法/中国剩余定理)

本文整理了同余定理/费马小定理/扩展欧几里德算法/中国剩余定理基本的念描述、结论证明和模板应用                                                     同余定理 1.描述:        同余定理是数论中的重要概念。给定一个正整数m,如果两个整数a和b满足(a-b)能够被m整除,即(a-b)/m得到一个整数,那么就称整数a与b对模m同余,记作a...

Allen的博客 1803

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

数论入门基础(同余定理/费马小定理/扩展欧几里德算法/中国剩余定理)~

欢迎访问https://blog.youkuaiyun.com/lxt_Lucia~~ 宇宙第一小仙女\(^o^)/~~萌量爆表求带飞=≡Σ((( つ^o^)つ~ dalao们点个关注呗~~   数论入门~~ 本文主要整理了一下  同余定理/费马小定理/扩展欧几里德算法/中国剩余定理  各自的概念描述、结论证明和模板应用,需要的可以参考一下咯~   一.同余定理   1.描述:        ...

lxt_Lucia的博客 2048

HDU 1222_Wolf and Rabbit (扩展欧几里德定理)

There is a hill with n holes around. The holes are signed from 0 to n-1. A rabbit must hide in one of the holes. A wolf searches the rabbit in anticlockwise order. The first hole he get into is the one signed with 0. Then he will get into the hole every m

hyesuixin的博客 334

中国剩余定理(转载)(中国剩余定理与扩展欧几里德的联系)

https://www.cnblogs.com/freinds/p/6388992.html 首先要知道中国剩余定理是用来求 一个数 X 使 X%a=t1 && X%b=t2 && X%c=t3 具体操作是1)先求出y3 * lcm(a,b)%c=1 y2 * lcm(a,c)%b=1 y1 * lcm(b,c)%a=1中的y1,y2,y3,也就是求lc...

weixin_30955617的博客 86

扩展欧几里德算法 线性同余方程 中国剩余定理

转自:http://hi.baidu.com/sunhaowenprime/item/5626e3e69858afaec10d7522 哎呀,经过这两三天的奋斗,终于搞懂了一类问题——用扩展欧几里德算法求解线性同余方程。其实这类问题应该是比较基础也比较简单的,但我由于几乎没有一点数论的基础,所以还是难为了我不久,等现在彻底搞明白以后再看真的觉得是挺简单的,有关这类问题的题

MagHSK.Blog 745
上一篇: POJ 1056 IMMEDIATE DECODABILITY(字典树)
下一篇: POJ 1062 昂贵的聘礼(DP)
Baoli1008
博客等级 码龄12年 70粉丝 293原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值