互质与欧拉函数

互质

对于 a,bN,若 gcd(a,b)=1,则称 a,b 互质

对于三个数或者更多个数的情况则这样讨论:

  • gcd(a,b,c)=1a,b,c 互质

  • gcd(a,b)=gcd(a,c)=gcd(b,c)=1a,b,c 两两互质

显然后者是一个更强的限制条件。

欧拉函数

1N 中与 N 互质的数的个数被称为欧拉函数,记为 φ(N)

在算数基本定理中,由 n=p1c1p2c2pmcm 我们可以得到:

φ(N)=N×p11p1×p21p2××pm1pm=N×p|N,pP(11p)

Proof

容斥原理来帮忙。

pN 的质因子,1Np 的倍数有 p,2p,3p,,(Np)p,共 Np 个,同理若 q 也是 N 的质因子,则 1Nq 的倍数有 Nq 个。如果我们把 Np+Nq 个数去掉,那么 pq 的倍数被删了两次,我们需要再加上一次,因此 1N 中不与 N 含有共同质因子 p,q 的数的个数为:

NNpNq+Npq=N×(11p1q+1pq)=N(11p)(11q)

N 的全部质因子使用容斥,就可以得到 1N 中不与 N 互质的数的个数。

求单个数的欧拉函数值

我们可以从欧拉函数的计算式来看:分解质因数,就可以顺便求出欧拉函数了:

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

欧拉函数的性质

  1. n>1,i=1ni×[gcd(i,n)=1]=nφ(n)2
  • 虽然我觉得没有人会和我一样傻但是还是要说一下,注意到 nφ(n)2=n2φ(n)=nφ(n)2 😃
  1. ab,则 φ(ab)=φ(a)φ(b)

  2. f(n) 是积性函数,且在算数基本定理中 n=i=1mpici,则 f(n)=i=1mf(pici)

  3. pn,p2n(pP),则 φ(n)=φ(np)×p

  4. pn,p2n(nP),则 φ(n)=φ(np)(p1)

  5. dnφ(d)=n

Proof

  • gcd(n,x)=gcd(n,nx) 知与 n 不互质的数 x,nx 成对出现,平均值为 n2,所以与 n 互质的数的个数也是 n2

  • 我们从欧拉函数的计算式对 a,b 进行质因数分解,就能得到性质 2、3 了,由此推出“积性函数”的概念。

  • pn,p2n,则 n,np 包含同样的质因子,只是 p 的指数不同。直接把 φ(n),φ(np) 按照计算式写出来,然后相除,商为 p,性质 4 得证。

  • pn,p2n,则 p,np 互质,我们从 φ(n) 是积性函数可以知道 φ(n)=φ(np)×φ(p),而因为 pP 显然 φ(p)=p1(在 1p 中除 gcd(p,p)=p 外,i[1,p),gcd(i,p)=1),性质 5 得证。

  • 对于性质 6,我们设 f(n)=dnφ(d),然后用乘法分配律和 φ 为积性函数展开得到:若 nm,则 f(nm)=dnmφ(d)=(dnφ(d))×(dmφ(d))=f(n)×f(m),也就是 dnφ(d) 是积性函数。对于单个质因子 f(pm)=dpmφ(d)=φ(1)+φ(p)+φ(p2)++φ(pm) 是一个等比数列求和再加 1,结果即为 pm,所以 f(n)=i=1mf(pici)=i=1mpici=n,即 dnφ(d)=n,性质六得证。

不得惊叹于一个“简单的”、用于“计数”的函数竟然有如此丰富的性质。

积性函数

在欧拉函数的性质 3 中我们使用了“积性函数”的概念,这里做正式引入:

数论函数:亦称算术函数,指定义域为正整数、值域为复数的子集的函数

对于一个数论函数 f,若 x,yN+,xy,有 f(x,y)=f(x)f(y),则称 f 是一个积性函数

对于一个数论函数 f,若 x,yN+,有 f(x,y)=f(x)f(y),则称 f 是一个完全积性函数

这三个东西显然是一个包含一个的。

从性质 3 中推广开来,不难发现任意的积性函数都可以用筛法来求。

给出一些常见的积性函数(自变量均为 n):

  1. 1 函数(完全积性):1(n)=1

  2. 幂函数(完全积性):idk(n)=nk

  3. 狄利克雷卷积单位元(完全积性):ε(n)={1,n=10,n1

  4. 因子幂和函数:σk(n)=inik

这个东西如果 k=0 时又称为 d(n) 除数函数,表示 n 的因子个数

  1. 欧拉函数:φ(n)=i=1n[gcd(i,n)=1]

  2. 莫比乌斯函数:μ(n)={0,n(1)k,n

  3. 最大公因数:gcdk(n)=gcd(n,k)

  4. r(n):以原点为圆心,半径为 n14 圆上的整点个数(不包含一侧端点)

线性筛求欧拉函数

利用线性筛的思想可以在 O(n) 的时间内快速递推出 2n 中每个数的 φ

由上述的性质 4、5,不难发现,在线性筛法中,每个合数 n 只会被它的最小质因子 p 筛一次。我们恰好可以执行:

{pn&pn2φ(n)=φ(np)×ppn&pn2φ(n)=φ(np)×(p1)

这是一份 C++ 代码:

int v[N], pri[N], phi[N];
void Euler(const int n) {
    m = 0;
    for (int i = 2; i <= n; i++) {
        if (!v[i]) { v[i] = i; pri[++m] = i; phi[i] = i - 1; }
        for (int j = 1; j <= m; j++) {
            if (pri[j] > v[i] && pri[j] > n / i)
                break;
            v[i * pri[j]] = pri[j];
            phi[i * pri[j]] = phi[i] * (i % pri[j] ? pri[j] - 1 : pri[j]);
        }
    }
}
posted @   revkiru  阅读(94)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探
· 为什么 退出登录 或 修改密码 无法使 token 失效
点击右上角即可分享
微信分享提示