南开大学ACM集训-数论.pptVIP

  1. 1、本文档共22页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
南开大学ACM集训-数论.ppt

Butterfly0923 Doraemonok jackfeng 2008年南开大学ACM协会暑期集训 数论 求素数方法 1)p[N]存储所有的素数,二重循环,用已经求出的不大于平方根的所有素数试除 for(i=2;in;++i) for(j=0;jm p[j]*p[j]=n;++j) 如果p[j]整除i,则i不是素数 如果都不能整除,则i是素数,添加到素数列表p[N]; 素数 2)增加布尔型数组b[N]记录是否为素数,初始化所有值=1,从头开始遍历,如果b[i]==1,则i是素数,将所有的i的倍数j均修改为b[j]=0 for(i=2;in;++i) 如果b[i]==1则添加到素数列表p[],然后利用循环for(j=i;jn;j+=i) b[j]=0将i的所有倍数删掉 思考:试比较两种方法效率 大数的素性检测 Rabin-Miller素数测试 非素数通过测试概率为 ? Pollard-ρ算法 大数的快速分解 这两种算法在此不予以介绍,有兴趣的同学可以到google上搜索或参看相关书籍 二分法in乘方 如何计算a^n ? 1)计算a*a*a*…*a*a*a,需要计算n-1次乘法,时间复杂度O(n) 2)考虑实例a^4,计算b=a*a,再算c=b*b,则c=a^4,但是只用了两次乘法,效率提高。比如a^9=a*(a^4)*(a^4),只需用4次乘法,一般的,a^n时间复杂度为O(logn) 二分法in乘方 第二种算法与二进制的关系 9=(1001)2, a^9=a^8*a; 10=(1010)2, a^10=a^8*a^2; 从二进制最后一位开始,如果第k位是1,就乘以a^(2^(k-1)),计算每个a^(2^k)需要logn,得到答案最多需要乘logn次,所以复杂度是O(logn) 如果把a看作矩阵,上面方法可应用于矩阵乘方 (注:这并不是最快的办法,有兴趣的同学可以做一下poj3134) 改进乘方算法应用于fibonacci 普通的算法求Fn的时间复杂度为O(n),当然如果要求求出所有的Fn,这种已经是最优的了,但是如果只求某一个Fn,可以改进 GCD(Great Common Divisor) Euclid 算法 int gcd ( int a, int b ) { int mod; while ( mod = a % b ) a = b, b = mod; return b; }//注意这里面必须a,b都为正数,否则要加其他判断语句 Extended-Euclid 算法: 同时求出 v, u 使gcd ( a, b ) = u * a + v * b(重要) 非递归的不好写,建议写递归的 扩展欧几里得算法 注意到对于gcd(a,b) = d 我们对(a, b)用欧几里德辗转相除会最终得到 (d, 0)此时对于把a =d, b = 0 带入a*x + b*y = d,显然x = 1,y可以为任意值, 这里y可以为任意值就意味着解会有无数个。我们可以用a = d, b = 0的情况逆推出来 任何gcd(a, b) = d 满足a*x + b*y = d的解。如果x0, y0是b*x + (a%b)*y = d 的解,那么对于a*x + b*y = d的解呢? 扩展欧几里得算法 b*x + (a%b)*y = d?=?b*x + (a - [a/b]*b)*y = a*y + b*(x - [a/b]*y),所以a*x + b*y = d的解x1 = y0, y1 = x0 - [a/b]*y0; 这样我们可以程序迭代了。 注:a,b为正整数,设集合A = {x*a+y*b|x,y是整数},则A中最小正元素是gcd(a,b) Extended-Euclid 算法 扩展欧几里德算法: EXTENDED-EUCLID(a, b) if b = 0 then return (a, 1, 0) (d’,x’,y’) ← EXTENDED-EUCLID(b, a%b) (d, x, y) ← (d’, y’, x’ – (a/b) * y’) return (d, x, y) * 求解模线性方程 定理:方程ax=b(mod n)对于未知量x有解,当且仅当gcd(a, n)|b 定理:方程ax=b(mod n)或者对模n有d个不同的解,其中d=gcd(a, n)或者无解。 * 求解模线性方程 定理:设d=gcd(a, n),假定对整数x’和y’,有d=ax’+ny’。如果d|b,则方程ax=b(modn)有一个解的值为x0,满足x0=x’(b/d)mod n。 * 求解模线性方程 定理:假设方程ax=b(mod n)有解(即有d|b,其中d=gcd(a, n)),x0是该方

文档评论(0)

heroliuguan + 关注
实名认证
文档贡献者

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

版权声明书
用户编号:8073070133000003

1亿VIP精品文档

相关文档