ACM周末总结—10月22日

来源:互联网 发布:高速铣编程用什么软件 编辑:程序博客网 时间:2024/06/01 20:51

         这个半周继续学习了数学的内容,在整理一下吧。其实感觉直接复习高代好像也可以。

    筛素数:  

         理论:任何一个正整数都可以被唯一的分解为若干个素数的乘积;

         取出容器中最小的数(此数一定是素数),删去所有该数的倍数。

         int n;
         bool  vis[1005];
         cin>>n;
         memset(vis,true,sizeof(vis));
         vis[0]=false;vis[1]=false;
         for(int i=2;i<=n;i++){
             if(vis[i]==false) continue;
             for(int j=i*2;j<=n;j+=i){
               vis[j]=false;
             }
          }

     筛素数改进:

            因为普通筛素数方法速度是比较慢,因为同一个数可能处理好几次(2,3,都是12的因子),任何一个数都有一            个可以被整除的最小素数(除去1),当遇到该素数是时就结束更新。

        int flag=0,n;
        memset(isprim,0,sizeof(isprim));
        cin>>n;
        for(int i=2;i<n;i++)
        {
             if(!isprim[i]) prim[flag++]=i;
             for(int j=0;(j<flag)&&(i*prim[j]<n);j++)
             {
                 isprim[j]=1;
                 if(i%prim[j]==0) break;//就用这部来节省时间
             }
       }

       欧拉函数: 

           计算比x(正整数)小的正整数中有多少与x互素的数的个数。设x=p1^(a1)  *p2^(a2) *......px^(ax);

           f(x)=p1^(a1-1)  *p2^(a2-1) .....(p1-1)(p2-1)....

       欧拉定理:

           设f(x)是求x的欧拉函数。如果a,m互素。  

           那么  a  ^ (  f(m) )  ==  1(  mod  m);//数学真是很神奇。

       费马小定理:

            若p为素数,则对于任意小于p的正整数a,有a^(p-1)==1( mod p )。其实就是对欧拉定理的特例,a与m互素。

       二次探测定理:

            若p是素数a^2==1 (  mod p);   还是欧拉定理的特例。

       Miller—Rabin算法

            主要用来判断输入的数是否为素数。

           如果p是素数,x是小于p的正整数,且  (x^p-1) mod p = 1。

           其实这只是一个充分条件,但是可以利用随机数多试验几次,就可以把正确率提高高99.99%以上。

           http://blog.csdn.net/z690933166/article/details/9860937这是一位大佬的详细讲解。

           关于这个算法的具体实现我还没完全看懂。

           此处是该算法的模版  http://blog.csdn.net/idealism_xxm/article/details/480531

还有用于大整数分解的Pollard—rho算法,这是某大佬的模版http://blog.csdn.net/lianai911/article/details/45076837

其实我Pollard—rho算法和Miller—Rabin算法都还没怎么彻底弄懂,彻底弄懂后专门整理一篇。