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

48随机化算法教案.ppt

  1. 1、本文档共11页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
【随机化算法】 拉斯维加斯随机化算法求解整数 因子分解中的因子分割问题 专业:计算机技术 姓名:丁元 学号:104754150816 拉斯维加斯算法 拉斯维加斯算法的一个显著特征是它所做的随机性决策有可能导致算法找不到所需的解。因此通常用一个bool型函数表示拉斯维加斯算法。当算法找到一个解时返回true,否则返回false。拉斯维加斯算法的典型调用形式为bool success=LV (x , y) ; 其中x是输入参数;当success的值为true时,y返回问题的解。当success值为false时,算法未能找到问题的解。此时可对同一实例再次独立地调用相同的算法。 问题描述 设n1是一个整数。关于整数n的因子分解问题是找出n的如下形式的唯一分解式: 给定一个合数n,求n的一个非平凡因子的问题称为整数n的因子分割问题。 其中,p1p2…pk是k个素数,m1,m2,…,mk是k个正整数。 如果n是一个合数,则n必有一个非平凡因子x,1xn,使得x可以整除n。 求解思路 整数因子分解最直观的方法当数“试除法”,数论中的Mertens定理告诉我们76%的奇数都有小于100的素因子,因此对于大多数整数,“试除法”已经足够,但是对于特殊的数,特别是素因子普遍较大的时候,“试除法的效率便明显不足。和素数检验类似,目前几乎所有实用的分解方法都是概率性的算法, 目标是找到能计算x 的算法, 使得(x,N) 1 的概率较大(而最大公因子可以很快地计算) 。 试除法因子分割如下: 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~x^2的任一整数的因子分割。 Pollard p - 1 方法由Pollard 于1974 年提出,用来找到给定合数n的一个因子d。Pollard算法用于Split(n)相同工作量就可以得到在1~x^4范围内整数的因子分割。具体过程如下:在开始时选取0~n-1范围内的随机数,然后递归地由 产生无穷序列 对于i=2^k,以及2^kj=2^(k+1),算法计算出xj-xi与n的最大公因子d=gcd(xj-xi,n)。如果d是n的非平凡因子,则实现对n的一次分割,算法输出n的因子d。 算法具体实现如下: 1、RandomNumber.h #includetime.h //随机数类 const unsigned long maxshort = 65536L; const unsigned long multiplier = 1194211693L; const unsigned long adder = 12345L; class RandomNumber { private: //当前种子 unsigned long randSeed; public: RandomNumber(unsigned long s = 0);//构造函数,默认值0表示由系统自动产生种子 unsigned short Random(unsigned long n);//产生0:n-1之间的随机整数 double fRandom(void);//产生[0,1)之间的随机实数 }; RandomNumber::RandomNumber(unsigned long s)//产生种子 { if(s == 0) { randSeed = time(0);//用系统时间产生种子 } else { randSeed = s;//由用户提供种子 } } unsigned short RandomNumber::Random(unsigned long n)//产生0:n-1之间的随机整数 { randSeed = multiplier * randSeed + adder;//线性同余式 return (unsigned short)((randSee

文档评论(0)

我是追梦人 + 关注
实名认证
内容提供者

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

1亿VIP精品文档

相关文档