收藏 分享(赏)

第8章 数论算法及计算几何算法.ppt

上传人:tkhy51908 文档编号:6909734 上传时间:2019-04-26 格式:PPT 页数:32 大小:416KB
下载 相关 举报
第8章 数论算法及计算几何算法.ppt_第1页
第1页 / 共32页
第8章 数论算法及计算几何算法.ppt_第2页
第2页 / 共32页
第8章 数论算法及计算几何算法.ppt_第3页
第3页 / 共32页
第8章 数论算法及计算几何算法.ppt_第4页
第4页 / 共32页
第8章 数论算法及计算几何算法.ppt_第5页
第5页 / 共32页
点击查看更多>>
资源描述

1、第八章 数论算法及计算几何算法,教学目标,理解求最大公约数的算法 掌握欧几里德公式的推广 掌握求解同余方程的算法 掌握运用中国剩余定理解决实际问题 理解线段相交的概念 掌握线段是否相交的判定算法 理解凸包的概念及穷举搜索的解决方法 掌握凸包问题及最接近点对问题的分治法,8.1最大公约数,定义1 设a,b是整数,b0,如果存在整数c,使得a=bc成立则称a被b整除,a是b的倍数,b是a的约数(因数或除数),可记为b|a;如果不存在整数c使得abc成立,则称a不被b整除,记为ba。 定理1(带余数除法) 设a与b是两个整数,b0,则存在唯一的两个整数q和r,使得a=bq+r,0r|b|。(证明略)

2、 定义2 在定理1的表达式a=bq+r中,称q是a被b除的商,r是a被b除的余数。 最大公约数是指两个或两个以上整数的公共约数中最大者。,8.1.1欧几里德算法,欧几里德定理 任意给定两个整数a,b,不妨假设ab。它们的最大公约数用gcd(a,b)表示,则gcd(a,b)=gcd(b,a mod b) ,其中a mod b表示a被b除所得的余数 欧几里德递归定义式,应用举例(求100和210最大公约数) 欧几里德递归公式的推广 来解决“已知a, b求解一组x,y使得ax+by=gcd(a, b) ”问题 令gcd(a, b)=d,则ax+by=d;gcd(b,a mod b)=d (8-1)

3、(1)当b=0时,则gcd(a,b)=a;ax+by=a,即ax=a,则x=1,y取任意实数。简单起见,算法取y=0; (2)当b0时,令a=b,b=a mod b,则gcd(a, b)=d,ax+by=d。 由于b =a mod b = ,则ax+by=bx+( )y=ay +b(x -y)=d (8-2) 让式(8-1)和式(8-2)对应项相等,则x=y,y= x -y。,8.1.2 Stein算法,基于的两条结论 (1)gcd(a,0)=a。 (2)gcd(ka,kb)=k gcd(a,b) 算法步骤 步骤1:初始时,令c=1; 步骤2:如果a=0,c=b*c;如果b=0,c=a*c;算

4、法结束。 步骤3:令a1=a,b1=b; 步骤4:a和b奇偶性的判断。,如果a和b都是偶数,则a=a/2,b=b/2,c=2*c; 如果a是偶数,b不是偶数,则a=a/2; 如果b是偶数,a不是偶数,则b=b/2; 如果a和b都不是偶数,则a =|a1 b1|,b=min(a1,b1); 转步骤2。 应用举例 求15和9的最大公约数,8.2同余方程,同余式 设a、b和m为整数,其中m0。若a和b被m除得的余数相同,则称a和b对模m同余。记为 或 同余式的简单性质 (1)若a b(m),则m|(b-a)。反过来,若m|(b-a),则a b(m); (2)如果a=km+b(k为整数),则a b(m

5、); (3)每个整数恰与0,1,,m-1这m个整数中的某一个对模m同余; (4)同余关系是一种等价关系: 反身性 a a(m); 对称性a b(m),则b a(m),反之亦然; 传递性a b(m),b c(m),则a c(m)。 (5)如果a b(m),x y(m),则 a x (b y)(m); 特别地 。,例1:使2n+1能被3整除的一切自然数n 例2:求2999最后两位数码 同余方程 设 是整系数多项式,m是正整数,称f(x) 0(mod m) (8-4)是关于未知数x的模m的同余方程,简称为模m的同余方程。若 则称式(8-4)为n次同余方程 同余方程的解 设x0是整数,当xx0时式(8

6、-4)成立,则称x0是同余方程(8-4)的解。凡对于模m同余的解,被视为同一个解,一次同余方程 设a,b为整数,且,则称同余方程ax b(mod m) (8-5)为一次同余方程。 定义7 设a1,a2,an是非零整数,b是整数,称关于未知数x1,x2,xn的方程 a1x1+a2x2+anxn=b是n元一次不定方程。 定理3 一次同余方程有解的充要条件是gcd(a,m)|b。若有解,则恰有d=gcd(a,m)个解。 证明(见板书) 一次同余方程的求解步骤,步骤1:求gcm(a,m); 步骤2:令d= gcm(a,m),如果d b,则式(8-5)无解,算法结束;如果 ,则转步骤3; 步骤3:根据欧

