网上看了半天……还是没把欧几里得算法和扩展欧几里得算法给弄明白……

然后想了想自己写一篇文章好了……

参考文献:https://www.cnblogs.com/hadilo/p/5914302.html

    https://blog.csdn.net/sky_zdk/article/details/71023325

    《算法竞赛进阶指南》(李煜东)(我不是来推销的)

ps:本文讨论范围均在整数以内

一、欧几里得算法

    欧几里得算法,即辗转相除法,简称gcd,用于计算两个数的最大公约数。时间复杂度据说log n的

    公式 gcd(a,b)=gcd(b,a mod b) ,b≠0

    啥?证明?能用就行要什么证明

    咳咳,让我们来严格的证明一下

    证:

      若a<b,以上等式显然成立

      若a>=b, 设a=q*b+r,0<=r<b, 即r=a%b 。对于a,b的任意公约数d,因为d|a(ps:这个符号的意思是d是a的约数),d|b,所以d|q*b,可得d|(a-q*b),即d|r,d也是r的约数。反之亦成立。所以,a,b的公约数集合和b,a mod b的公约数集合相同,他们的最大公约数自然也相同。

    证毕

上代码(我知道你们只想要这个)

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

当然还有更装逼别致的写法

int gcd(int a,int b){
if(!b) return a;
while(b^=a^=b^=a%=b);//先做一次取模,然后交换两个元素
return a;
}

    ps:问题就是取模太慢了,有的题目可能用更相减损法还更快……所以更相减损大法好(口胡)<---别听这家伙瞎说,时间复杂度根本不一样

二、扩展欧几里得算法

    一个很厉害的东西,我看了半天没弄明白(队长好像一看就懂)

    引理:裴蜀定理,一定存在ax+by=gcd(a,b)的整数解

    乱证严格的证明:

      当b=0时,gcd(a,b)=a,显然存在一对整数解x=1,y=0

      若b!=0

      设ax1+by1=gcd(a,b)=gcd(b,a%b)=bx2+(a%b)y2

      又因 a%b=a-a/b*b

      则 ax1+by1=bx2+(a-a/b*b)y2

      ax1+by1=bx2+ay2-a/b*by2

      ax1+by1=ay2+bx2-b*a/b*y2

      ax1+by1=ay2+b(x2-a/b*y2)

      解得 x1=y2 , y1=x2-a/b*y2

      因为当 b=0 时存在 x , y 为最后一组解

      而每一组的解可根据后一组得到

      所以第一组的解 x , y 必然存在

    证毕

    然后递归计算就可以,当b=0时,返回x=1,y=0即可

上代码

int exgcd(int a,int b,int &x,int &y){
//注意x和y必须是引用
if(!b){x=,y=;return a;}
int d=exgcd(b,a%b,x,y);
int t=x;x=y,y=t-(a/b)*y;
return d;//d是a和b的gcd,顺便求出来
}

san三、扩欧解不定方程

      对于形如ax+by=c的方程

      先用exgcd求出ax+by=gcd(a,b)的一组解x0,x1

      根据裴蜀定理(上面那个),如果c%gcd(a,b)==0,此方程有解,否则无解

      若有解

      设d=gcd(a,b)

      令方程两边同乘上c/d

      则方程变为(a*c/d)x0+(b*c/d)y0=c

      于是我们就得到了一组解了,x1=x0*c/d,y1=y0*c/d

      然后就学不下去了orz……但问题是还没完QAQ

      题目里面,一般不可能让你只求出一组解,一般都是要你求出最小整数解

      保佑自己上面算出来的刚好是答案就好了,只要够欧就没问题

      认真点

      求最小整数解,就是把x1减小到不能减小为止,再看看上面的式子,c和d都是定值,于是我们只要考虑把x0减小到不能减小为止

      设x0减小x,方程左边总体减小x*c/d*a,为了保证等式成立,y0增加的值y应满足x*c/d*a=y*c/d*b

      于是x/y=(b/d) / ( a/d)

      我们令x0不断减x(x=b/d),直到0<=x1<x,此时的x1即为最小整数解

      我们可以令x1=x0%x,就可以算出x1了

      等等,真的大丈夫?

      如果x0是负数怎么办?我们让x1+x就可以得到正数了

      如果x是负数呢?令x=abs(x)即可

      关于以上两点,请自行考虑(才不是因为我也不会呢)

上代码啦

d=exgcd(a,b,x,y);
if(c%d==)
{
x*=c/d;
t=b/d;
t=abs(t);
x=(x%t+t)%t;
printf("%d\n",x);
}

四、解线性同余方程

    这个随便提一嘴吧,因为我也不太会

      对于ax≡c(mod p)

      将其转化为ax+py=c

      然后带进上面求解,一般都是要求出x的最小整数解的

emm……差不多了,就这样吧

以上

