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

一些 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,等价于 dn 的因数。dn 表示 d 不能整除 n,等价于 d 不是 n 的因数。
  2. i=1n=ai 是求和符号,表示所有 ai 的和。
  3. i=1nai 是求积符号,表示所有 ai 的积。
  4. [A] 表示当 A 成立时 [A]=1,否则 [A]=0,比如 [5=1]=0,[6=6]=1

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

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

2. 前置定理

简单定理:

  • gcd(a+mb,b)=gcd(a,b)
  • gcd(a,b)=dgcd(ad,bd)=1
  • 一些别的定理(比如辗转相除法之类的)

两个关键定义:

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

f(a×b)=f(a)×f(b),gcd(a,b)=1

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

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

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

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

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

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

3. 定义

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

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

更加严谨的,有:φ(n)=i=1n[gcd(i,n)=1]

这就是欧拉函数。

4. 性质

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

欧拉函数的基本性质:

  • 基本性质 1:若 p 为质数,那么 φ(p)=p1。特别的,φ(1)=1
  • 基本性质 2:设 n=pkp 为质数,那么:

    φ(n)=nnk=npk1=pk1×(p1)=pk1×φ(p)

    其中 φ(pk)=pkpk1=pk1×(p1) 用的会比较多。
  • 基本性质 3:欧拉函数是积性函数。
  • 基本性质 4:对于数 n,将其质因数分解为 i=1kpiri,那么:

    φ(n)=i=1kφ(piri)=i=1k(piri1×(pi1))=n×i=1k(11pi)

接下来一条一条证明。


基本性质 1:

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


基本性质 2:

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

那么考虑正难则反,也就是:φ(n)=ni=1n[gcd(i,n)1]

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

而要使 in 不互质,考虑到 p 是质数,那么必然有 ip 不互质。

那么 [1,n] 范围内有几个数与 p 不互质呢?np 个。

于是又因为 n=pk,且 φ(p)=p1,那么:

φ(n)=nnk=npk1=pk1×(p1)=pk1×φ(p)


基本性质 3:

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

那么要证明的就是 φ(n)=φ(a)×φ(b)

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

12a1aa+1a+22a12a(b1)×a+1(b1)×a+2b×a1b×a

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

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

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

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

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

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

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

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


基本性质 4:

考虑到欧拉函数为积性函数且 i,j[1,k],gcd(piri,pjrj)=1,那么有:φ(n)=i=1kφ(piri)

记得基本性质 2 的连等式吗?通过第三个式子可以得到:φ(n)=i=1k(piri1×(pi1))

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

φ(n)=i=1k(piri×(11pi))=i=1kpiri×i=1k(11pi)=n×i=1k(11pi)

证毕。

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


欧拉函数的扩展性质:

  • 扩展性质 1:设 n=a×b,gcd(a,b)=dN+,那么 φ(n)=φ(a)×φ(b)×dφ(d)
  • 扩展性质 2:nN+,n=d|nφ(d)
  • 扩展性质 3:设 nN+,p 为质数,那么:

    φ(n×p)={φ(n)×φ(p)pnφ(n)×ppn

  • 扩展性质 4:对于一个数 nn2),所有小于 n 且与 n 互质的数的和为 φ(n)×n2

接下来一条一条证明。


扩展性质 1:

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

a=i=1mpir1i,b=i=1mpir2i,d=i=1mpimin(r1i,r2i),n=i=1mpir1i+r2i

然后根据基本性质 4:

φ(a)=i=1mφ(pir1i),φ(b)=i=1mφ(pir2i)

φ(d)=i=1mφ(pimin(r1i,r2i)),φ(n)=i=1mφ(pir1i+r2i)

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

i=1mφ(pir1i+r2i)=i=1mφ(pir1i)×i=1mφ(pir2i)×i=1mpimin(r1i,r2i)i=1mφ(pimin(r1i,r2i))

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

左边:i=1m(pir1i+r2i1×(pi1))

右边:

i=1m(pir1i1×(pi1))×i=1m(pir2i1×(pi1))×i=1mpimin(r1i,r2i)i=1m(pimin(r1i,r2i)1×pi1)

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

i=1mpir1i+r2i1=i=1mpir1i+r2i2×i=1mpimin(r1i,r2i)pimin(r1i,r2i)1=i=1mpir1i+r2i1

证毕。


扩展性质 2:

法一:

首先众所周知,这个等式对于任意 nN+ 恒成立:n=i=1n1

但是这玩意有什么用呢?

我们对这个式子做一个变形:n=d=1ni=1n[gcd(n,i)=d]

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

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

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

于是对这个式子再做一个变形:n=dni=1n[gcd(n,i)=d]

根据最大公约数的这个性质:gcd(a,b)=dgcd(ad,bd)=1(注意前提:dadb),再做一次转化:

n=dni=1n([gcd(nd,id)=1]×[di])

然后看一下这个:i=1n([gcd(nd,id)=1]×[di])

