欧几里德算法及其扩展(推导&&模板)
有关欧几里德算法整理:
1.一些相关概念: <1>.整除性与约数: ①一个整数可以被另外一个整数整除即为d|a(表示d整除a,通俗的说是a可以被d整除),其含义也可以说成,存在某个整数k,使得a=kd.
②如果d|a且d>=0,则称d是a的约数。
③如果d|a,则-d|a,即a的任何约数的负数同样可以整除a.但一般规定,约数为非负数。非零整数a的约数应至少为1,且d<=|a|.
④因子:整数a的非平凡约数(除了1和它本身的约数)称为a的因子。 <2>.素数和合数. <3>.除法定理:
对于任何整数a和任何正整数n,存在唯一整数q和r,满足0<=r<n,且a=qn+r.
等模:
根据整数模n的余数,我们可以将所有的整数划分成n个等分类。包含整数a的模n等价类为:[a]n={a+kn}
<4>.公约数与最大公约数:
①概念:
公约数:如果d是a的约数并且d也是b的约数,则d是a与b的公约数;
两个不同时为0的整数a与b的公约数种最大的称为其最大公约数,记作gcd(a,b);
②基本性质:
公约数的重要性质:若d是a,b的公约数,则d|(a+b)且d|(a-b);且对任意整数x,y,有d|(ax+by);
gcd函数的基本性质略简单不提; 若任意整数a,b不都为0,则gcd(a,b)为a与b的线性组合集{ax+by:x,y属于Z}的最小正整数。
这里略带证明一下:
设s是a与b的线性组合集合中的最小正元素,并且对某个x,y属于Z,有s=ax+by,设q=a/s.
a mod s=a-qs;
由于0<=a mod s<s
=>a mod s=
=>s|a;
同理,s|b
=>s是a与b的公约数,满足gcd(a,b)>=s;
又gcd(a,b)|s,s>0
=>gcd(a,b)<=s;
结合以上,gcd(a,b)=s;
2.欧几里德算法: <1>.基本原理:gcd(a,b)=gcd(b,a mod b) <2>.代码:
欧几里德算法://递归
int gcd(int a,int b)
{
if (b==0) return a;
else return gcd(b,a mod b);
} 最小公倍数:
int gbs(int m,int n)
{
return m*n/gcd(m,n);
}
3.扩展欧几里德算法:
<1>.形式:d=gcd(a,b)=ax+by;
<2>.推导:
设 ax1+by1=gcd(a,b);
bx2+(a mod b)y2=gcd(b,a mod b);
根据欧几里德原理有 gcd(a,b)=gcd(b,a mod b);
则:ax1+by1=bx2+(a mod b)y2;
即:ax1+by1=bx2+(a-(a/b)*b)y2=ay2+bx2-(a/b)*by2;
根据:x1=y2; y1=x2-(a/b)*y2;
上面的思想是以递归定义的,因为 gcd 不断的递归求解一定会有个时候 b=0,所以递归可以结束。
代码如下
int exgcd(int a,int b,int &x,int &y)
{
if(b==0)
{
x=1;
y=0;
return a;
}
int r=exgcd(b,a%b,x,y);
int t=x;
x=y;
y=t-a/b*y;
return r;
}
如果您不太理解以上的程序,可以试着看看算法导论的伪代码:
这个代码是实现起来和上面是一样的,只是在这里可以帮助理解
EXTENDED-EUCLID(a,b)
if(b=0)
then return (a,1,0)
(d1,x1,y1) <- (d1,y1,x1-a/b*y )
return (d,x,y)
个人觉得,要真正理解这个算法,还是需要通过刷题来领会
欧几里德算法及其扩展(推导&&模板)的更多相关文章
- (扩展欧几里德算法)zzuoj 10402: C.机器人
10402: C.机器人 Description Dr. Kong 设计的机器人卡尔非常活泼,既能原地蹦,又能跳远.由于受软硬件设计所限,机器人卡尔只能定点跳远.若机器人站在(X,Y)位置,它可以原地 ...
- 欧几里德与扩展欧几里德算法 Extended Euclidean algorithm
欧几里德算法 欧几里德算法又称辗转相除法,用于计算两个整数a,b的最大公约数. 基本算法:设a=qb+r,其中a,b,q,r都是整数,则gcd(a,b)=gcd(b,r),即gcd(a,b)=gcd( ...
- poj2142-The Balance(扩展欧几里德算法)
一,题意: 有两个类型的砝码,质量分别为a,b;现在要求称出质量为d的物品, 要用多少a砝码(x)和多少b砝码(y),使得(x+y)最小.(注意:砝码位置有左右之分). 二,思路: 1,砝码有左右位置 ...
- poj2115-C Looooops(扩展欧几里德算法)
本题和poj1061青蛙问题同属一类,都运用到扩展欧几里德算法,可以参考poj1061,解题思路步骤基本都一样.一,题意: 对于for(i=A ; i!=B ;i+=C)循环语句,问在k位存储系统中循 ...
- poj1061-青蛙的约会(扩展欧几里德算法)
一,题意: 两个青蛙在赤道上跳跃,走环路.起始位置分别为x,y. 每次跳跃距离分别为m,n.赤道长度为L.两青蛙跳跃方向与次数相同的情况下, 问两青蛙是否有方法跳跃到同一点.输出最少跳跃次数.二,思路 ...
- HDU 1576 A/B 扩展欧几里德算法
A/B Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submis ...
- ACM_扩展欧几里德算法
<pre name="code" class="cpp">/* 扩展欧几里德算法 基本算法:对于不完全为 0 的非负整数 a,b,gcd(a,b)表 ...
- 扩展欧几里德算法(递归及非递归实现c++版)
今天终于弄懂了扩展欧几里德算法,有了自己的理解,觉得很神奇,就想着写一篇博客. 在介绍扩展欧几里德算法之前,我们先来回顾一下欧几里德算法. 欧几里德算法(辗转相除法): 辗转相除法求最大公约数,高中就 ...
- 欧几里德算法gcd及其拓展终极解释
这个困扰了自己好久,终于找到了解释,还有自己改动了一点点,耐心看完一定能加深理解 扩展欧几里德算法-求解不定方程,线性同余方程. 设过s步后两青蛙相遇,则必满足以下等式: (x+m*s)-(y+n ...
随机推荐
- CQRS模式实现
[.NET领域驱动设计实战系列]专题十:DDD扩展内容:全面剖析CQRS模式实现 一.引言 前面介绍的所有专题都是基于经典的领域驱动实现的,然而,领域驱动除了经典的实现外,还可以基于CQRS模式来进行 ...
- 《python源代码分析》笔记 pythonVM一般表达式
本文senlie原版的.转载请保留此地址:http://blog.csdn.net/zhengsenlie 1.字节码指令 LOAD_CONST:从consts表中读取序号为i的元素并压入到执行时栈中 ...
- hdu 1098 Ignatius's puzz
有关数论方面的题要仔细阅读,分析公式. Problem Description Ignatius is poor at math,he falls across a puzzle problem,so ...
- linux_环境变量设置 utf-8
echo $LANG 显示编码 : en_US.UTF-8 英文urf8有时显示程序输出是? 解决方法: vim ~/.bashrc 最后一行追加: export LANG=zh_CN.UTF- ...
- JDBC加载过程
jdbc载入的过程如图所看到的. 桥接模式请參照:设计模式:桥接模式 blog目的:与图说话 版权声明:本文博客原创文章,博客,未经同意,不得转载.
- c# 替换非法字符
保存文件的时候,文件名不允许非法字符. public string ReplaceSpecialCharacter(string str) { List<ch ...
- Swift编程语言学习12 ——实例方法(Instance Methods)和类型方法(Type Methods)
方法是与某些特定类型相关联的函数.类.结构体.枚举都能够定义实例方法:实例方法为给定类型的实例封装了详细的任务与功能.类.结构体.枚举也能够定义类型方法:类型方法与类型本身相关联.类型方法与 Obje ...
- centos安装zabbix集群监控(亲测无坑版)
一. 安装lemp环境 下载安装包:wget bbs.linuxtone.org/docs/autoinstall/lemp_auto_v1.0.6.tar.gz 包解压:tar zxvf lemp_ ...
- javascript6
eval("3+2")//5 eval():全局eval():严格eval() 函数和可执行的对象(callable object) delete一元操作符,善处对象属性或者数组元 ...
- PHP jpgraph的一点小提示(附安装方法)
PHP中的GD库本身是一套很强大的绘图库了,绘制的图像基本可以满足日常要求,但强大规强大,还是不够方便哈,因为强大方便的基于PHP的GD库的jpgraph也就诞生啦! PHP默认是不启用GD库的,因为 ...