网站大量收购闲置独家精品文档,联系QQ:2885784924

东华大学算法分析与设计课件第7章 概率算法.ppt

东华大学算法分析与设计课件第7章 概率算法.ppt

  1. 1、本文档共45页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
理解产生伪随机数的算法 掌握数值概率算法的设计思想 掌握舍伍德算法的设计思想 掌握拉斯维加斯算法的设计思想 掌握蒙特卡罗算法的设计思想 概率算法的特点 概率算法的分类 随机数 随机数 数值概率算法 线性化方法 求函数极小值方法 舍伍德算法 bool Prime(unsigned int n) {// 素数测试的蒙特卡罗算法 RandomNumber rnd; unsigned int a, result; bool composite=false; a=rnd.Random(n-3)+2; power(a,n-1,n,result,composite); if (composite||(result!=1)) return false; else return true; } 拉斯维加斯( Las Vegas )算法 拉斯维加斯算法的一个显著特征是它所作的随机性决策有可能导致算法找不到所需的解。 void obstinate(Object x, Object y) {// 反复调用拉斯维加斯算法LV(x,y),直到找到问题的一个解y bool success= false; while (!success) success=lv(x,y); } 拉斯维加斯( Las Vegas )算法 设p(x)是对输入x调用拉斯维加斯算法获得问题的一个解的概率。一个正确的拉斯维加斯算法应该对所有输入x均有p(x)0。设t(x)是算法obstinate找到具体实例x的一个解所需的平均时间 ,s(x)和e(x)分别是算法对于具体实例x求解成功或求解失败所需的平均时间,则有: 。 解此方程可得: n后问题 对于n后问题的任何一个解而言,每一个皇后在棋盘上的位置无任何规律,不具有系统性,而更象是随机放置的。由此容易想到拉斯维加斯算法。 如果将上述随机放置策略与回溯法相结合,可能会获得更好的效果。 n后问题 可以先在棋盘的若干行中随机地放置皇后,然后在后继行中用回溯法继续放置,直至找到一个解或宣告失败。随机放置的皇后越多,后继回溯搜索所需的时间就越少,但失败的概率也就越大。 222.11 10.20 13.00 0.0465 12 80.39 47.23 33.88 0.5039 5 262.00 -- 262.00 1.0000 0 t e s p stopVegas 给定一个合数n,求n的一个非平凡因子的问题称为整数n的因子分割问题。 整数因子分解 设n1是一个整数。关于整数n的因子分解问题是找出n的如下形式的唯一分解式: 。 其中,p1p2…pk是k个素数,m1,m2,…,mk是k个正整数。如果n是一个合数,则n必有一个非平凡因子x,1xn,使得x可以整除n。 整数因子分解 int Split(int n) { int m = floor(sqrt(double(n))); for (int i=2; i=m; i++) if (n%i==0) return i; return 1; } 事实上,算法split(n)是对范围在1~x的所有整数进行了试除而得到范围在1~x2的任一整数的因子分割。 Pollard算法 在开始时选取0~n-1范围内的随机数,然后递归地由 产生无穷序列 对于i=2k,以及2kj?2k+1,算法计算出xj-xi与n的最大公因子d=gcd(xj-xi,n)。如果d是n的非平凡因子,则实现对n的一次分割,算法输出n的因子d。 Pollard算法 void Pollard(int n) {// 求整数n因子分割的拉斯维加斯算法 RandomNumber rnd; int i=1; int x=rnd.Random(n); // 随机整数 int y=x; int k=2; while (true) { i++; x=(x*x-1)%n; // int d=gcd(y-x,n); // 求n的非平凡因子 if ((d1) (dn)) coutdendl; if (i==k) { y=x; k*=2;} } } 对Pollard算法更深入的分析可知,执行算法的while循环约 次后,Pollard算法会输出n的一个因子p。由于n的最小素因子p? ,故Pollar

您可能关注的文档

文档评论(0)

ormition + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档