关于exgcd及其通解

2023-11-22 18:00
文章标签 通解 exgcd

本文主要是介绍关于exgcd及其通解,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

欧几里得算法:

两个数x和y的最大公约数gcd(x,y)=gcd(y,x%y).这个就不解释了。

关于Exgcd:

用法:

exgcd用于求解不定方程ax+by=c的一组解。准确的说,它是用来求解ax+by=gcd(a,b),的x和y。

求解过程:

采用递归方式,我们对a,b不断的求解gcd过程,并从中推出x和y.

我们假设有ax+by=gcd(a,b).

令a=b,b=a%b,则有

      bx+(a\%b)y=gcd(b,a\%b)=gcd(a,b)

由于a%b=a-(a/b)*b,(此处为整除)

      bx+(a-a/b)y=gcd(a,b)

将整数化开,有

      bx+ay-a/b*by=gcd(a,b)

      ay+b(x-a/b*y)=gcd(a,b)

于是,令x=y,y=x-a/b*y;我们从b,a%b转移到了a,b。

考虑边界,当b=0时,有gcd(a,0)=a

于是1*a+0*b =a

我们令x=1,y=0,则求出了ax+by=gcd(a,b)中当辗转相除到最后时的一组解,然后将之往后递推

求ax+by=k的解时,如果gcd(a,b)|k,在ax+by=gcd(a,b)两边同时乘上k/gcd(a,b),得到x,y.

否则,该方程无解。有兴趣可以看看贝祖定理.

inline int exgcd(int a, int b, int &x, int &y)
{if(! b){x = 1;y = 0;}else{exgcd(b, a % b, x, y);int t = x;x = y;y = t - (a / b) * y;}return 0;
} 

 

关于通解:

设我们已经找到了一组x,y满足ax+by=gcd(a,b);

由于x,y\in Z,我们有

       y=(gcd(a,b)-ax)/b\in Z  (*)

假设存在另一解x_{0}=x+i,则存在

       ax_{0}+by_{0}=gcd(a,b)

分离出y0得

       y_{0}=(gcd(a,b)-ax_{0})/b

            =(gcd(a,b)-ax-ai)/b

            =(gcd(a,b)-ax)/b+ai/b

我们要保证y_{0}\in Z

由(*)得 (gcd(a,b)-ax)/b\in Z

则有ai/b\in Z.即a/b*i\in Z.

显然,若a,b互质,则有i_{min}=b.

若a,b不互质,则\exists d=gcd(a,b),

使得 a=a^{'}*d,b=b^{'}*d

a^{'}/b^{'}*i\in Z

其中,a^{'},b^{'}互质。

由此,x的通解为x_{i}=x+ki,k\in Z.其中i=b^{'}=b/gcd(a,b)

x的最小正整数解x_{min}=(x-x/(b/gcd(a,b))*(b/gcd(a,b)))=x\%(b/gcd(a,b)).

k=\frac{b}{gcd(a,b)};由于x可能为负,所以事实上x_{min} = (x\%k+k)%k

同样的,求解ax+by=0也可以这么写。

emmmmmmm.

 

这篇关于关于exgcd及其通解的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/411926

相关文章

P1516 青蛙的约会(exgcd)

一些前置知识: 1.扩展欧几里得算法:                                          ax+by=gcd(a,b) 方程一个可行的解(x1,y1)求法: int exgcd(int a,int b,int &x,int &y){if(!b){x=1,y=0; return a;}int d=exgcd(b,a%b,y,x);y-=a/b*x;ret

由二阶常系数线性方程的通解反推方程

由二阶常系数线性方程的通解反推方程 @(微积分) 引例是这样的: 设 cosx cosx与 xex xe^x为某n阶常系数线性齐次方程的两个解,则最小的n = ?,相应的首项系数为1的方程是? 分析:由cosx是一个解,则必有另一解sinx, ±i \pm i是它的特征根; xex xe^x是一个解,则必有另一解 ex e^x,则1必是二重特征根。所以,n至少为4.特征方程可以列举如

青蛙的约会 (exgcd 扩展gcd)

题目链接 青蛙的约会 这里可以推荐大家看看题解中的第一篇皎月半洒花大佬的题解 下面是我自己的一个小思路,写完后写代码就可以说不是一般轻松了, 再附上关于对最后一步负数如何转正数的一个理解,比如S/gcd和l/gcd来源的一个视角的解答,这本书挺好的,安利给大家!《数论概论》【美】约瑟夫 H.西尔弗曼写的 附上代码 #include<bits/stdc++.h>using nam

【学习心得】爬虫JS逆向通解思路

我希望能总结一个涵盖大部分爬虫逆向问题的固定思路,在这个思路框架下可以很高效的进行逆向爬虫开发。目前我仍在总结中,下面的通解思路尚不完善,还望各位读者见谅。 一、第一步:明确反爬手段 反爬手段可以分为几个大类 (1)检查请求头信息         服务器会检查User-Agent、Referer、cookie、检查加密的URL/API参数等等。         1、请求参

线性代数笔记13——Ax=b的通解

关于最简行阶梯矩阵和矩阵秩,可参考《线性代数笔记7——再看行列式与矩阵》     召唤一个方程Ax = b:     3个方程4个变量,方程组有无数解,现在要关注的是b1b2b3之间满足什么条件时方程组有解,它的解是什么?   在这个例子中可以马上看出,b1+b2 = b3,一般的方法是消元法化简:   化简到这一步就可以确定主元是x1和x3。通过最后一行可知,b3 – b2

【数论】exgcd 扩展欧几里得算法

参考:exgcd详解 - zzt1208 - 博客园 (cnblogs.com) exgcd(扩展欧几里得算法),用来求形如 a x + b y = g c d ( a , b ) ax+by=gcd(a,b) ax+by=gcd(a,b)( a , b a,b a,b 为常数)的方程的一组整数解。(如果不确定等号右边是不是gcd,可以先当做gcd,求出来之后验证,是的话就是解,不是的话就不是

扩展欧几里得-exgcd

基本算法:对于不完全为 0 的非负整数 a,b,gcd(a,b)表示 a,b 的最大公约数,必然存在整数对 x,y ,使得 gcd(a,b)=ax+by。 证明:设 a>b。   1,显然当 b=0,gcd(a,b)=a。此时 x=1,y=0;   2,ab!=0 时   设 ax1+by1=gcd(a,b);   bx2+(a mod b)y2=gcd(b,a mod b);   根

Bzoj 3122 [Sdoi2013]随机数生成器(BSGS+exgcd)

Input 输入含有多组数据,第一行一个正整数T,表示这个测试点内的数据组数。 接下来T行,每行有五个整数p,a,b,X1,t,表示一组数据。保证X1和t都是合法的页码。 注意:P一定为质数 Output 共T行,每行一个整数表示他最早读到第t页是哪一天。如果他永远不会读到第t页,输出-1。 Sample Input 3 7 1 1 3 3 7 2 2 2 0 7 2 2

小贴士:知道方程的解如何求通解

1.思路:认知:题中的所有解都是特解,解的形式为kx+b         1.如何求通解:a1+a2是题目中提供的条件,根据认知它们的和是2b,所以b等于a1+a3除2,而有一条认知,为两个特解的差为通解向量,而这个是三元方程,秩为2,所以它们的差代表了自由向量的个数,也就是通解向量的个数,而通解向量等于两个b的差(记忆),所以为a2-a3。

线性代数之基础解系与通解的求法

线性代数之基础解系与通解的求法 初等变换法 已知如下方程,求解其基础解系和通解。 首先写出系数矩阵A并转换成行简化阶梯型。 总结