数据结构与算法分析 - 最大公约数(gcd & extended_gcd)
以下内容均节选自《算法导论》第31章
最大公约数
定义:若:
\[\begin{array}{l}
a = p_1^{e_1}p_2^{e_2} \ldots p_r^{e_r}\\
b = p_1^{f_1}p_2^{f_1} \ldots p_r^{f_r}
\end{array}\]则:
\[\gcd( a,b) = p_1^{\min ( e_1,f_1)}p_2^{\min ( e_2,f_2)} \cdots p_r^{\min ( e_r,f_r )}\]
GCD递归定理:对任意非负整数a和任意正整数b,
\[\gcd (a,b) = \gcd ( b,a\bmod b )\]证明:
先证明充分性
\[\gcd ( a,b)|\gcd ( b,a\bmod bt)\]
如果设
\[d = \gcd( a,b)\]
则
\[d|a,d|b\]
由取模定义,可以推导出:
\[( a\,\bmod \,bt) = a - qb,q = \lfloor {a/b} \rfloor \]因为 ( a mod b) 是 a 与 b 的线性组合,所以由等式:
\[d|a\& d|b \Rightarrow d|( {ax + by} )\]可知
\[d|\gcd ( {a\,\bmod \,b} )\]因此,因为 d | b 并且 d | ( a mod b ) ,由最大公约数定义可得:d | gcd ( b , a mod b ) ,即:
\[\gcd ( a\,\bmod \,b )|\gcd ( b,a\,\bmod \,b )\]必要性证明过程与上述过程类似,故略去。
欧几里德算法
通过上述递归定理,我们可以求解最大公约数:
//c++语言表示欧几里德算法
int gcd(int a,int b){
if(b==0) return a;
else return gcd(b,a%b);
}下面来举例说明该算法的运行过程。考虑 gcd (30 , 21) 的计算过程:
\[\gcd ( {30,21} ) = \gcd ( {21,9} ) = \gcd ( 9,3) = \gcd ( {3,0} ) = 3\]在这个计算过程中,三次递归调用了欧几里德算法。
注:
默认假设 a>b>0。若b>a>0,则gcd(a,b)会立即调用gcd(b,a).
即如果第一个自变量小于第二个自变量,则gcd算法进行一次递归调用使两自变量兑换,然后继续往下执行。
类似的,如果b=a>0,则过程在进行一次调用后终止,因为 a mod b = 0
欧几里德算法的推广形式
我们推广该算法,使他能计算出满足下列条件的整系数x和y:
\[d = \gcd ( a,bt) = ax + by\]
定理二:
如果 a 和 b 是不都为 0 的任意整数,则gcd(a,b)是a和b的线性组合集合 { ax + by | x , y 为整数 } 中的最小正元素.
证明
设 s 是 a 与 b 的线性组合集中的最小正元素,并且存在x,y,使得 s = ax + by 成立。设
\[q = \left\lfloor {a/s} \right\rfloor \]则有 :
\[a\bmod s = a - qs = a - q( ax + by) = a( 1 - qx) + b( - qy )\]因此,a mod s 也是a与b的一种线性组合。但由于a mod s 取值范围 [ 0 ,s ) ,所以 a mod s=0,
因为s是满足这样线性组合的最小正整数,故 a mod s 不能取正数只能取 0.
因此有 s | a ,类似的可推得 s | b。
因此 s 是a与b的公约数,所以 gcd( a , b ) >= s .
又因为 gcd( a , b ) 能被 a 与 b 整除,并且 s = ax + by .
所以 gcd( a , b ) | s .
但由gcd( a , b ) | s 和 s >0 ,可知 gcd( a , b ) <= s .
故 gcd( a , b ) = s ,证毕。
扩展欧几里德算法:
int extended_gcd(int a,int b,int x,int y){
if(b==0){
x=1,y=0;
return a;
}
int r=extended_gcd(b,a%b,x,y); int tmp=x;
x=y;
y=tmp-a/b*y; return r;
}过程详解:
首先,我们需要通过下述公式获得 (d’,x’,y’)
\[d' = \gcd ( b,a\bmod b ) \Rightarrow d' = bx' + ( a\bmod b )y'\]由于:
\[d = \gcd ( a,b) = d' = \gcd ( b,a\bmod b)\]为了得到 d=ax+by 中的 x 和 y,我们改写上述等式为:
\[d = d' = bx' + (a - \left\lfloor {a/b} \right\rfloor )y' = ay' + b( x' - \left\lfloor {a/b} \right\rfloor y')\]因此,当选择:
\[\left\{ \begin{array}{l}
x = y'\\
y = x' - \left\lfloor {a/b} \right\rfloor y'
\end{array} \right.\]就可以满足等式 d = ax + by .这样就证明了extended_gcd算法的正确性。
数据结构与算法分析 - 最大公约数(gcd & extended_gcd)的更多相关文章
- 数据结构与算法分析——C语言描述 第三章的单链表
数据结构与算法分析--C语言描述 第三章的单链表 很基础的东西.走一遍流程.有人说学编程最简单最笨的方法就是把书上的代码敲一遍.这个我是头文件是照抄的..c源文件自己实现. list.h typede ...
- 1011 最大公约数GCD
1011 最大公约数GCD 基准时间限制:1 秒 空间限制:131072 KB 输入2个正整数A,B,求A与B的最大公约数. Input 2个数A,B,中间用空格隔开.(1<= A,B < ...
- 51Nod--1011最大公约数GCD
1011 最大公约数GCD 基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题 收藏 关注 输入2个正整数A,B,求A与B的最大公约数. Input 2个数A,B,中间用 ...
- <数据结构与算法分析>读书笔记--最大子序列和问题的求解
现在我们将要叙述四个算法来求解早先提出的最大子序列和问题. 第一个算法,它只是穷举式地尝试所有的可能.for循环中的循环变量反映了Java中数组从0开始而不是从1开始这样一个事实.还有,本算法并不计算 ...
- <数据结构与算法分析>读书笔记--运行时间计算
有几种方法估计一个程序的运行时间.前面的表是凭经验得到的(可以参考:<数据结构与算法分析>读书笔记--要分析的问题) 如果认为两个程序花费大致相同的时间,要确定哪个程序更快的最好方法很可能 ...
- <数据结构与算法分析>读书笔记--数学知识复习
数学知识复习是<数据结构与算法分析>的第一章引论的第二小节,之所以放在后面,是因为我对数学确实有些恐惧感.不过再怎么恐惧也是要面对的. 一.指数 基本公式: 二.对数 在计算机科学中除非有 ...
- [数据结构与算法分析(Mark Allen Weiss)]不相交集 @ Python
最简单的不相交集的实现,来自MAW的<数据结构与算法分析>. 代码: class DisjSet: def __init__(self, NumSets): self.S = [0 for ...
- [数据结构与算法分析(Mark Allen Weiss)]二叉树的插入与删除 @ Python
二叉树的插入与删除,来自Mark Allen Weiss的<数据结构与算法分析>. # Definition for a binary tree node class TreeNode: ...
- <数据结构与算法分析>读书笔记--函数对象
关于函数对象,百度百科对它是这样定义的: 重载函数调用操作符的类,其对象常称为函数对象(function object),即它们是行为类似函数的对象.又称仿函数. 听起来确实很难懂,通过搜索我找到一篇 ...
随机推荐
- bootstrap的popover插件在focus模式时在Safari浏览器无法使用的bug解决方案
前言 最近在使用bootstrap的popover插件,效果如下: popover插件的focus模式时表现为当点击按钮时弹出浮动层,在点击浮动层外的任何一处,都隐藏浮动层. 但是在mac下的Safa ...
- Nginx 负载均衡
Nginx简单实现网站的负载均衡 地址:http://www.cnblogs.com/alvin_xp/p/4161162.html
- SQL2008R2 不支持用该后端版本设计数据库关系图或表
向下不兼容. 要么安装SQL2012,要么把SQL2012数据库通过脚本转成2008
- PHP与MySQL
这周学习了PHP与MySQL的搭接下面来给大家分享一下: 1.账号注册,论坛发帖... 思路:通过form表单提交到PHP页面,PHP页面往MySQL中插入数据: 2.账号登陆 思路:form提交数据 ...
- Shell命令_文件系统常用命令df、du
一.df(文件系统查看命令) [root@localhost ~]# df [选项] [挂载点] 选项: -a 显示所有的文件系统信息,包括特殊文件系统,如 /proc. /sysfs -h 使用习惯 ...
- ActiveMQ_Topic队列(三)
一.本文章包含的内容 1.列举了ActiveMQ中通过Topic方式发送.消费队列的代码(监听者有两个,分别是topicMessageListener1.topicMessageListener2) ...
- 【BZOJ 4455】【UOJ #185】【ZJOI 2016】小星星
http://www.lydsy.com/JudgeOnline/problem.php?id=4455 http://uoj.ac/problem/185 有一个$O(n^n)$的暴力,放宽限制可以 ...
- mysql5.5的安装与配置(亲测版)
mysql5.5.x的编译安装 说明:5.5和5.1差不多,只是在编译时增加了一个cmake,其他基本一样,mysql5.5默认编码是utf-8,在使用mysql5.5配置lnmp或者lamp后安装d ...
- poj1144 求不同割点的个数
Network Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 11914 Accepted: 5519 Descript ...
- Linux下磁盘分区挂载
一般你去买vps都会看到介绍说硬盘多少G 比如 80G 但是你进入系统df -h的时候发现怎么只有10G呢, 其实这10G是用来装系统的和一些常用服务软件的 不是给你放网站数据的 那50G硬盘在哪 ...