基础算法学习_1

//算法:筛法求素数
//时间复杂度:O(nlognlogn) 
//空间复杂度:O(n)
//输出:集合S={x|1<x<=n&&x is a prime}
int n;
bool S[n+1];
void get_prime(){
  for(int i=2;i<=sqrt(n);i++) if(!S[i]){
    for(int j=i<<1;j<=n;j++)
    S[j]=1;
    }
}
//算法:筛法求素数
//时间复杂度:O(n) 
//空间复杂度:O(n)
//输出:array prime
int n;
bool S[n+1];
int prime[n],tot
void get_prime(){
  for(int i=2;i<=n;i++){
        if(!S[i]) prime[tot++]=i;
        for(int j=0;j<tot&&i*prime[j]<=n;j++){
            S[i]=1;
            if(i%prime[j]==0) break;
        }    
    }
}
//算法:Euclid算法 
//时间复杂度:O(log(a+b)) 
//空间复杂度:- -
//输出:a integer as the gcd(a,b)
int gcd(int a,int b){
    return b? gcd(b,a%b):a;
}
//算法:Pollard's p算法 
//时间复杂度:O(n^0.25) 
//空间复杂度:- -
//输出:n的一个约数 
int pollard(int n){
    int x=rand()%n//1~n-1的一个随机数
    int res,y=x,k=2,i=1; 
    while(1){
        i++;
        x=(x*x-1)%n;
        res=gcd(y-x,n);
        if(res!=1&&res!=n) return res;
        if(i==k) y=x,k<<=1;
    }
}
//算法:ex eculid 算法 
//时间复杂度:O(log(a+b)) 
//空间复杂度:- -
//输出:gcd(a+b) and 满足ax+by=gcd(a+b)的一个线性组合(x,y) 
int ex_eculid(int a,int b,int &x,int &y){
    if(b==0){
        x=1,y=0;
        return a;
    }else{
        int q=b/a;
        int res=ex_eculid(b,a%b,x,y);
        x=-x*q+y,y=x;
        return res;
    }
}
//对于一组解x0,y0;
//x1=x0-b/gcd(a,b)*t,y1=y0+a/gcd(a,b)*t

 

posted @ 2017-08-10 17:44  duduorz  阅读(134)  评论(0)    收藏  举报