数论——素数筛选法与整数的素因子分解

来源:互联网 发布:java继承的定义 编辑:程序博客网 时间:2024/06/05 14:34

筛选法   

     求出n以内的素数,最快的应该是筛选法。

 筛选法的思路是:

     要求10000以内的素数,把1-10000都列出来,1不是素数,划掉;2是素数,所有2的倍数都不是素数,划掉;取出下一个幸存的数,划掉它的所有倍数;直到所有素数找完为止。

     这种做法的空间复杂度是O(n),时间复杂度O(n/logn)。

const int Max = 1000005; bool prime[Max]={0};//0表示素数,1为非素数  //筛选n以内的素数 void getPrime(int n) {     int i,j;     int t;     for(i = 2; i <= n; i++)     {         if(!prime[i])         {             for(j = 2; (t=j*i) <= n; j++)                 prime[t] = 1;         }     } }


 

分解素因子

     唯一质因子分解定理:任意一个合数a仅能以一种方式,写成如下的乘积形式:

a = p1^e1*p2^e2*...*pr^er

    其中pi为素数,p1<p2<...<pr,且ei为正整数。例如数6000=2^4*3*5^3。

    素因子的分解技巧:首先a的某两个素因子不可能同时大于sqrt(a),这样,先用筛选法求出sqrt(a)以内的所有素数,然后用a依次去mod这些素数,若能整除,则找到素因子,将素因子去掉,再继续找。最后若a>1,则a也是它的素因子。

 

const int Max = 100005; int isPrime[Max]={0}; int prime[Max/5],num=0; int factors[100],s=0;  void getPrime(int n) {     int i,j;     int t;     for(i = 2; i <= n; i++)     {         if(!isPrime[i])         {             prime[num++] = i;             for(j = 2; (t=i*j) <= n; j++)                 isPrime[t] = 1;         }     } }  void decompose(int n, int* factors) {     int te = (int)sqrt(n*1.0);     for(int i = 0; i<num&&prime[i]<=te; i++)     {         if(n%prime[i]==0)         {             factors[s++] = prime[i];             while(n%prime[i]==0)                 n = n/prime[i];         }     }     if(n > 1)         factors[s++] = n; }