求一个数的欧拉函数的优化

函数值是小于或等于N且与N互质的数的个数

\[\varphi(x)=x \prod_{i=1}^{n}\left(1-\frac{1}{p_{i}}\right) \]

(其中\(p_{1}, p_{2}……p_{n}\)为x的所有质因数,x是不为0的整数)
\(\varphi(1) = 1\)
欧拉函数值除了1和2其他都是偶数,因为如果\(gcd(i,n) = 1\),那么\(gcd(n - i,n) = 1\),如果\(gcd(i,n)≠1\),那么\(gcd(n- i,n)≠1\),而1规定是1,2的一半是1,所以1和2的欧拉函数值为奇数

求一个数的欧拉函数

时间复杂度\(O(\sqrt n)\)

int eular(int n){
    int ans = n;
    for(int i = 2; i * i <= n; i++){
        if(n % i == 0){
            ans -= ans/i;
            while(n % i == 0) n /= i;
        }
    }
    if(n > 1)ans -= ans / n;
    return ans;
}

求一个数的欧拉函数优化版

先欧拉筛\(O(n)\)求出范围内的素数,然后利用这些素数优化欧拉函数值

同理,在唯一分解定理也可以这样去优化
素数占比
2 ->0.5
10 ->0.4
100-> 0.25
1000->0.168
10000->0.1229
100000->0.09592
1000000->0.078598
10000000->0.0664579
100000000->0.0576146
平常处理\(1e9\)的数字的欧拉函数值,只需要求出\(1e5\)内的素数
那么就比一般方法快了10倍,\(O(\frac{\sqrt n}{10})\)

int phi(int n){//phi优化,先线性筛求出sqrt n 的质数
    int ans = n;
    for(int i = 1; pri[i] * pri[i] <= n; i++){
        if(n % pri[i] == 0){
            ans -= ans / pri[i];
            while(n % pri[i] == 0) n /= pri[i];
        }
    }
    if(n > 1) ans -= ans / n;
}
posted @ 2020-06-02 18:53  Emcikem  阅读(406)  评论(0编辑  收藏  举报