ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

[数学基础] 7 欧拉函数

2022-05-16 21:01:25  阅读:260  来源: 互联网

标签:frac 函数 int varphi times mu 数学 欧拉


欧拉函数

非常有用的欧拉函数!嗯……好像应该放在四大定理前讲的来着QAQ

1. 欧拉函数的定义

  • 定义\(\varphi(N)\)为\(1\)~\(N\)中与\(N\)互质的数,假设\(N\)可以表达为\(p_1^{a_1}\times p_2^{a_2}...p_k^{a_k}\),\(\forall i\in [1,k], p_i\)为质数,\(a_i>0\)

    则\(\varphi(N)=N\times (1-\frac{1}{p_1})\times(1-\frac{1}{p_2})...(1-\frac{1}{p_k})\)

特别的,规定\(\varphi(1)=1\)。(唯一和1互质的数就是1本身)

证明:容斥原理

  1. 先去掉1~N中\(p_1\)的倍数,再去掉1~N中\(p_2\)的倍数,……直到去掉1~N中\(p_k\)的倍数。那么,此时答案就是

    \[N-\frac{N}{p_1}-\frac{N}{p_2}-...-\frac{N}{p_k} \]

  2. 这个答案,将\(p_i\times p_j, (i,j\in[1,k], i\neq j)\)重复减去了多次,需要把它们加回来

    \[N-\frac{N}{p_1}-\frac{N}{p_2}-...-\frac{N}{p_k}+\frac{N}{p_1p_2}+\frac{N}{p_1p_3}+...+\frac{N}{p_{k-1}p_k} \]

  3. 考虑这样的三元组\(p_ap_bp_c\),它们先是被1中的式子\(p_a,p_b,p_c\)减去了三次,又在2中的式子\(p_ap_b,p_ap_c,p_bp_c\)中加了三次,总体没加也没减。因此要把三元组的倍数从\(N\)中减去

    \[N-\frac{N}{p_1}-\frac{N}{p_2}-...-\frac{N}{p_k}+\frac{N}{p_1p_2}+\frac{N}{p_1p_3}+...+\frac{N}{p_{k-1}p_k}-\frac{N}{p_1p_2p_3}-...-\frac{N}{p_{k-2}p_{k-1}p_{k}} \]

  4. 以此类推,最终化简上面的式子,可得

    \[N\times(1-\frac{1}{p_1}-...-\frac{1}{p_k}+\frac{1}{p_1p_2}+...+\frac{1}{p_{k-1}p_k}-...)\\=N\times (1-\frac{1}{p_1})\times(1-\frac{1}{p_2})...(1-\frac{1}{p_k}) \]

  • 时间复杂度:欧拉函数时间复杂度最大的地方在于分解质因数,因此时间复杂度为\(O(\sqrt N)\)。

欧拉函数模板

int phi(int x){
    int res = x;
    for (int i=2;(ll)i*i<=x;++i){
        if (x % i == 0){
            res = res / i * (i - 1);
            while (x % i == 0) x /= i;
        }
    }
    if (x > 1) res = res / x * (x - 1);
    return res;
}

2. 欧拉函数的性质

性质1
  • \(\sum a=\frac{n\times \varphi(n)}{2}, n>1, a\in[1,n),(a,n)=1\)。
性质2
  • \(\forall n>2,\varphi(n)\)为偶数。

证明:\(\because (n,x)=(n,n-x), n>x\)

假设\(\exist x\in[1,n)\),\((n,x)=(n,n-x)=1,x=n-x, n>2\),则\(n=2x\),矛盾。

\(\therefore[1,n)\)中与\(n\)互质的数均是成对出现的,因此\([1,n)\)与\(n\)互质的数是偶数,即\(\varphi(n)\)为偶数。

观察\((n,x)=(n,n-x)=1\),也说明了任意一对与\(n\)互质的数,相加均为\(n\),所以有\(\sum a = \frac{n\times\varphi(n)}{2}\)

性质3
  • \(\sum\limits _{d|n} \varphi(d)=n\)

设\(f(n)=\varphi * I=\sum\limits _{d|n}\varphi(d)\),则\(f(n)\)为一个积性函数。

