数学/数论专题-学习笔记:欧拉函数

一些 update

update 2021/5/20:删除了一些话语,精炼了一些语言。

update 2021/8/11:发现扩展性质 3 的证明有问题,讲解的也不清不楚,已经更正证明。

update 2021/8/12:发现基本性质 1 有误,已经更正。

update 2021/8/24:根据最近所学到的东西,添加扩展性质 4。

update 2021/12/14:更新了一下前言部分与简单性质部分,往基本性质 2 中加了一句不影响理解但有帮助的话,添加了扩展性质 2 的第二种证明,更新了摘要部分。

1. 前言

本篇博文将会重点讲解欧拉函数,数论入门级别的函数。

在此之前,您需要知道以下几个符号:

  1. \(d | n\) 表示 \(d\) 能整除 \(n\),等价于 \(d\)\(n\) 的因数。\(d \nmid n\) 表示 \(d\) 不能整除 \(n\),等价于 \(d\) 不是 \(n\) 的因数。
  2. \(\sum_{i=1}^{n}=a_i\) 是求和符号,表示所有 \(a_i\) 的和。
  3. \(\prod_{i=1}^na_i\) 是求积符号,表示所有 \(a_i\) 的积。
  4. \([A]\) 表示当 \(A\) 成立时 \([A]=1\),否则 \([A]=0\),比如 \([5=1]=0\),\([6=6]=1\)

本文默认读者学过质数及其简单性质与应用,包括但不限于分解质因数与线性筛/欧拉筛。

若无特殊说明,本文默认所有数都是正整数。

2. 前置定理

简单定理:

  • \(\gcd(a+mb,b)=\gcd(a,b)\)
  • \(\gcd(a,b)=d \Leftrightarrow \gcd(\dfrac{a}{d},\dfrac{b}{d})=1\)
  • 一些别的定理(比如辗转相除法之类的)

两个关键定义:

积性函数:假设一个函数满足以下条件:

\[f(a \times b) = f(a) \times f(b),\gcd(a,b)=1 \]

那么称这个函数为积性函数。也就是说,积性函数的定义域内任取两个互质的数 \(a,b\),必有 \(f(a \times b)=f(a) \times f(b)\)

比如我们熟知的一次函数 \(f(x)=x\) 就是积性函数。

完全剩余系:我们知道一个数模 \(n\) 共有 \(n\) 种结果,为 \(0,1,2,...,n-1\)

那么我们将其看成 \(n\) 类,第 \(i\) 类结果为 \(i\),那么从每一类中取出一个数,这些数构成的集合就叫做模 \(n\) 的完全剩余系。

比如说 \(\{51,22,63,104,200\}\) 就是模 \(5\) 的一个完全剩余系,因为其模 \(5\) 的结果为 \(\{1,2,3,4,0\}\)

一个简单的性质:假设 \(t < a\)\(\gcd(t,a)=1\),那么 \(t,2t,3t,...,(a-1)t\) 构成了模 \(a\) 的完全剩余系,且 \(\forall i \in N\),\(i+t,i+2t,i+3t,...,i+(a-1)t\) 也构成了模 \(a\) 的完全剩余系。

3. 定义

首先来讲讲欧拉函数是个啥:

定义:在数论中,记欧拉函数 \(\varphi(n)\) 表示在 \([1,n-1]\) 内几个数与 \(n\) 互质。

更加严谨的,有:\(\varphi(n)=\sum \limits_{i=1}^{n}[\gcd(i,n)=1]\)

这就是欧拉函数。

4. 性质

强烈建议读者拿出纸笔自己写一些,可以更方便的理解。

欧拉函数的基本性质:

  • 基本性质 1:若 \(p\) 为质数,那么 \(\varphi(p)=p-1\)。特别的,\(\varphi(1)=1\)
  • 基本性质 2:设 \(n = p^k\)\(p\) 为质数,那么:

    \[\varphi(n)=n-\dfrac{n}{k}=n-p^{k-1}=p^{k-1} \times (p-1)=p^{k-1} \times \varphi(p) \]

    其中 \(\varphi(p^k)=p^k-p^{k-1}=p^{k-1} \times (p-1)\) 用的会比较多。
  • 基本性质 3:欧拉函数是积性函数。
  • 基本性质 4:对于数 \(n\),将其质因数分解为 \(\prod_{i=1}^{k}{p_i}^{r_i}\),那么:

    \[\varphi(n)=\prod_{i=1}^{k}\varphi(p_i^{r_i})=\prod_{i=1}^{k}(p_i^{r_i-1} \times (p_i-1))=n \times \prod_{i=1}^{k}(1-\dfrac{1}{p_i}) \]

