快速分解质因数(Pollard Rho因数分解)

void prime_diecom(int n,set&st){
    for(int i=2;i<=n;i++){
        while(n!=i){
            if(n%i==0){
                st.insert(i);
                n=n/i;
            }
            else
                break;
        }
    }
    if(n!=1)
        st.insert(n);
}

理论上复杂度确实是 O(n^(1/4)),但是却仍然有可能会超时,因为当n为一个很大的素数时,很明显我们要做n次判断,容易超时,解决办法是每次判断完后快速判断其是否为素数,如果是则退出即可。

void prime_diecom(int n,set&st){
    for(int i=2;i<=n;i++){
        while(n!=i){
            if(n%i==0){
                st.insert(i);
                n=n/i;
            }
            else
                break;
        }
        if(is_prime(n)){
            st.insert(n);
            break;
        }
    }
}

附is_prime()具体实现:

bool is_prime(int x){
    if(x==1)
        return false;
    if(x==2||x==3)
        return true;
    if(x%6!=1&&x%6!=5)
        return false;
    int s=sqrt(x);
    for(int i=5;i<=s;i+=6)
        if(x%i==0||x%(i+2)==0)
            return false;
    return true;
}

 

你可能感兴趣的:(模板)