【数学】欧拉函数

欧 拉 函 数 欧拉函数

对正整数n,欧拉函数是小于或等于n的数中与n互质的数的数目

欧 拉 函 数 通 常 用 φ ( n ) 表 示 欧拉函数通常用\varphi (n) 表示 φ(n)

∀ x ∈ Z + , 先 分 解 成 质 因 数 相 乘 的 格 式 \forall x \in Z _+ , 先分解成质因数相乘的格式 xZ+,

x = P _ 1 c 1 × P _ 2 c 2 × . . . × P n c n x = P\_1^{c1} \times P\_2^{c2} \times ... \times P_n^{cn} x=P_1c1×P_2c2×...×Pncn

则 有 φ ( x ) = x × ( 1 − 1 P 1 ) × ( 1 − 1 P 2 ) × . . . × ( 1 − 1 P n ) 则有\varphi (x) = x \times (1 - \frac{1}{P1}) \times (1 - \frac{1}{P2}) \times ... \times (1 - \frac{1}{Pn}) φ(x)=x×(1P11)×(1P21)×...×(1Pn1)

C o d e Code Code

void init()//质数筛
{
    for (int i = 2; i < N; i ++ )
    {
        if (p[i])continue;
        q[++tot] = i;
        for (int j = 2; j <= N / i; j ++ )
            p[i * j] = true;
    }
}

int varphi(int n)
{
    init();
    
    int ans = n;
    for (int i = 1; i <= tot; i ++ )//分解质因数
    {
        int cnt = 0;
        while (n % q[i] == 0)
        {
            n /= q[i];
            cnt ++ ;
        }
        if (cnt)ans -= ans / q[i];
    }
    
    return ans;
}

但 是 单 个 求 复 杂 度 太 高 , 每 个 都 需 要 O ( n l o g n ) 的 复 杂 度 , 求 1 ∼ n 的 欧 拉 函 数 之 和 就 要 O ( n 2 l o g n ) 但是单个求复杂度太高,每个都需要O(nlogn)的复杂度,求1 \sim n的欧拉函数之和就要O(n^2logn) ,O(nlogn),1nO(n2logn)

这 时 就 需 要 用 到 更 快 的 这时就需要用到更快的 线 性 筛 法 线性筛法 线 , 并 根 据 线 性 筛 法 的 性 质 , 顺 带 求 出 所 有 数 的 欧 拉 函 数 值 ,并根据线性筛法的性质,顺带求出所有数的欧拉函数值 ,线,

C o d e Code Code


void init()//质数筛
{
   for (int i = 2; i < N; i ++ )
   {
       if (p[i])continue;
       q[++tot] = i;
       for (int j = 2; j <= N / i; j ++ )
           p[i * j] = true;
   }
}

int varphi(int n)
{
   init();
   
   int ans = n;
   for (int i = 1; i <= tot; i ++ )//分解质因数
   {
       int cnt = 0;
       while (n % q[i] == 0)
       {
           n /= q[i];
           cnt ++ ;
       }
       if (cnt)ans -= ans / q[i];
   }
   
   return ans;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值