接下来一条一条证明。


基本性质 1:

\(p\) 为质数的时候,显然有 \([1,p-1]\) 内所有正整数都与 \(p\) 互质,那么由定义:\(\varphi(p)=p-1\)。因为 1 和 1 互质,那么 \(\varphi(1)=1\)


基本性质 2:

引理:假设在 \([1,n]\) 范围内有一个数 \(x\)\(n\) 互质,那么 \(x\)\(n\) 互质的充要条件是 \(x\)\(p\) 互质。引理正确性显然。

那么考虑正难则反,也就是:\(\varphi(n)=n-\sum\limits_{i=1}^{n}[gcd(i,n) \ne 1]\)

也就是 \(n\) 减去与其不互质的数。

而要使 \(i\)\(n\) 不互质,考虑到 \(p\) 是质数,那么必然有 \(i\)\(p\) 不互质。

那么 \([1,n]\) 范围内有几个数与 \(p\) 不互质呢?\(\dfrac{n}{p}\) 个。

于是又因为 \(n=p^k\),且 \(\varphi(p)=p-1\),那么:

\[\varphi(n)=n-\dfrac{n}{k}=n-p^{k-1}=p^{k-1} \times (p-1)=p^{k-1} \times \varphi(p) \]


基本性质 3:

不妨假设 \(n=a \times b\),其中 \(\gcd(a,b)=1\)

那么要证明的就是 \(\varphi(n)=\varphi(a) \times \varphi(b)\)

接下来考虑将 \(a \times b\) 个数按照矩阵铺开,也就是长这样:

\(\begin{matrix}1&2&\cdots&a-1&a\\a+1&a+2&\cdots&2a-1&2a\\\vdots&\vdots&\ddots&\vdots&\vdots\\(b-1) \times a+1&(b-1) \times a+2&\cdots&b \times a - 1&b \times a\\\end{matrix}\)

那么显然的,对于每一列的数而言,这一列的所有数模 \(a\) 的结果是相同的。

那么考虑这 \(a\) 列,模 \(a\) 的结果就是 \([1,a]\)。这里为了后续方便,就将模 \(a\)\(0\) 视为模 \(a\)\(a\)

考虑到 \(\gcd(x,n)=1\) 的充要条件为 \(\gcd(x,a)=1,\gcd(x,b)=1\),而使得 \(\gcd(x,a)=1\) 的数总共有 \(\varphi(a)\) 列,因此先将这 \(\varphi(a)\) 列取出来,再做进一步的讨论。

比如我们当前取出了第 \(i\) 列,那么第 \(i\) 列的数就是 \(0a+i,1a+i,2a+i,...,(b-1)a+i\),总共 \(b\) 个数。

于是您会发现这些数构成了模 \(b\) 的完全剩余系。

  • 证明如下:不妨令 \(a>b\)
    首先显然有 \(\gcd(a,b)=1\)(否则不符合积性函数的条件),那么假设 \(a \bmod b = t\),那么我们可以将数列转换成如下形式:\(i,i+t,i+2t,...,i+(b-1)t\),而且必有 \(\gcd(t,b)=1\)。于是乎,这些数构成了模 \(b\) 的完全剩余系。

那么在这些数当中,有多少数满足 \(\gcd(x,b)=1\) 呢?因为是完全剩余系,所以有 \(\varphi(b)\) 个。

上面所有过程对于所有 \(\varphi(a)\) 列均成立,因此 \(\varphi(n)=\varphi(a) \times \varphi(b)\),证毕。


基本性质 4:

考虑到欧拉函数为积性函数且 \(\forall i,j \in [1,k],\gcd(p_i^{r_i},p_j^{r_j})=1\),那么有:\(\varphi(n)=\prod_{i=1}^{k}\varphi(p_i^{r_i})\)