将\(n\)唯一分解为\(n= \prod_{i=1}^kp_i^{a_i} = p_1^{a_1}p_2^{a_2}..p_k^{a_k}\),则

\(f(p_i^{a_i})=\varphi(1)+\varphi(p_i)+..+\varphi(p_i^{a_k})\\=1+(p-1)+..+(p^k-p^{k-1})=p^k\)

\(f(n)=f(p_1^{a_1})\times f(p_2^{a_2})\times ..\times f(p_k^{a_k})=\prod_{i=1}^kp_i^{a_i}=n\),证毕。

性质4
  • 欧拉函数为积性函数,但不是完全积性函数,当\((n,m)=1\)时,满足\(\varphi(m\times n)=\varphi(m)\times \varphi(n)\)。那么显然,当\(n\)唯一分解后,\(\varphi(n)=\prod_{i=1}^k\varphi(p_i^{a_i})\)。

证明:若\((n,m)=1\),则\(n,m\)没有相同的质因子,记\(n\)的质因子个数为\(c_1\),\(m\)的质因子个数为\(c_2\),则

\(\varphi(n)\times \varphi(m)=n\times m\times \prod_{i=1}^{c_1}(1-\frac 1 {p_i})\times \prod_{i=1}^{c_2}(1-\frac 1 {p_i})=\prod_{i=1}^{c_1+c2}(1-\frac 1 {p_i})=\varphi(n\times m)\)

例题:cf776E The Holmes Children

性质5
  • \(\frac {\varphi(n)} n=\sum\limits_{d\mid n}\frac{\mu(d)}{d}\)。

写成狄利克雷卷积的形式

\(\varphi * I=id\),\(\varphi * I * \mu=id * \mu\)

\(\varphi * (I * \mu)=id * \mu\)

\(\varphi*e=id*\mu\)

即\(\varphi(n)=\sum\limits _{d|n}\frac n d\times \mu(d)\),也就是\(\frac {\varphi(n)} n=\sum\limits_{d\mid n}\frac{\mu(d)}{d}\)

性质6

当\(n=p^k\)时,\(\varphi(n)=p^k-p^{k-1}\)

证明:当\(n\)只有一个质因数时,\(\varphi(n)=p^k\times(1-\frac 1 p)=p^k-p^{k-1}\)

3. 筛法求欧拉函数

假设目前已知\(\varphi(i)\)的值,\(p_j\)为某一质数,求\(\varphi(i\times p_j)\)的值。

将\(i\)表示为\(p_1^{a_1}\times p_2^{a_2}...p_k^{a_k}\),\(\varphi(i)=i\times (1-\frac{1}{p_1})\times(1-\frac{1}{p_2})...(1-\frac{1}{p_k})\),

  1. \(i\%p_j==0\)时,\(i\times p_j\)中不存在新的质因子

    \(\therefore \varphi(i\times p_j)=i\times p_j\times (1-\frac{1}{p_1})\times(1-\frac{1}{p_2})...(1-\frac{1}{p_k})=\varphi(i)\times p_j\)

  2. \(i\%p_j\neq 0\)时,\(p_j\)为新的质因子

    \(\begin{align} & \therefore \varphi(i\times p_j)=i\times p_j\times (1-\frac{1}{p_1})\times(1-\frac{1}{p_2})...(1-\frac{1}{p_k})\times (1-\frac{1}{p_j})\\ & =\varphi(i)\times p_j\times(1-\frac{1}{p_j})\\ & =\varphi(i)\times(p_j-1) \end{align}\)

  • 代码
int n, cnt;
const int N = 1e6 + 10;
int E[N], p[N];
bool st[N];

void Eulers(){
    E[1] = 1;
    for (int i=2;i<=n;++i){
        if (!st[i]){
            p[++cnt] = i;
            E[i] = i - 1;
        }
        for (int j=1;p[j]<=n/i;++j){
            int t = p[j] * i;
            st[t] = true;
            if (i % p[j] == 0){
                E[t] = E[i] * p[j];
                break;
            }
            E[t] = E[i] * (p[j] - 1);
        }
    }
}

标签:frac,函数,int,varphi,times,mu,数学,欧拉
来源: https://www.cnblogs.com/vivaldi370/p/MathBasic_7_EulerFunction.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有