首页 > 其他分享 >Exgcd学习笔记

Exgcd学习笔记

时间:2024-09-24 21:37:37浏览次数:1  
标签:lfloor frac gcd int 笔记 times 学习 tmpy Exgcd

Exgcd 学习笔记

引理

Bézout's theorem

对于 \(gcd(a,b)=d\) 的情况,一定 \(\exists x,y\) ,使得 \(ax+by=d\) 成立。相反的,当解方程 \(ax+by=c\) 时,若 \(c\) 不是 \(d\) 的倍数,那么此方程一定无解。

Exgcd 推导

我们知道如何通过辗转相除法求出 \(gcd(a,b)\) ,那么结合贝祖定理,不难发现方程 $bx+(a\mod b)y =d $ 和上述方程一定有相同的解,更极限地想,当 \(a\equiv0\mod b\) 时,方程变成了 \(a'x=d\) ,而根据辗转相除法,此时的 \(a'\) 一定等于 \(d\) ,所以解为 \(x=1,y=\text{any_number}\) ,假设我们在递归的过程中知道了当层的解,那么可不可以借此推至上一层的解呢?答案是肯定的。

\(a\mod b\) 实际上就是 \(a-\lfloor\frac{a}{b} \rfloor\times b\) ,那么方程经过一次迭代之后就变成了 \(bx+(a-\lfloor\frac{a}{b} \rfloor\times b)y=d\) ,整理一下就可以得到 :
\(ay+b(x-\lfloor\frac{a}{b} \rfloor y)=c\) ,,此时方程达到同构,那么在我们知道 \(x,y\) 的值的情况下面就可以很自然地算出上一层递归中 \(x,y\) 的值分别是多少,这一效果在我们递归到刚刚提到的最后一层的时候就可以达到。

代码如下:(顺带求了个 \(gcd\) )

inline int exgcd(int a,int b,int &x,int &y)
{
	if(b==0)
	{
		x=1,y=0;
		return a;
	}
	int tmpx,tmpy;
	int d=exgcd(b,a-(a/b)*b,tmpx,tmpy);
	x=tmpy,y=tmpx-(a/b)*tmpy; 
	return d;
}

如何获得一般解?

我们得到的不过是一组可行解,那么如何由这组可行解推知一般解呢?

考虑如下构造:

\[a(x_0+p)+b(y_0+q)=c \]

同时我们也有刚刚得到的 :
\(ax_0+by_0=c\)

整理就可以得到 $ap+bq=0\iff p=-\frac{b}{a}q $ ,首先要使得其为整数,那么结合约分的过程,我们知道必要条件是 \(\frac{a}{gcd(a,b)}|q,\frac{b}{gcd(a,b)}|p\) ,两者只需要满足一个,另外一个就自动满足了。那么我们就可以得到 \(p,q\) 取值的一般形式:

\[\begin{cases}p=t\times \frac{b}{d}\quad x=x_0+p\\q=-t\times \frac{a}{d} \quad y=y_0+q\end{cases} \]

如何获得有限制的解

即一组正整数解,以及此时 \(x,y\) 各自的最大最小取值;或者没有正整数解的时候 \(x,y\) 分别的最小正整数取值。

通过令 \(x>0\) ,发现需要让 \(t>-x_0\times \frac{d}{b}\) ,那么 \(t\) 的最小值就是 \(\lfloor-x_0\times \frac{d}{b}\rfloor+1\)

同理令 \(y>0\) ,发现需要让 \(t<y_0\times \frac{d}{a}\) , 那么 \(t\) 的最大值就是 \(\lceil y_0\times \frac{d}{a}\rceil-1\)

我们只需要去验证当 \(t\) 取到最小最大值的时候另一个数是否也为正整数即可,事实上我们只需要验证一组即可。

代码如下 :