关于gcd和exgcd的一点心得,保证看不懂(滑稽)的更多相关文章

  1. 从BZOJ2242看数论基础算法:快速幂,gcd,exgcd,BSGS

    LINK 其实就是三个板子 1.快速幂 快速幂,通过把指数转化成二进制位来优化幂运算,基础知识 2.gcd和exgcd gcd就是所谓的辗转相除法,在这里用取模的形式体现出来 \(gcd(a,b)\) ...

  2. WebBrowser一点心得,如果在Javascript和Winform代码之间实现双向通信

    原文:WebBrowser一点心得,如果在Javascript和Winform代码之间实现双向通信 最近工作需要,学习了一下winform内嵌webbrowser控件,然后与htm页面中的javasc ...

  3. 使用Webbrowser的一点心得体会

    原文:使用Webbrowser的一点心得体会 自从用上VS2005后,发现多了个WebBrowser控件(.net 2003中不带),为图方便吧,有好多小工具就用这个写的,慢慢也有点体会了,总结一下, ...

  4. gcd以及exgcd入门讲解

    gcd就是最大公约数,gcd(x, y)一般用(x, y)表示.与此相对的是lcm,最小公倍数,lcm(x, y)一般用[x, y]表示. 人人都知道:lcm(x, y) = x * y / gcd( ...

  5. 谈谈选用技术的原则,技术学习方法技巧,阅读代码的技巧及其它 MSF的一点心得

    谈谈技术原则,技术学习方法,代码阅读及其它(正文) 这篇文章是前一阵在水木BBS上和别人讨论中偶自己发言的摘编,是偶这几年开发过程完全经验式的总结.完全个人经验,供批判. 一.选用技术的原则 比较规范 ...

  6. gcd与exgcd

    gcd 辗转相除法求gcd证明 \(gcd(a, b) == gcd(b, a\%b)\) 证明: 设: \(d\)为\(a\)与\(b\)的一个公约数, 则有\(d|b\) \(d|a\) 设: \ ...

  7. 【并行计算与CUDA开发】基于NVIDIA显卡的硬编解码的一点心得 (完结)

    原文:基于NVIDIA显卡的硬编解码的一点心得 (完结) 1.硬解码软编码方法:大体流程,先用ffmpeg来读取视频文件的包,接着开启两个线程,一个用于硬解码,一个用于软编码,然后将读取的包传给解码器 ...

  8. 数论入门2——gcd,lcm,exGCD,欧拉定理,乘法逆元,(ex)CRT,(ex)BSGS,(ex)Lucas,原根,Miller-Rabin,Pollard-Rho

    数论入门2 另一种类型的数论... GCD,LCM 定义\(gcd(a,b)\)为a和b的最大公约数,\(lcm(a,b)\)为a和b的最小公倍数,则有: 将a和b分解质因数为\(a=p1^{a1}p ...

  9. Algorithm: GCD、EXGCD、Inverse Element

    数论基础 数论是纯数学的一个研究分支,主要研究整数的性质.初等数论包括整除理论.同余理论.连分数理论.这一篇主要记录的是同余相关的基础知识. 取模 取模是一种运算,本质就是带余除法,运算结果就是余数. ...

随机推荐

  1. quicker+.em SourceInsight 宏加强版制作

    这两天苦于新建的文件每次都要手动添加文件头,新建的函数每次都要手动添加函数说明,连.h也要手动生成.于是乎,上网搜了搜,发现了lushengwen写的一个神器:quicker.em .好家伙,有了这个 ...

  2. Hello Vizhub

    VizHub.com 一.介绍 Vizhub是一个使用D3.js和svg进行数据可视化的教学练三位一体的平台. 并且可以把在线编辑的代码保存到网站中. 右上角可以使用github账号登录. 二.Get ...

  3. Redis 授权操作

    [Redis 授权操作] AUTH password 通过设置配置文件中 requirepass 项的值(使用命令 CONFIG SET requirepass password ),可以使用密码来保 ...

  4. Unity3D 游戏在 iOS 上因为 trampolines 闪退的原因与解决办法

    崩溃的情况 进入游戏一会儿,神马都不要做,双手离开手机,盯着屏幕看吧,游戏会定时从服务器那儿读取一些数据,时间一长,闪退了.尼玛问题是神马呢?完全没有头绪,不过大体猜测是因为网络请求导致的,那么好,先 ...

  5. EL表达式获取值栈数据

    ---------------------siwuxie095 EL 表达式获取值栈数据 1.导入 JSTL 相关包,下载链接: (1)http://tomcat.apache.org/taglibs ...

  6. 拒绝用户登录:/bin/false和/usr/sbin/nologin

    要拒绝系统用户登录,可以将其shell设置为/usr/sbin/nologin或者/bin/false 1 # usermod -s | --shell /usr/sbin/nologin usern ...

  7. 如何使用vsphere client 克隆虚拟机

    vSphere 是VMware公司推出一套服务器虚拟化解决方案. 工具/原料 vSphere 测试系统 方法/步骤 1.进入vSphere client,关闭需要克隆的虚拟机win7 2.选中ESXi ...

  8. Java JarFile 解析

    Java JarFile 解析 package com.github.binarylei; import java.io.*; import java.net.URL; import java.net ...

  9. Java 设计模式系列(二十)状态模式

    Java 设计模式系列(二十)状态模式 状态模式,又称状态对象模式(Pattern of Objects for States),状态模式是对象的行为模式.状态模式允许一个对象在其内部状态改变的时候改 ...

  10. zz如何让你的婚姻天长地久?

    如果天长地久意味着一列永不出轨的火车,下面有关婚姻生活的战略就像制定一张准确的运行时刻表.因为成功的婚姻并非源于机运,所谓的七年之痒也不是空穴来风.对那些已婚男人来说,他们需要计划——为了一年比一年过 ...