欧几里德扩展方程 详解

作用:

欧几里德扩展方程是用来求解二元一次线性方程的。ax+by=c

(a、b、c为已知数)

对于给定方程:

ax+by=c,令g=gcd(a,b)

因为a是g的倍数,b也是g的倍数,所以令a=m*g , b=n*g,则:

ax+by=g(m*x+n*y)=c

所得的结果c必然是g的倍数。

当且仅当mx+ny=1时,右边有最小值。而此时mn必定是互质的。

所以我们经常求的最小整数解就是求方程ax+by=gcd(a,b)的解。

解方程步骤:

对于方程

ax+by=gcd(a,b)

由欧几里德算法

gcd(a,b)=gcd(b,a%b)

分别用b和a%b去替换ab,则可以得到一对新的解:x’和y’

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

因为两式右边都相等,所以我们让两式左边相等

ax+by=bx’+(a%b)y’

假设我们的a/b=k余a%b,则a%b=a-kb,那么上式可变为

ax+by=bx’+ay’-kby’

我们让对应项系数相等

x=y’

y=x’+ky’

这里我们可以发现,后一次的结果是由前一次结果决定的

一直化简下去会发现,方程会变成一个特解:

即x=1,y=0的情况。

最后我们再反过来求得最后的xy即可。

代码实现:

//ax+by=gcd(a,b)=c
void exgcd(int a,int b,int &x,int &y)
{
    if(b==0)
    {
        x=1;
        y=0;
        return ;
    }
    exgcd(b,a%b,x,y);
    int t=x;
    x=y;
    y=t-y*(a/b);
}

因为x,y加了引用,所以最后xy的值会在递归后改变,就求得了最后的答案。

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-31 10:26:11

欧几里德扩展方程 详解的相关文章

jQuery.extend()、jQuery.fn.extend()扩展方法详解

jQuery自定义了jQuery.extend()和jQuery.fn.extend()方法.其中jQuery.extend()方法能够创建全局函数或者选择器,而jQuery.fn.extend()方法能够创建jQuery对象方法. 例如: jQuery.extend({ showName : function(name){ alert(name) } }); jQuery.showName("深蓝"); jQuery.extend()除了可以创建插件外,还可以用来扩展jQuery对象

开启PHP exif扩展方法详解

服务器配置说明: 1.在php.ini文件中找到;extension=php_exif.dll,去掉前面的分号2.在php.ini文件中找到;extension=php_mbstring.dll,去掉前面的分号,并将此行移动到extension=php_exif.dll之前,使之首先加载*. 3.找到[exif]段,把下面语句的分号去掉. ;exif.encode_unicode = ISO-8859-15;exif.decode_unicode_motorola = UCS-2BE;exif.

ASA nat转换详解与扩展ACL详解

AR1区 telnet AR2 经过ASA1 转换流量配置如下:ASA配置:ASA Version 8.4(2)!hostname ciscoasaenable password 8Ry2YjIyt7RRXU24 encryptedpasswd 2KFQnbNIdI.2KYOU encryptednames!interface GigabitEthernet0nameif insidesecurity-level 100ip address 192.168.10.254 255.255.255.

菜鸟学php扩展 之 自动生成的扩展框架详解(二)

前言 上一文:菜鸟学php扩展 之 hello world(一),不问所以然的,强行与php扩展say hello了.对于ext_skel自动生成的框架,将在本文进行详解,当作备忘录. 正文 ext_skel的用法 ./ext_skel --extname=module [--proto=file] [--stubs=file] [--xml[=file]] [--skel=dir] [--full-xml] [--no-help] --extname=module module is the

artDialog学习之旅(二)之扩展方法详解

名称 描述 核心方法 art.dialog.top 获取artDialog可用最高层window对象.这与直接使用window.top不同,它能排除artDialog对象不存在已经或者顶层页面为框架集的情况这是iframe应用工具集中的核心方法,你可以用它来操作父页面对象(包括上面的对话框) art.dialog.data(name, value) 跨框架数据共享写入接口.框架与框架之间以及与主页面之间进行数据交换是非常头疼的事情,常规情况下你必须知道框架的名称才能进行数据交换,如果是在复杂的多

C#中的扩展方法详解

“扩展方法使您能够向现有类型“添加”方法,而无需创建新的派生类型.重新编译或以其他方式修改原始类型.”这是msdn上说的,也就是你可以对String,Int,DataRow,DataTable等这些类型的基础上增加一个或多个方法,使用时不需要去修改或编译类型本身的代码. 扩展方法使你能够向现有类型“添加”方法,而无需创建新的派生类型.重新编译或以其他方式修改原始类型. 扩展方法是一种特殊的静态方法,但可以像扩展类型上的实例方法一样进行调用. 以上是msdn官网对扩展方法的描述,现在我通过一个情景

linux下egrep文件内容搜索工具及扩展正则表达式详解

egrep命令: 根据模式(文本字符和扩展正则表达式的元字符组合而成之匹配条件)搜索文本, 并将符合模式的文本行显示出来. 格式:egrep [选项] 匹配条件 文本名称 egrep 等于 grep -E 选项:  -i:  忽略大小写 -v: 显示没有被模式匹配到的行 -o:只显示被模式匹配到的字符串 --color: 搜索出来文件高亮度显示 -A: 匹配指定行的下几行 -B: 匹配指定行的上几行 -C: 匹配指定行的上下几行 正则表达式:Regular Expression, 简称REGEX

Linux系统中安装SSH2扩展步骤详解 linux技能学习

在Linux服务器环境中部署SSH2扩展以编译PHP文件中的SSH脚本命令,具体配置方法如下,如果是在正式环境中直接运行,建议做好备份. 1.安装支持的库文件 命令:yum install  php-devel php-pear libssh2 libssh2-devel 2.建立ssh2扩展 命令:pecl install -f ssh2 之后会显示安装的日志,需要选择时直接按回车键就好 3.安装成功后,需要修改ssh2.ini [[email protected] etc]# touch /

JavaScript学习总结(五)原型和原型链详解

转自:http://segmentfault.com/a/1190000000662547 私有变量和函数 在函数内部定义的变量和函数,如果不对外提供接口,外部是无法访问到的,也就是该函数的私有的变量和函数. <script type="text/javascript"> function Box(){ var color = "blue";//私有变量 var fn = function() //私有函数 { } } </script> 这