记得基本性质 2 的连等式吗?通过第三个式子可以得到:\(\varphi(n)=\prod_{i=1}^{k}(p_i^{r_i-1} \times (p_i-1))\)

然后提取公因数 \(p\),将乘积符号裂成两项,结合欧拉函数是积性函数,于是就有:

\[\varphi(n)=\prod_{i=1}^{k}(p_i^{r_i} \times (1-\dfrac{1}{p_i}))=\prod_{i=1}^{k}p_i^{r_i} \times \prod_{i=1}^{k}(1-\dfrac{1}{p_i})=n \times \prod_{i=1}^{k}(1-\dfrac{1}{p_i}) \]

证毕。

您会发现其实基本性质 4 可以用来求 \(\varphi(n)\)


欧拉函数的扩展性质:

  • 扩展性质 1:设 \(n=a \times b,\gcd(a,b) = d \in N_+\),那么 \(\varphi(n)=\dfrac{\varphi(a) \times \varphi(b) \times d}{\varphi(d)}\)
  • 扩展性质 2:\(\forall n \in N_+,n=\sum\limits_{d|n}{\varphi(d)}\)
  • 扩展性质 3:设 \(n \in N_+,p\) 为质数,那么:

    \[\varphi(n \times p)=\begin{cases}\varphi(n) \times \varphi(p)&p \nmid n\\\varphi(n) \times p&p \mid n\end{cases} \]

  • 扩展性质 4:对于一个数 \(n\)\(n \geq 2\)),所有小于 \(n\) 且与 \(n\) 互质的数的和为 \(\varphi(n) \times \dfrac{n}{2}\)

接下来一条一条证明。


扩展性质 1:

首先先对 \(a,b,d,n\) 做个质因数分解:

\[a=\prod_{i=1}^{m}p_i^{r_1{_i}},b=\prod_{i=1}^{m}p_i^{r_2{_i}},d=\prod_{i=1}^{m}p_i^{\min(r_1{_i},r_2{_i})},n=\prod_{i=1}^{m}p_i^{r_1{_i}+r_2{_i}} \]

然后根据基本性质 4:

\[\varphi(a)=\prod_{i=1}^{m}\varphi(p_i^{r_1{_i}}),\varphi(b)=\prod_{i=1}^{m}\varphi(p_i^{r_2{_i}}) \]

\[\varphi(d)=\prod_{i=1}^{m}\varphi(p_i^{\min(r_1{_i},r_2{_i})}),\varphi(n)=\prod_{i=1}^{m}\varphi(p_i^{r_1{_i}+r_2{_i}}) \]

对要证明的式子直接暴力带入:

\[\prod_{i=1}^{m}\varphi(p_i^{r_1{_i}+r_2{_i}})=\dfrac{\prod_{i=1}^{m}\varphi(p_i^{r_1{_i}}) \times \prod_{i=1}^{m}\varphi(p_i^{r_2{_i}}) \times \prod_{i=1}^{m}p_i^{\min(r_1{_i},r_2{_i})}}{\prod_{i=1}^{m}\varphi(p_i^{\min(r_1{_i},r_2{_i})})} \]

结合基本性质 4 再一次转化:

左边:\(\prod_{i=1}^{m}(p_i^{r_1{_i}+r_2{_i}-1} \times (p_i-1))\)

右边:

\[\dfrac{\prod_{i=1}^{m}(p_i^{r_1{_i}-1} \times (p_i-1)) \times \prod_{i=1}^{m}(p_i^{r_2{_i}-1} \times (p_i-1)) \times \prod_{i=1}^{m}p_i^{\min(r_1{_i},r_2{_i})}}{\prod_{i=1}^{m}(p_i^{\min(r_1{_i},r_2{_i})-1} \times p_i-1)} \]

那么拆掉乘积符号,右边分子分母先约去 \(\prod_{i=1}^{m}(p_i-1)\),然后左右两边同时除以 \(\prod_{i=1}^{m}(p_i-1)\),再做一个简单转化,那么要证明的式子就变成了:

