• 欧拉函数


    欧拉函数

    欧拉函数 (varphi(a)) 为小于等于 (a) 的正整数中与 (a) 互质的个数。

    显然得到 (varphi(1) = 1) ,当 (a) 为质数的时候我们有 (varphi(a) = a-1)

    同时,我们有(varphi(n) = n imes(frac{p-1}{p}) = p^{k-1} imes(p-1)) ,其中 (n = p^k) 并且 (p) 为质数。

    同时我们知道欧拉函数是一个积性函数,也就是当 (gcd(a,b) = 1) 时有

    [varphi(a imes b) = varphi(a) imes varphi(b) ]

    我们可以将 (n) 唯一质因数分解, (n = prod_{i=1}^sp_i^{k_i}) ,其中 (p_i) 表示第 (i) 个质因数, (k_i) 表示对应的质因数的因数个数 。

    显然我们得到了

    [varphi(n) = n imesprod_{i=1}^sfrac{p_i-1}{p_i} ]

    如果我们找到 (n) 的最小质因数 (p) , 如果 (gcd(p,frac{n}{p}) = 1) ,那么就有 (varphi(n) = varphi(frac{n}{p}) imesfrac{p-1}{p})

    如果 (gcd(p,frac{n}{p}) = p) 那么就有 (varphi(n) = varphi(frac{n}{p}) imes p)

    我们可以使用欧拉筛来线性求出欧拉函数

    void init()
    {
        phi[1] = 1;
        for(int i = 2;i <= 100000;i ++){
            if(!vis[i]) pri[++cnt] = i,phi[i] = i-1;
            for(int j = 1;j <= cnt&&(i*pri[j]<=100000);j ++){
                 
                vis[i*pri[j]] = 1;
                phi[i*pri[j]] = phi[i]*(pri[j]-1);
                if(i%pri[j]==0){
                    phi[i*pri[j]] = phi[i]*pri[j];
                    break;
                }
            }
        }
    }
    
  • 相关阅读:
    Class 'ViewCell' has no initializers
    xcode:关于Other Linker Flags
    NSString编码形式是UTF–16
    手写识别方案汇总
    将一个 view 进行截图
    程序员最核心的竞争力是什么?
    sqlite3
    创建NAT 64网络
    Snagit安装步骤
    cnblogs插件jiathis
  • 原文地址:https://www.cnblogs.com/nao-nao/p/13647143.html
Copyright © 2020-2023  润新知