7、几里德公式的推广,求出式(8-5)的一个解x0。 步骤3-1:根据欧几里德公式的推广算法求得满足ax +my=d的x,y;具体方法: 将ax+my=d变形可得到: ax=d-my (8-8) 式(8-8)两边同时模m得:(8-9) 可见,x是一次同余方程(8-9)的解。 步骤3-2:根据x求x0。具体方法: 由于 ,设 ,则根据同余式的性质得: 即: 。因此,x0=px= x(mod m)。 步骤4:根据(8-7)式可得(8-5)式的其它d-1个解为 ,i=1,2,d-1。算法结束。,量水 有三个分别装有a升水,b升水和c升水的量筒(gcd(a,b)=1,cba0)。现c筒装满水,问能否在c简

8、中量出d升水(cd0)。若能,请列出一种方案。 算法分析: 量水过程实际上就是倒来倒去,每次倒的时候总有如下几个特点: 总有一个筒中的水没有变动; 不是一个筒被倒满就是另一个筒被倒光; c筒仅起中转作用。而本身容积除了必须足够装下a筒和b筒的全部水外,别无其它限制。 通过上述分析知:问题实质上是将a筒倒满x次,b筒倒满y次,使得总结果有ax十byd (8-10) 设a3,b7,c10,求x,y,8.3同余方程组,若数r同时满足n个同余方程: ,则r称为这n个同余方程组成的同余方程组的解,定理 对同余方程组记 , 其中, 表示m1和m2的最小公倍数。 若d(a1-a2),则此同余方程组无解; 若

9、d|( a1-a2),则此同余方程组有对模M的一类剩余解。 中国剩余定理(即孙子定理) 设 是两两互质的正整数,记M= ,则同余方程组,有对模M的唯一解 其中 证明(见板书) 例:早在几千年前中国的一本孙子算经就已经提及这个问题的解法了,原文为:“今有物,不知其数,三三数之,剩二;五五数之,剩三;七七数之,剩二,问物几何?” 答曰:“二十三”。,8.4线段相交,线段性质 有向线段 P1为始点,P2为终点,长度如果P1(0,0),则 记为 无向线段为P1P2 叉积的概念 叉积是一种向量乘法 ,向量 叉乘向量 得到另一个向量 ,则 = = 方向为右手直角坐标系,几何意义 以 和 为边的平行四边形的

10、面积 叉积定义为一个矩阵行列式 思考1:叉积何时小于0?何时大于0?又何时等于0? 思考2:对公共点P0而言,如何知道有向线段 在有向线段 的什么方向?通过叉积可以知道,确定两条线段是否相交 第一步:通过快速排斥实验来确定两条线段是否不相交; 第二步:在快速排斥实验判断有可能相交的前提下进行跨立实验,来确定两条线段是否相互跨立 确定任意一对线段相交 对应给定的一个线段集合,确定其中任意两条线段是否相交。该算法输入由若干条线段组成的集合,若这组线段中存在任意一对线段相交,则返回true;否则,返回false 两点假设 (1)线段集合中的所有线段都不是竖直的; (2)未有三条输入线段相交于同一点的

11、情形。,算法思想 假设一条垂直扫描线沿X轴方向从左到右顺序移动、穿过已知的若干线段。移动过程中,每遇到一个线段端点,它就将穿过扫描线的所有线段放入一个动态数据结构中,并利用它们之间的关系进行排序,核查是否有相交点存在。 该算法要求安排两个集合,一个是T序列,另一个是扫描线的一系列位置,即线段端点位置,并且要标记端点为线段的左端点还是线段的右端点。遇到左端点时将线段插入序列T中,并考察与其相邻的线段是否相交;遇到右端点时将线段从序列T中删除,此时考察被删除线段的左右两条线段是否相交。,8.5凸包问题,给定一个点集SP0,P1,Pn-1,它的凸包是一个最小的凸多边形P,且满足S中的每个点或者在P的

12、边界上或者在P的内部 如果点集S是两个点的集合,显然它的凸包是连接这两个点的线段; 如果S是由三个不共线的点组成的集合,那么凸包是以这三个点为顶点的三角形; 如果三点共线,则凸包是以距离最远的两个点为端点的线段。 对于更大的集合,在直观上,可以把S中的每个点看作订在地上的木桩,那么凸包就是将所有木桩围起来的一个拉紧的橡皮绳的形状,如图8-1所示。,8.5.1凸包问题的穷举搜索法,算法思想 根据凸多边形的定义,对于一个由n个点组成的集合S中的任意两个点Pi和Pj,当且仅当该集合中的其它点要么位于穿过Pi和Pj直线的同侧,要么位于线段PiPj上。则线段PiPj是该集合凸多边形边界的一部分。对每一个

