欧几里得& 拓展欧几里得(Euclid & Extend-Euclid)

欧几里得算法(Euclid)

背景:

欧几里德算法又称辗转相除法。用于计算两个正整数a。b的最大公约数。

——百度百科

代码:

递推的代码是相当的简洁:

int gcd(int a,int b) { return b == 0 ? a : gcd(b, a % b); }

分析:

方法说了是辗转相除法,自然没有什么好介绍的了。

Fresh肯定会认为这样递归下去会不会爆栈?实际上在这里是不会爆栈的,由于递归的层数是很小的,不信你能够随便拿一些大数測试一下,lrj的白书和紫书上讲到gcd函数的递归层数不超过40785lgN + 1.6723,当中N=max{a,b}。让gcd函数递归层数最多的是gcd(F(n),F(n-1))。F(n)是Fibonacci数!!至于为什么博主没有证明。有想法的小伙伴麻烦在评论在说下下。(*^__^*) 嘻嘻……

拓展欧几里得(Extend- Euclid)

背景:

扩展欧几里德算法是用来在已知a, b求解一组x,y [x,y都是整数],使它们满足贝祖等式: ax+by = gcd(a, b) =d(解一定存在。依据数论中的相关定理)。

扩展欧几里德经常使用在求解模线性方程及方程组中。                                                                                                                  
                                                                                                   ——百度百科

用到的几个欧几里得重要结论:

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

2)            gcd(a,0) =  a.

代码:

typedef __int64 ll;
void exgcd(ll a, ll b, ll& d, ll& x, ll &y)
{
if(!b)
{
d = a, x = 1, y = 0;
}
else
{
exgcd(b, a % b, d, y, x);
y -= x * (a / b);
}
}

分析:

设例如以下两个方程:

ax+by  =  gcd(a,b)  =  d。

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

那么由重要结论(1)有gcd(a,b)  =  gcd(b,a %b),

那么ax+by  =  bx’+(a%b)y’  =  bx’ +(a – [a/b]*b)y’  =  ay’ + b(x’ – [a/b]y’),

由恒等关系有: x = y’ , y = (x’ – [a/b]y’),[a/b]表示a/b的值向下取整。

........

那么如今就能够用exgcd(a,b,d,x,y)表示方程ax+by = d,那么由上面一直递归下去,直到 b = 0。递归结束。此时  d = gcd(a,0) =a , x = 1,y =0;【由于 ax+0*y = gcd(a,0)嘛~】

拓展欧几里得的几个应用

求解不定方程

比如:求解不定整数方程ax+by = c

求ax+by = c。 令d =gcd(a,b);

那么(a / d ) * x + (b / d )* y = c / d

由于(a / d )、(b / d ) 、x、y都是整数,那么保证原不定整数方程ax+by = c有解的充要条件就是c / d为整数,即c是gcd(a,b)的倍数。

假设有解。那么令 K = c/d;

那么。对方程aX+bY = d;如果有拓展欧几里得求出一组解为(X0,Y0)。那么aX0+bY0 = d;等式两边同一时候乘以K,即K*( aX0+bY0 ) = d*K = c。由恒等关系。原方程的解(x0。y0):

X0 = KX0 = c/d * X0,y0 = KY0 = c/d *Y0。

不定方程的通解:

若(x0,y0)是不定整数方程ax+by = c的一组解,则他的随意整数解都能够表示成(x0+ kb’, y0-ka’),当中a’ = a/gcd(a,b), b’ = b/gcd(a,b).

例题:

POJ  1061青蛙的约会  链接:    http://poj.org/problem?id=1061

求解模线性方程

方法跟上面类似。将同余方程转化为常规线性方程就能够了,跟上面一样,谈到同余方程的一个解时,事实上指的是一个同余等价类....

详细内容待补充...

求模的逆元

待补充…

