初等数论-程耀课件.pptVIP

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

XDU_ACM----初等数论 ——程耀 素数和合数 算术基本定理:任意正整数n可以写成n=2a1*3a2*5a3*…,其中a1,a2,a3等为非负整数 素数的判定: ①判定函数 ② 筛法求素数 ③miller_rabin素性判定 素数的判定 bool Is_prime( int n){ int t = (int )sqrt (n); for ( int i =2; i = t ; i ++) if(n%i ==0) return false; return true; } 筛法求素数 思考:如果一个数是合数,那么它的素因子 都比它小??? 这样说来:如果我们的当前数是 a ,那么所有 a的倍数(当然是2倍以上啦)都不会是素数 ,可以这样看吧? 于是,我们可以一种新的素数判定方法。 筛法求素数 方法:每次用一个素数,去筛掉所有它的倍数。 举个例子:2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 ①筛去2的倍数,剩下3 5 7 9 11 13 15 17 19 21 23 25 27 29 ②筛去3的倍数,剩下5 7 11 13 17 19 25 29 。。。。。。 注意:开头的数一定是素数??? 筛法求素数 bool prime[ maxn ];//时间复杂度O(n)??? void init ( ){ memset(prime, 0 ,sizeof(prime)); for( int i=4;i maxn; i +=2) prime[i]=1; for( int i=3; i maxn; i+=2) if( ! prime[ i ]){ for ( int j = i * i ; j maxn;j+=i) prime[ j ]=1; } } miller_rabin素性判定 miller_rabin是一种概率型的算法,不是确定型的。但是,只要运行次数足够多,一般出错的概率是非常小的,一般10次就好了! 算法复杂度是 O((logn)^3) 算法的正确性是基于费马小定理。 费马小定理:对于素数p和任意整数a,有 a^(p-1)=1(mod p)。反过来,满足a^(p-1)= 1(mod p),p也几乎一定是素数。 miller_rabin算法分析 bool miller_rabin(LL n){ if(n2) return false; if(n==2) return true; if(!(n1)) return false; for(int i=1;i=12;i++){ LL a=random(n-2)+1; if(witness(a,n)) return false; } return true; } witness函数 witness函数用来搜集n是合数的证据。 bool witness(LL a,LL n){ LL m=n-1; int t=0; LL y; while(!(m1)){ m=1;t++;}//这个地方是通过一个推论来优化的,x^2=1(mod n),当那个n是合数的时候,就会出现非平凡平方根! LL x=quick_mod(a,m,n); for(int i=1;i=t;i++){ y=muti(x,x,n); if(y==1 x!=1 x!=n-1) return true; x=y; } if(y!=1) return true; else return false; } 快速幂取模 题目:求出m^n ( mod p) 的值,其中 m=10000, n=100000000。 分析:如果直接边乘然后边取模,直接导致 TLE!我们需要一个更优的算法。 我们可以发现:这其中包含着大量的重复的子问 题,利用分治的思想可以大大减小运算量。 举个例子:2^7 = 2^4 * 2^2 * 2^1,而2^t到2^(2t)只需要累乘就好了。 快速幂取模算法分析 把指数看成一个二进制数,从低位到高位依次判断是否为1。如果是1,就要乘以2^t,否则,就不需要乘上2^t. 其中,ak等系数只能取0,或者1。如果取1的话

文档评论(0)

带头大哥 + 关注
实名认证
文档贡献者

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

1亿VIP精品文档

相关文档