\[\prod_{i=1}^{m}p_i^{r_1{_i}+r_2{_i}-1}=\prod_{i=1}^{m}p_i^{r_1{_i}+r_2{_i}-2} \times \prod_{i=1}^{m}\dfrac{p_i^{\min(r_1{_i},r_2{_i})}}{p_i^{\min(r_1{_i},r_2{_i})-1}}=\prod_{i=1}^{m}p_i^{r_1{_i}+r_2{_i}-1} \]

证毕。


扩展性质 2:

法一:

首先众所周知,这个等式对于任意 \(n \in N_+\) 恒成立:\(n=\sum_{i=1}^{n}1\)

但是这玩意有什么用呢?

我们对这个式子做一个变形:\(n=\sum_{d=1}^{n}\sum_{i=1}^{n}[\gcd(n,i)=d]\)

也就是说,我们枚举一个最大公约数 \(d\),然后枚举 \(i \in [1,n]\)

因为 \(\gcd(n,i)\) 的结果一定是唯一的,于是上式一定成立。

再观察。如果 \(\gcd(n,i)=d\),那么一定有 \(d \mid n\)

于是对这个式子再做一个变形:\(n=\sum_{d \mid n}\sum_{i=1}^{n}[gcd(n,i)=d]\)

根据最大公约数的这个性质:\(\gcd(a,b)=d \Leftrightarrow \gcd(\dfrac{a}{d},\dfrac{b}{d})=1\)(注意前提:\(d \mid a\)\(d \mid b\)),再做一次转化:

\[n=\sum_{d \mid n}\sum_{i=1}^{n}([\gcd(\dfrac{n}{d},\dfrac{i}{d})=1] \times [d \mid i]) \]

然后看一下这个:\(\sum_{i=1}^{n}([\gcd(\dfrac{n}{d},\dfrac{i}{d})=1] \times [d \mid i])\)

这个式子中的 \(i \in[1,\dfrac{n}{d}]\)

然后您会发现这实际上就是在判断 \([1,\dfrac{n}{d}]\) 中有几个数与 \(\dfrac{n}{d}\) 互质。

这不就是 \(\varphi(\dfrac{n}{d})\) 吗?

于是等式变为 \(n=\sum_{d \mid n}\varphi(\dfrac{n}{d})=\sum_{d \mid n}\varphi(d)\)

证毕。

法二:

设函数 \(f(n)=\sum_{d \mid n}\varphi(d)\),要证明的就是 \(f(n)=n\)

先证 \(f(n)\) 是个积性函数:

\(n,m\)\(\gcd(n,m)=1\),有:

\(f(n) \times f(m) = \sum_{i \mid n}\varphi(i)\sum_{j \mid m}\varphi(j)\)(定义暴力拆式子)

\(= \sum_{i \mid n}\sum_{j \mid m}\varphi(i) \times \varphi(j)\)(交换求和号)

\(=\sum_{i \mid n}\sum_{j \mid m}\varphi(i \times j)\)

上面这步是因为 \(\gcd(n,m)=1 \Rightarrow \gcd(i,j)=1\),欧拉函数是积性函数所以可以放进去,下面这步也是一样的。

\(=\sum_{i \times j \mid n \times m}\varphi(i \times j)=f(nm)\)

现在 \(f(n)\) 是积性函数证完了,然后将 \(n\) 质因数分解为 \(\prod_{i=1}^{m}p_i^{k_i}\),于是我们有 \(f(n)=\prod_{i=1}^{m}f(p_i^{k_i})\),现在要证明的就是 \(f(p_i^{k_i})=p_i^{k_i}\)

继续拆式子:\(f(p_i^{k_i})=\varphi(1)+\varphi(p)+...+\varphi(p_i^{k_i})\)(定义拆式子)