这个式子中的 i[1,nd]

然后您会发现这实际上就是在判断 [1,nd] 中有几个数与 nd 互质。

这不就是 φ(nd) 吗?

于是等式变为 n=dnφ(nd)=dnφ(d)

证毕。

法二:

设函数 f(n)=dnφ(d),要证明的就是 f(n)=n

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

n,mgcd(n,m)=1,有:

f(n)×f(m)=inφ(i)jmφ(j)(定义暴力拆式子)

=injmφ(i)×φ(j)(交换求和号)

=injmφ(i×j)

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

=i×jn×mφ(i×j)=f(nm)

现在 f(n) 是积性函数证完了,然后将 n 质因数分解为 i=1mpiki,于是我们有 f(n)=i=1mf(piki),现在要证明的就是 f(piki)=piki

继续拆式子:f(piki)=φ(1)+φ(p)+...+φ(piki)(定义拆式子)

=(10)+(p1)+(p2p)+...+(pikipiki1)(利用基本性质二 φ(piki)=pikipiki1

=piki(消去同类项)

于是 f(piki)=piki,证毕,那么也就证出了 f(n)=n

证毕。

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


扩展性质 3:

首先考虑 pn 的情况。

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

接下来考虑 pn 的情况。

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

因此 φ(n×p)=i=1n×p[gcd(i,n)=1]

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

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

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

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

因此 φ(n×p)=φ(n)×p

证毕。


扩展性质 4:

先看两个引理:

  • 引理 1:若 gcd(i,n)=1,则 gcd(ni,n)=1
  • 引理 2:对于 n3φ(n) 为偶数。

引理证明如下:

  • 引理 1:考虑反证法。
    gcd(ni,n)=k1,不妨令 n=a×k,ni=b×k,a,bZ,a>b,那么 i=ni=(ab)×k,则有 gcd(i,n)=k1,与条件 gcd(i,n)=1 不符,因此原假设不成立,则原命题成立。
  • 引理 2:令 n=i=1,mpiki,则 φ(n)=i=1m(pi1)×piki1
    考虑单独提出 (pi1)×piki1,若 pi 为偶数则该式为偶数,若 pi 为奇数则 pi1 为偶数,则该式依然是偶数,所以该式无论怎么样都是偶数。
    由于一个式子是偶数,那么这些式子乘起来也当然是偶数。

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

接下来分类讨论一波:

  • 如果 n=2,手算就可以得到答案是 1,就是 φ(2)×22
  • 如果 n>2,根据引理 2,我们可以得知这样的 (i,ni) 类的数对有 φ(n)2,乘起来得到答案是 φ(n)×n2

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


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

5. 求法

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

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

根据 φ(n)=i=1k(piri1×(pi1)),对 n 做一个质因数分解,然后套公式就可以求了。

复杂度 O(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 求欧拉函数需要用到线性筛。

先把上面这个式子搬过来:φ(n×p)={φ(n)×φ(p)pnφ(n)×ppn

考虑在筛质数的时候,假设当前已经筛出了 cnt 个质数,那么对于当前数 i,在做 O(n) 的线性筛的时候,假设当前枚举到第 j 个质数 pj,那么如果 imodpj=0,那么就有 φ(i×pj)=φ(i)×pj,否则就有 φ(i×pj)=φ(i)×(pj1)

因为 pj 是个质数,所以 φ(pj)=pj1

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

代码:

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 为质数,那么 φ(p)=p1。特别的,φ(1)=1
  • 基本性质 2:设 n=pkp 为质数,那么:

    φ(n)=nnk=npk1=pk1×(p1)=pk1×φ(p)

    其中 φ(pk)=pkpk1=pk1×(p1) 用的会比较多。
  • 基本性质 3:欧拉函数是积性函数。
  • 基本性质 4:对于数 n,将其质因数分解为 i=1kpiri,那么:

    φ(n)=i=1kφ(piri)=i=1k(piri1×(pi1))=n×i=1k(11pi)

  • 扩展性质 1:设 n=a×b,gcd(a,b)=dN+,那么 φ(n)=φ(a)×φ(b)×dφ(d)
  • 扩展性质 2:nN+,n=d|nφ(d)
  • 扩展性质 3:设 nN+,p 为质数,那么:

    φ(n×p)={φ(n)×φ(p)pnφ(n)×ppn

  • 扩展性质 4:对于一个数 nn2),所有小于 n 且与 n 互质的数的和为 φ(n)×n2

欧拉函数的求法如下:

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

练习:

  1. 独立写出 8 个性质及其证明过程。
  2. 独立写出 2 种求欧拉函数的代码。
posted @   Plozia  阅读(1708)  评论(2编辑  收藏  举报
相关博文:
阅读排行:
· 在鹅厂做java开发是什么体验
· 百万级群聊的设计实践
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
· 永远不要相信用户的输入:从 SQL 注入攻防看输入验证的重要性
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
点击右上角即可分享
微信分享提示