一、欧几里得算法

名字非常高大上的不一定难,比如欧几里得算法。。。其实就是求两个正整数a, b的最大公约数(即gcd),亦称辗转相除法

需要先知道一个定理:

gcd(a, b) = gcd(b, a mod b) (其中a mod b != 0)  或  b (其中a mod b == 0)

证明:

后半部分呢。。。是废话,于是只要证明前半部分即可。

不妨设g = gcd(a, b),于是有 a = g * A, b = g * B 且 (A, B) = 1

故gcd(b, a mod b) = gcd(g * B, (g * A) mod (g * B)) = g * gcd(B, A mod B)

若gcd(B, A mod B) != 1,我们可以得到:

存在g' > 1,使g' | B且g' | A mod B,故g' | A, 与(A, B) = 1矛盾!

故gcd(B, A mod B) = 1,也即gcd(b, a mod b) = g * 1 = g = gcd(a, b)

证毕。。。(貌似搞烦了?)

于是就可以做了。。。时间复杂度是O(log(max(a, b)))

十分简单地code:(只有一行额。。。)

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

应用的话。。。除了求gcd(a, b)以外。。。

貌似还可以求a,b的最小公倍数lcm(a, b) = a * b / gcd(a, b)(废话+1。。。)

但是许多地方都用得到gcd。。。还是挺重要的

二、扩展欧几里得算法

Now,我们已经会求了gcd(a, b)了。。。

而同时有一个叫裴蜀定理(搞得像吃的"焙薯"一样。。。饿了>.< 唔~):

若gcd(a, b) = 1,则存在x, y,使a * x + b * y = 1(证略)

改一改就变成了:

对任意的a和b,存在x, y,使a * x + b * y = gcd(a, b)

而x, y的计算是可以在上面求解gcd(a, b)中一起完成的。。。推一下就出来了。。(有便加深记忆)

此处不再赘述,请直接参考code:

 int extend_gcd(int a, int b, int &x, int & y){
if (!b){
x = , y = ;
return a;
}
int res = extend_gcd(b, a % b, x, y), tmp = x;
x = y;
y = tmp - a / b * y;
return res;
}

而求出的(x, y)有可能会大(小)的非常离谱,于是就需要进行调整。。。

不定方程的通解形式大家都会吧。。。

扩展欧几里德算法的应用主要有以下三方面:

(1)求不定方程

(2)求模线性方程(线性同余方程)

(3)求模的逆元

作为noip的复习嘛。。。(1)就是本来的用处,(2)(3)应该不会考的说(奇怪的flag)

noip知识点总结之--欧几里得算法和扩展欧几里得算法的更多相关文章

  1. 扩展欧几里得算法详解(exgcd)

    一.前言 本博客适合已经学会欧几里得算法的人食用~~~ 二.扩展欧几里得算法 为了更好的理解扩展欧几里得算法,首先你要知道一个叫做贝祖定理的玄学定理: 即如果a.b是整数,那么一定存在整数x.y使得$ ...

  2. 扩展欧几里得算法(extgcd)

    相信大家对欧几里得算法,即辗转相除法不陌生吧. 代码如下: int gcd(int a, int b){ return !b ? gcd(b, a % b) : a; } 而扩展欧几里得算法,顾名思义 ...

  3. 欧几里得算法与扩展欧几里得算法_C++

    先感谢参考文献:http://www.cnblogs.com/frog112111/archive/2012/08/19/2646012.html 注:以下讨论的数均为整数 一.欧几里得算法(重点是证 ...

  4. vijos1009:扩展欧几里得算法

    1009:数论 扩展欧几里得算法 其实自己对扩展欧几里得算法一直很不熟悉...应该是因为之前不太理解的缘故吧这次再次思考,回看了某位大神的推导以及某位大神的模板应该算是有所领悟了 首先根据题意:L1= ...

  5. ****ural 1141. RSA Attack(RSA加密,扩展欧几里得算法)

    1141. RSA Attack Time limit: 1.0 secondMemory limit: 64 MB The RSA problem is the following: given a ...

  6. 浅谈扩展欧几里得算法(exgcd)

    在讲解扩展欧几里得之前我们先回顾下辗转相除法: \(gcd(a,b)=gcd(b,a\%b)\)当a%b==0的时候b即为所求最大公约数 好了切入正题: 简单地来说exgcd函数求解的是\(ax+by ...

  7. (light oj 1306) Solutions to an Equation 扩展欧几里得算法

    题目链接:http://lightoj.com/volume_showproblem.php?problem=1306 You have to find the number of solutions ...

  8. 『扩展欧几里得算法 Extended Euclid』

    Euclid算法(gcd) 在学习扩展欧几里得算法之前,当然要复习一下欧几里得算法啦. 众所周知,欧几里得算法又称gcd算法,辗转相除法,可以在\(O(log_2b)\)时间内求解\((a,b)\)( ...

  9. 题解——洛谷P2613 【模板】有理数取余(扩展欧几里得算法+逆元)

    题面 题目描述 给出一个有理数 c=\frac{a}{b}  ​ ,求  c mod19260817  的值. 输入输出格式 输入格式: 一共两行. 第一行,一个整数 \( a \) .第二行,一个整 ...

随机推荐

  1. lotus 公式

    函数 描述@UserName 返回用户名或服务器名.@Name([key]; name) 更改用户名的格式.关键字包含 [CN] 以从一个专有名字中解析出公共名,[Abbreviate] 缩写规范格式 ...

  2. git学习笔记12-标签管理-版本

    发布一个版本时,我们通常先在版本库中打一个标签(tag),这样,就唯一确定了打标签时刻的版本.将来无论什么时候,取某个标签的版本,就是把那个打标签的时刻的历史版本取出来.所以,标签也是版本库的一个快照 ...

  3. ubuntu 安装JDK

    下载JDK6安装包,我的为32位系统所以选择jdk-6u35-linux-i586.bin 下载地址:http://www.oracle.com/technetwork/java/javase/dow ...

  4. Jsoup模拟登陆例子

    Jsoup模拟登陆小例子,不同的网站,需要不同的模拟策略,散仙在这里仅仅作为一个引导学习. package com.jsouplogin; import java.util.HashMap; impo ...

  5. poj1584A Round Peg in a Ground Hole

    链接 题意甚是难懂!这是第二遍做这道题了,依旧无法理解题意,搜了下题意... 首先需要判断是不是为凸多边形.(从一个顶点走一遍即可,要注意顺逆时针,题目中没有指明) 其次看一下圆是不是能够放入多边形内 ...

  6. odoo中pos模块由于删除partner导致发生(你试图访问的单据已经删除)错误的解决方法

    model.js文件中 push_order: function(order) { var self = this; if(order){ this.proxy.log('push_order',or ...

  7. HTML5Canvas标签

     

  8. Linux socket编程应用学习笔记

    参考这个系列吧 http://www.cnblogs.com/wunaozai/tag/%E7%BD%91%E7%BB%9C%E7%BC%96%E7%A8%8B/default.html?page=2 ...

  9. 【Todo】Nginx架构学习

    要进行Web服务,绕不开的就是Nginx.这已经是大型网站的标配.对Nginx进行一定程度的深入学习. http://www.ituring.com.cn/article/4436 http://bl ...

  10. android 自定义进度条颜色

    android 自定义进度条颜色 先看图 基于产品经理各种自定义需求,经过查阅了解,下面是自己对Android自定义进度条的学习过程!   这个没法了只能看源码了,还好下载了源码, sources\b ...