\(=(1-0)+(p-1)+(p^2-p)+...+(p_i^{k_i}-p_i^{k_i-1})\)(利用基本性质二 \(\varphi(p_i^{k_i})=p_i^{k_i}-p_i^{k_i-1}\)

\(=p_i^{k_i}\)(消去同类项)

于是 \(f(p_i^{k_i})=p_i^{k_i}\),证毕,那么也就证出了 \(f(n)=n\)

证毕。

这个性质运用时有个专门的名字叫欧拉反演。


扩展性质 3:

首先考虑 \(p \nmid n\) 的情况。

这个时候肯定有 \(\gcd(p,n)=1\),那么因为欧拉函数是积性函数,\(\varphi(n \times p)=\varphi(n) \times \varphi(p)\) 必然成立。

接下来考虑 \(p \mid n\) 的情况。

\(x \in [1,pn]\),因为 \(p \mid n\),那么 \(\gcd(x,pn)=1\) 的充要条件是 \(\gcd(x,n)=1\)(显然)。

因此 \(\varphi(n \times p)=\sum_{i=1}^{n \times p}[\gcd(i,n)=1]\)

\([1,np]\) 内的数分为 \(p\) 类,第 \(i\) 类的数为 \([n \times i + 1,n \times (i + 1)]\)

因为 \(\gcd(a + bn, n) = \gcd(a, n)\),因此对于第 \(i\) 类中的第 \(j\) 个数 \(n \times i + j\) 而言,\(\gcd(n \times i + j, n) = \gcd(j,n)\)

这样,每一类中和 \(n\) 互质的数的个数与第一类中和 \(n\) 互质的数的个数相同。

而显然第一类中和 \(n\) 互质有 \(\varphi(n)\) 个,因此总共与 \(n\) 互质的数有 \(\varphi(n) \times p\) 个。

因此 \(\varphi(n \times p) = \varphi(n) \times p\)

证毕。


扩展性质 4:

先看两个引理:

  • 引理 1:若 \(\gcd(i,n)=1\),则 \(\gcd(n-i,n)=1\)
  • 引理 2:对于 \(n \geq 3\)\(\varphi(n)\) 为偶数。

引理证明如下:

  • 引理 1:考虑反证法。
    \(\gcd(n-i,n)=k \neq 1\),不妨令 \(n=a \times k,n-i=b \times k,a,b \in Z,a>b\),那么 \(i=n-i=(a-b) \times k\),则有 \(\gcd(i,n)=k \neq 1\),与条件 \(\gcd(i,n)=1\) 不符,因此原假设不成立,则原命题成立。
  • 引理 2:令 \(n=\prod_{i=1}^{,m}p_i^{k_i}\),则 \(\varphi(n)=\prod_{i=1}^{m}(p_i-1) \times p_i^{k_i-1}\)
    考虑单独提出 \((p_i-1) \times p_i^{k_i-1}\),若 \(p_i\) 为偶数则该式为偶数,若 \(p_i\) 为奇数则 \(p_i-1\) 为偶数,则该式依然是偶数,所以该式无论怎么样都是偶数。
    由于一个式子是偶数,那么这些式子乘起来也当然是偶数。

根据引理 1,在所有小于 \(n\) 并且与 \(n\) 互质的数中,若 \(i\) 存在,则 \(n-i\) 存在,而这两个数加起来为 \(n\)

接下来分类讨论一波:

  • 如果 \(n=2\),手算就可以得到答案是 1,就是 \(\varphi(2) \times \dfrac{2}{2}\)
  • 如果 \(n>2\),根据引理 2,我们可以得知这样的 \((i,n-i)\) 类的数对有 \(\dfrac{\varphi(n)}{2}\),乘起来得到答案是 \(\varphi(n) \times \dfrac{n}{2}\)

于是扩展性质 4 得证。证毕。


至此,所有性质就都证明完毕了,如果还有一些性质笔者没有提到,烦请在讨论区中提出,笔者将会采纳,在此表示感谢。

5. 求法

\(\varphi(n)\) 有两种求法,依据分别是基本性质 4 和扩展性质 3。

  • 基本性质 4:用于求单个数的欧拉函数。

根据 \(\varphi(n)=\prod_{i=1}^{k}(p_i^{r_i-1} \times (p_i-1))\),对 \(n\) 做一个质因数分解,然后套公式就可以求了。

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

代码:

int ksm(int a, int b)
{
    int ans = 1;
    for (; b; b >>= 1, a = a * a)
        if (b & 1) ans = ans * a;
    return ans;
}

int Get(int n)//求单个数欧拉函数
{
    int ans = 1;
    for (int i = 2; i * i <= n; ++i)
    {
        int cnt = 0;
        while (n % i == 0) {n /= i; ++cnt;}
        if (cnt != 0) ans = ans * ksm(i, cnt - 1) * (i - 1);//基本性质 4
    }
    if (n != 1) ans = ans * (n - 1);//n^0=1
    return ans;
}
  • 扩展性质 3:用于快速求一连串的欧拉函数。

扩展性质 3 可以在 \(O(n)\) 的时间内求出 \([1,n]\) 内的所有欧拉函数值。

利用扩展性质 3 求欧拉函数需要用到线性筛。

先把上面这个式子搬过来:$$\varphi(n \times p)=\begin{cases}\varphi(n) \times \varphi(p)&p \nmid n\\ \varphi(n) \times p&p \mid n\end{cases}$$

考虑在筛质数的时候,假设当前已经筛出了 \(cnt\) 个质数,那么对于当前数 \(i\),在做 \(O(n)\) 的线性筛的时候,假设当前枚举到第 \(j\) 个质数 \(p_j\),那么如果 \(i \bmod p_j=0\),那么就有 \(\varphi(i \times p_j) = \varphi(i) \times p_j\),否则就有 \(\varphi(i \times p_j) = \varphi(i) \times (p_j-1)\)

因为 \(p_j\) 是个质数,所以 \(\varphi(p_j)=p_j-1\)

根据线性筛筛质数的正确性可知,以上过程一定正确。

代码:

vector <int> v;

void Get(int n)//求一连串欧拉函数
{
    book[1] = 1; phi[1] = 1;
    for (int i = 2; i <= n; ++i)
    {
        if (!book[i]) {v.push_back(i); phi[i] = i - 1;}//特别注意质数的初始化!
        for (int j = 0; j < v.size(); ++j)
        {
            if (i * v[j] > n) break;
            book[i * v[j]] = 1;
            if (i % v[j] == 0) {phi[i * v[j]] = v[j] * phi[i]; break;}//多加一步算欧拉函数
            phi[i * v[j]] = phi[i] * (v[j] - 1);//多加一步算欧拉函数
        }
    }
    //最后结果就是 phi[] 数组
}

6. 总结

欧拉函数的性质如下:

  • 基本性质 1:若 \(p\) 为质数,那么 \(\varphi(p)=p-1\)。特别的,\(\varphi(1)=1\)
  • 基本性质 2:设 \(n = p^k\)\(p\) 为质数,那么:

    \[\varphi(n)=n-\dfrac{n}{k}=n-p^{k-1}=p^{k-1} \times (p-1)=p^{k-1} \times \varphi(p) \]

    其中 \(\varphi(p^k)=p^k-p^{k-1}=p^{k-1} \times (p-1)\) 用的会比较多。
  • 基本性质 3:欧拉函数是积性函数。
  • 基本性质 4:对于数 \(n\),将其质因数分解为 \(\prod_{i=1}^{k}{p_i}^{r_i}\),那么:

    \[\varphi(n)=\prod_{i=1}^{k}\varphi(p_i^{r_i})=\prod_{i=1}^{k}(p_i^{r_i-1} \times (p_i-1))=n \times \prod_{i=1}^{k}(1-\dfrac{1}{p_i}) \]

  • 扩展性质 1:设 \(n=a \times b,\gcd(a,b) = d \in N_+\),那么 \(\varphi(n)=\dfrac{\varphi(a) \times \varphi(b) \times d}{\varphi(d)}\)
  • 扩展性质 2:\(\forall n \in N_+,n=\sum\limits_{d|n}{\varphi(d)}\)
  • 扩展性质 3:设 \(n \in N_+,p\) 为质数,那么:

    \[\varphi(n \times p)=\begin{cases}\varphi(n) \times \varphi(p)&p \nmid n\\\varphi(n) \times p&p \mid n\end{cases} \]

  • 扩展性质 4:对于一个数 \(n\)\(n \geq 2\)),所有小于 \(n\) 且与 \(n\) 互质的数的和为 \(\varphi(n) \times \dfrac{n}{2}\)

欧拉函数的求法如下:

  • 利用基本性质 4:质因数分解后套公式即可。
  • 利用扩展性质 3:在线性筛质数的时候多加一步算 \(\varphi(n)\) 即可。

练习:

  1. 独立写出 8 个性质及其证明过程。
  2. 独立写出 2 种求欧拉函数的代码。
posted @ 2022-04-17 14:59  Plozia  阅读(363)  评论(1编辑  收藏  举报