13、点都做一遍检验之后,满足条件的线段就构成了该凸包的边界 算法求解步骤 对于集合中的任意两点Pi和Pj ,定义穿过它们直线方程 。 将点集S中的其余点代入直线方程,然后检查是否位于线段同侧,如果不是,说明线段PiPj不是点集S的凸多边形的边界。否则,PiPj是凸多边形的边界。 对点集中的每个点,重复上述步骤,直到找出全部多边形的边界,算法分析 点集中的点构成的线段数目最多为n(n-1)/2,对每一条线段,最坏情况要检查点集中其余n-2个点属于哪个半平面,故算法的时间复杂性为O(n3),8.5.2凸包问题的分治法,算法思想 将点集S中的点按照x坐标升序排序,x坐标相同的按照y坐标升序排序,排好序的

14、序列存放在点结构数组P中。那么最左边的点P0、最右边的点Pn-1肯定是凸包上的点。线段P0Pn-1将集合S中的点分成两个集合S1和S2。,子集S1的凸包由线段P0Pn-1作为下边界、多节链条作为上边界组成。这条上边界称为上包。 子集S2的凸包由线段P0Pn-1作为上边界、多节链条作为下边界组成。 这条下边界称为下包。整个集合的凸包由上包和下包构成。如图8-2所示。,算法求解步骤 构造上包 找到子集S1中的点Pmax,它是距离线段P0Pn-1最远的点 连接 ,找出S1中位于直线 左边的点,这些点构成集合S11;找出S1中位于直线 左边的点,这些点构成集合S12;P0PmaxPn-1内部的点不予考

15、虑 递归构造S11和S12的上包,然后简单地将它们连接起来,得到S1的上包 构造下包 找到子集S2中的点Pmin,它是距离线段P0Pn-1最远的点 连接 ,找出S2中位于直线 右边的点,这些点构成集合S21;找出S2中位于直线 右边的点,这些点构成集合S22;P0PminPn-1内部的点不予考虑 递归构造S21和S22的上包,然后简单地将它们连接起来,得到S2的上包,8.6最接近点对问题,最接近点对问题要求给定平面上n个点组成的集合S,找出其中n个点组成的点对中距离最近的一对点 。,8.6.1最接近点对问题的穷举搜索法,算法思想 分别计算点集中每一对点的距离,从中找出值最小的那对点。为了避免点

16、对的重复计算,算法只考虑ij的情况,8.6.2最接近点对问题的分治法,算法分析 从算法描述可知循环体内的时间是常数时间,循环次数 , 因此算法的时间复杂性为O(n2),算法思想 将所给平面上的n个点的集合S分成规模大致相等的两个子集S1和S2。递归求解S1和S2中的最接近点对;集合S中的最接近点对或者是子问题S1的解,或者是子问题S2的解,或者是一个点在S1中,一个点在S2中的情况组成的最接近点对。,一维情形 用xm将x1,x2,xn分成两部分S1和S2 递归求S1中最接近点对,其距离为d1 递归求S2中最接近点对,其距离为d2 求S1中的最大值p,S2中的最小值q 比较|p-q|,d1,d2

17、确定哪个是最接近点对。 算法分析解此递归方程可得T(n)=O(nlogn)。,二维情形 选取一垂直线l:x=xm作为分割线。其中xm为S中各点x坐标的中位数。由此将S分割为S1和S2 递归求S1中最接近点对,其距离为d1 递归求S2中最接近点对,其距离为d2 令d=min(d1,d2) 找出S1中的某个点p和S2中的某个点q组成的点对(p,q) (难点) 比较|p-q|,d1,d2确定哪个是最接近点对 思考:如何找出点对(p,q) ? 如果|p-q|小于d,则p点分布在P1带形区域内(左虚线和分割线l所夹的区域),q点分布在P2带形区域内(右虚线和分割线l所夹的区域)。如图8-5所示,对于P1

18、中任意一点p,与它距离小于d的点分布在以p点为圆心,以d为半径的圆内。因此,与点p构成最接近点对的P2中的点一定落在一个d2d的矩形R中。如图8-6所示。,由d的意义可知,矩形R中任何两个S中的点的距离都大于等于d。由此可知,至少可以将d2d的矩形R分割成如图8-7所示的六部分,其中任何一部分包含P2中的点最多有一个 因此,在矩形R中最多只有6个P2中的点与p构成最接近点对,思考:针对P1中的任意一点p,检查P2中的哪6个点,从而可以找出最接近点对呢 ?可以将p和P2中所有点到垂直线l上。由于能与p点一起构成最接近点对候选者的P2中的点一定在矩形R中,所以它们在直线l上的投影点与p在l上的投影点的距离小于d 算法分析(nlogn),

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 网络科技 > 数据结构与算法

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报