inline void solve(int a,int b,int c)
{
	if(c%gcd(a,b)!=0)
	{
		puts("-1");		
		return ;	
	}
	int f=c/gcd(a,b),x,y;
	int d=exgcd(a,b,x,y);
	x*=f,y*=f;
	int t,tmpt;
	t=(int)floor(-1.0*d*x/b)+1;
	tmpt=(int)ceil(1.0*d*y/a)-1;
	if(y-t*a/d<=0)
		wr(x+t*b/d),putchar(' '),wr(y-tmpt*a/d),putchar('\n');
	else
		printf("%lld %lld %lld %lld %lld\n",abs(t-tmpt)+1,x+t*b/d,y-tmpt*a/d,x+tmpt*b/d,y-t*a/d);
}	

标签:lfloor,frac,gcd,int,笔记,times,学习,tmpy,Exgcd
From: https://www.cnblogs.com/Hanggoash/p/18430082

相关文章

  • 9.24学习
    转载,非原创,写在这记录用的聊一聊我最近使用的uniCloud是个什么玩意?-腾讯云开发者社区-腾讯云(tencent.com)什么是uniClouduniCloud是DCloud联合阿里云、腾讯云,为开发者提供的基于serverless模式和js编程的云开发平台。到底是怎么一回事?听我给你简单说一下对架构演......
  • Rust的初级学者课程和学习资源推荐
    目录一、Rust简介二、安装Rust三、基础语法四、所有权和借用五、结构体和枚举六、模块和包管理七、错误处理八、总结和进一步学习一、Rust简介什么是Rust?强调安全性、性能和并发性的系统编程语言。适用于从底层系统编程到Web开发等各种领域。Rust的特点......
  • Git学习
    前言会用docker了,结果啥都要自己下载(gdb,pwndbg,git...),真是麻烦到家了。现在顺便学一下git吧。廖雪峰的教材命令仓库初始化gitinit添加gitaddxxxgitcommitxxx重置gitreset--hardHEAD^/HEAD~100/commit_idgit查看查看idgitrefloggitloggitstatus查看修改gi......
  • 吴恩达机器学习课程 笔记4 分类 逻辑回归
    逻辑回归机器学习中的逻辑回归(LogisticRegression)是一种广泛使用的分类算法,尽管它的名字中包含“回归”这个词,但实际上它主要用于解决分类问题,特别是二分类问题。逻辑回归模型可以用来预测某一类事件发生的概率,例如预测用户是否会点击广告、病人是否患有某种疾病等。逻辑回归的......
  • Java学习笔记(上)——动力节点老杜(某站2000万播放)
    此文章是本人大一学习java时记的笔记,原视频在https://www.bilibili.com/video/BV1Rx411876f,配套服用更佳!一.JAVA开发环境的搭建1.常用的Dos命令1.1win+r打开Dos命令窗口1.2什么是Dos命令在最初的计算机中没有图形界面,也就是说通过Dos命令窗口可以完全完成文件的新建、......
  • MarkDown学习
    MarkDown学习标题一级标题:“#”+空格二级标题:“##“+空格三级标题:”###“+空格字体粗体:两边加“**”Hello,World!斜体:两边加“*”Hello,World!粗斜体:两边加三个“*”Hello,World!删除效果:两边加“~~”Hello,World!引用右箭头“>”+回车《JavaSe......
  • 【Python学习笔记】字符串
    目录1.定义字符串2.基本操作2.1索引:2.2访问单个字符:2.3访问范围内字符:2.4单个字符编码3.转义符4.运算符5.格式化6.常用字符串函数6.1查找类函数6.2分割类函数6.3字符串连接方法6.4大小写字符转换方法6.5替换方法6.6删除字符串两端、右端或左端连续空白字符......
  • 【深度学习】03-神经网络 3-3 梯度下降的优化方法-动量算法Momentum
    常规的梯度下降算法中,会遇到平缓区域,碰到鞍点,碰到局部最小值(截止当前无解),因此为了解决这个问题,我们需要优化传统的梯度下降算法。动量算法(Momentum)是梯度下降算法的一种优化方法,旨在解决传统梯度下降容易陷入局部最小值或在鞍点附近震荡的问题。动量算法通过引入一个“动......
  • 【万字文档+PPT+源码】基于springboot+vue医院挂号系统-可用于毕设-课程设计-练手学习
    博主简介:......
  • 【万字文档+PPT+源码】基于springboot+vue新闻发布系统-可用于毕设-课程设计-练手学习
    博主简介:......