初等数论程耀.pptxVIP

  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文档。上传文档
查看更多
初等数论程耀

素数和合数算术基本定理:任意正整数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 2829 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的话,那么要乘以对应的a^(2^k). 算法复杂度O(log n)快速幂取模代码分析 int quick_mod ( int a , int n ){ int t =a , ret =1; while( n ){ if( n 1) ret=ret * t%n; n=1; //n右移两位,相当于除2 t = t * t %n; } return ret ; }PS:与快速幂取模类似的还有矩阵快乘,这里不展开最大公约数(gcd)普通算法:求出c=min( a , b),如果找到c|a c|b,那么c减一,然后循环继续,直到 找到 c满足条件

文档评论(0)

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

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

1亿VIP精品文档

相关文档