欧几里得 & 拓展欧几里得算法 解说 (Euclid & Extend- Euclid Algorithm)的更多相关文章

  1. ACM数论-欧几里得与拓展欧几里得算法

    欧几里德算法又称辗转相除法,用于计算两个整数a,b的最大公约数. 基本算法:设a=qb+r,其中a,b,q,r都是整数,则gcd(a,b)=gcd(b,r),即gcd(a,b)=gcd(b,a%b). ...

  2. ACM数论-欧几里得与拓展欧几里得

    ACM数论——欧几里得与拓展欧几里得 欧几里得算法: 欧几里德算法又称辗转相除法,用于计算两个整数a,b的最大公约数. 基本算法:设a=qb+r,其中a,b,q,r都是整数,则gcd(a,b)=gcd ...

  3. POJ 1601 拓展欧几里得算法

    学习链接:http://www.cnblogs.com/frog112111/archive/2012/08/19/2646012.html 先来学习一下什么是欧几里得算法: 欧几里得原理是:两个整数 ...

  4. POJ 1061 青蛙的约会(拓展欧几里得算法求解模线性方程组详解)

    题目链接: BZOJ: https://www.lydsy.com/JudgeOnline/problem.php?id=1477 POJ: https://cn.vjudge.net/problem ...

  5. <数论相关>欧几里得与拓展欧几里得证明及应用

    欧几里得算法 欧几里得算法的复杂度为O(log(n)),是一个非常高效的求最大公约数算法. 在这里不证明欧几里得算法的复杂度,有兴趣的可以访问以下链接:http://blog.sina.com.cn/ ...

  6. 数论入门——斐蜀定理与拓展欧几里得算法

    斐蜀定理 内容 斐蜀定理又叫贝祖定理,它的内容是这样的: 若$a,bin N$,那么对于任意x,y,方程$ax+by=gcd(a,b)*k(kin N)$一定有解,且一定有一组解使$ax+by=gcd ...

  7. gcd模板(欧几里得与扩展欧几里得、拓展欧几里得求逆元)

    gcd(欧几里得算法辗转相除法): gcd ( a , b )= d : 即 d = gcd ( a , b ) = gcd ( b , a mod b ):以此式进行递归即可. 之前一直愚蠢地以为辗 ...

  8. GCD欧几里得的拓展算法

    欧几里得算法的拓展主要是用于求解   : 已知整数 a, b,然后我们进行  ax + by == gcd(a , b) 的问题求解 那么如何进行求解呢?和欧几里得算法一样, 我们需要进行递归的方式进 ...

  9. 欧几里得算法(gcd) 裴蜀定理 拓展欧几里得算法(exgcd)

    欧几里得算法 又称辗转相除法 迭代求两数 gcd 的做法 由 (a,b) = (a,ka+b) 的性质:gcd(a,b) = gcd(b,a mod b) int gcd(int a,int b){ ...

随机推荐

  1. shell script练习:利用日期进行文件的创建

    随日期变化:利用 date 进行文件的创建 想像一个状况,假设我的服务器内有数据库,数据库每天的数据都不太一样,因此当我备份时, 希望将每天的数据都备份成不同的档名,这样才能够让旧的数据也能够保存下来 ...

  2. 【转】linux下vi命令大全

    转自:http://www.cnblogs.com/88999660/articles/1581524.html 进入vi的命令 vi filename :打开或新建文件,并将光标置于第一行首 vi ...

  3. C# 文件操作【转】

    本文也收集了目前最为常用的C#经典操作文件的方法,具体内容如下:C#追加.拷贝.删除.移动文件.创建目录.递归删除文件夹及文件.指定文件夹下面的所有内容copy到目标文件夹下面.指定文件夹下面的所有内 ...

  4. 启用禁用USB接口

    一个小工具,功能有启用禁用外网.USB接口,可由服务端socket长链接进行操控客户端从而达到实现前边的这些功能,这里贴上核心代码,先给上启用禁用USB接口吧,这个方法可随时启用禁用,之前用过一个改u ...

  5. Laravel 5.4.36 session 发现

    由于Laravel session机制完全脱离了PHP自带的session机制  因此对于php.ini 配置session对Laravel  是不会产生影响 代码路径:   vendor/larav ...

  6. C#语言最基础的数组和集合

    数组的书写格式:数据类型[]变量名=new 数据类型[长度]: 集合的书写格式:List<变量类型>变量名=new List<变量类型>(): 集合添加元素:变量名.Add(数 ...

  7. 服务器端 CentOS 下配置 JDK 和 Tonmcat 踩坑合集

    一.配置 JDK 时,在 /etc/profile 文件下配置环境变量,添加   #java environment export JAVA_HOME=/usr/java/jdk- export CL ...

  8. python 分割文件、组合文件

    import glob big_file = open('index.sql', 'rb') bak_file = 'index_bak' i = 1 while True: chunk = big_ ...

  9. 学习java编程能往哪些方向发展

    当下Java训练非常热,是因为通过学习java能够快速的就业,这对于今年就业压力非常大的大学生来说,无疑是一条就业的捷路,虽然培教育费动辄过万,但还是非常值得的. 可是你可曾想过,学习了java编程后 ...

  10. 北京Python开发培训怎么选?

    北京的地理优势和经济优势基本无需多言,作为全国机会最多的地方,吸引了无数的北漂前赴后继.作为中国互联网中心之一,北京有海量Python岗位正在等待大家淘金. 近几年中,Python一直是市场上最受欢迎 ...