首页 > 编程语言 >关于扩展欧几里德算法的一点小思考

关于扩展欧几里德算法的一点小思考

时间:2022-10-10 00:12:23浏览次数:56  
标签:方程 gcd 欧几里德 算法 思考 delta ax X0 正数

求ax=c%b的最小正整数解
首先我们应该知道所有的同余方程,均是从不定方程来的
例如ax=c%b,就是将不定方程ax+by=c的左右两边,同时模b得来的
于是我们先试着对ax+by=c这个方程进行求解,求解的方法是使用扩展欧几里德算法。
假设我们已得到了一组(X0,Y0)的解,即满足
aX0+bY0=c.
但此时求出来的X0的值,可能是负数,也可能是一个很大的正数。
如果是负数的话,我们可尝试着调整一下,将X0变成满足条件的最小正整数解
方法如下:
在方程的左边,同时加上一个数字delta,再减去一个数字delta。这样方程是不变的
那这个delta的值应该为多少呢?
易知设delta=a*b/gcd(a,b)
于是原方程变为
aX0+bY0+a*b/gcd(a,b)-a*b/gcd(a,b)=c
方程再变形为
a(X0+b/gcd(a,b))+b(Y0-a/gcd(a,b))=c
如果X0+b/gcd(a,b)仍为负数的话,那再加上一个delta,这样加下去的话
X0终会变成正数的,同时也易知在正整数范围内,这个方程是有无限多组解的。
当然如果X0是一个很大的正数,我们希望将其缩小的话,也可以采用上面这种方法,在此不再赘述了。
为了更快的得到方程的最小正整数解
我们不妨采用下述方法
X0=(X0%delta+delta)%delta
易知X0%delta后,其绝对值总是在区间[0..delta-1]之间的
如果X0%delta是个负数,则加上b后,就转为正数了
如果X0%delta是个正数,则加上delta再去模delta,对其值是没有影响的.

在找到最小正整数解后,如果还希望找出x在[0..b-1]范围内的所有解的话
为了表述方便,我们设方程的通解为
x=x0+k*b/gcd(a,b)
y=y0-k*a/gcd(a,b)
其中k>=0
不难发现,当k=gcd(a,b)时
x=x0+b,此时的x>b了,也就是说x在[0..b-1]范围内有gcd(a,b) 组解,则如果gcd(a,b)=1的话,则就只有一组解了。
同时也易发现此时x与x0是在模b的情况下是同余的。
这个结论在我们求解
ax=1%b时,有点小用处。
其实此时的x,被我们称之为a在模b的逆元。
一般求逆元,我们使用扩展欧几里德算法就行了。
但如果存在先决条件gcd(a,b)=1,并且b为质数时
根据费马小定理a^(b-1)%b=1
于是a的逆元,我们可直接设定成a^(b-2)即可。
根据前面所述,如果是希望找到a的最小逆元的话,则根据前面所述:由于gcd(a,b)=1.
于是方程ax+by=1,x在范围[0..b-1]只有一个解。
则只需将a^(b-2)%b即可。

如果先决条件中只保证gcd(a,b)=1,b并不为质数时
则可以使用欧拉定理进行求解。








标签:方程,gcd,欧几里德,算法,思考,delta,ax,X0,正数
From: https://www.cnblogs.com/cutemush/p/16774180.html

相关文章

  • 学习:对学习的深度思考
    对学习的深度思考    做事,首先是思路(完成事情的途径),其次是实现思路中每个步骤。 思考,在“当前”和“目标”之间建立一条可行的路径。当前,是指在当前所......
  • LeetCode算法笔记 88. 合并两个有序数组
    importjunit.framework.TestCase;importjava.util.Arrays;publicclassLeetCode02_2extendsTestCase{/***88.合并两个有序数组*给你两个......
  • 算法1-c# dotnet core3.1
    usingSystem;namespaceConsoleApp1{classProgram{staticvoidMain(string[]args){Console.WriteLine("HelloWorld!");......
  • 华为招聘|自动驾驶感知、融合、预测、PNC、SLAM算法及深度学习算法研究员等岗位
    技术改变世界,梦想成就自我校园招聘专场             --华为2012实验室.自动驾驶团队·招聘信息:对象:海外/国内优秀高校博士及海外硕士。(团队国内......
  • 算法1-Java
    importjava.util.Date;classTest{publicstaticvoidmain(String[]args){longt1=newDate().getTime();for(inta=0;a<1001;a++){......
  • LeetCode算法笔记 1. 两数之和
    publicclassLeetCode02_1extendsTestCase{/***1.两数之和*给定一个整数数组nums和一个整数目标值target,请你在该数组中找出和为目标值tar......
  • 牛客网高频算法题系列-BM18-二维数组中的查找
    牛客网高频算法题系列-BM18-二维数组中的查找题目描述在一个二维数组array中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺......
  • KMP 算法 再次学习
    c++版后面再补packagecn.kbug.dynamic;importjava.util.Arrays;/***KMP算法本质上是对搜索的字符串做优化,然后在匹配的时候,能做到非常省时间*如果搜索的串......
  • Raft 共识算法:全貌
    转载请注明出处:https://www.cnblogs.com/morningli/p/16768025.htmlRaft基础raft集群由若干server组成,典型的集群包含5个server,这样可以允许两个server发生故障。这些s......
  • 两种技能增长曲线阅读思考
    两种技能增长曲线阅读思考引言两种技能增长曲线并不是新东西,把这个标题放到网上搜索你会发现一大堆类似的文章,每个人对于技能增长曲线有不同的思考,本文仅仅是对此做了简单梳......