What comes after, tiny fra|

落花月朦胧

园龄:3年6个月粉丝:14关注:10

研究欧拉函数有感

欧拉函数 (φ),读法为 fai(四声)。

定义

φ(n) 表示有多少个不大于 n 的正整数与 n 互质。 特别的 φ(1)=1

性质:

  1. 积性函数,及如果有 ab, 就有 φ(a×b)=φ(a)×φ(b)
    证明:
    如果有 ab,那么 ab 就没有大于 1 的公因数,于是就有这个积性函数的性质。
    也可以看下面的性质三推式子:
    a=p1k1×p2k2×pmkm, b=q1w1×q2w2×qmwu
    ab  没有任何一个 p 和任何一个 q 相同。
    φ(a×b)=i=1impi1pi×i=1iuqi1qi=φ(a)×φ(b)
  2. nP,φ(nk)=nknk1=nk×(1p1)=nk×(11p)
    证明:
    可以知道 [1,nk] 里面一共有 nk 个数。其中因为 nP,所以满足 x|n 的数是 nk 的因数,这些数为 n,n2,n3nk1×n,显然一共有 nk1 个数,减去这 nk1 个数就可以得到 φ(nk)
  3. n=p1k1×p2k2×p3k3×prkr,则有 φ(n)=n×i=1irpi1pi
    证明:
  • 容斥原理:
    假设有 n 有两个质因数 a,b,那么对于 x[1,n],有 na 个数是 a 的因数, 有 nb 个数是 b 的因数,有 na×b 个数是 a×b 的因数。显然只考虑 a,b 的因数就有 nnanb+na×b 个数与 n 互质。其中因为 a×b 的因数被算了两次,所以这里我们将其减去。对于多个质因数我们也可以这样算。同时,上面的式子还可以用十字相乘化简 n×(11a1b+1a×b)=n×(11a)×(11b)。可得上面的公式。
  • 利用性质 2:
    通过性质 1 可以知道 φ(n)=φ(p1k1)×φ(p2k2)×φ(prkr)=(p1k1×(11p1))×(p2k2×(11p2))×(prkr×(11pr))=p1k1×p2k2××prkr×(11p1)×(11p2)××(11pr)=n×i=1irpi1pi
  1. 所有不大于 n 的数中与 n 互质的数的和为 n×φ(n)2
    证明:
    gcd(n,x)=gcd(n,nx) 可知,当一个数 x 满足 gcd(n,x)=1 时,就会有一个数 nx 满足 gcd(n,nx)=1,及这些数是成对出现的,他们的平均数是 (nx+x)÷2n2,因为一共有 φ(n) 个数与 n 互质,所以他们的和就是 n×φ(n)2
  2. 欧拉反演:x|nφ(x)=n
    证明
    f(n)=x|nφ(x),则有 f 是一个积性函数。
     nm,f(n×m)=x|n×mφ(x)=x|nφ(x)×x|mφ(x)=f(n)×f(m)
    于是 f(n)=i=1irf(piki)
    先研究 lP,f(lk), 发现其中满足是 l 的因数的数有 1,l,l2,l3lkf(lk)=φ(1)+φ(l)+φ(l2)+φ(l3)+φ(lk),有性质 2 可知 f(lk)=1+ll0+l2l1++lklk1 可以发现其中的项相互抵消了,最后只剩下了 lk,即 xP, f(xk)=xk
    于是就有 f(n)=i=1irf(piki)=i=1irpiki=n。 即 x|nφ(x)=n
  3. 如果有 p 为质数, pn 并且有 p2n 于是就有 φ(p)=φ(np)×p
    证明
    可以把 n 看作 x×p2,于是 np=x×p,可以发现除了指数不一样,其他的因数都是一样的,而欧拉函数计算的表达式中只和因数 有关,而不是和指数有关,于是这里就可以得到两个式子,φ(p)=p×i=1irpi1pi,φ(np)=np×i=1irpi1pi,于是就有 φ(p)φ(np)=p,化简一下就和上面的式子一样了。
  4. 如果有 p 为质数, pn,但是有 p2n,有 φ(p)=φ(np)×(p1)
    证明
    因为有 p2n,于是就有 pnp,于是 pnp,由于 φ 是积性函数,于是就有 φ(n)=φ(np)×φ(p),又因为 p 是质数,于是 φ(p)=p1,于是既有上面的结论乐。

怎么求

首先就有一种简单的方式求单个的,对于一个数,我们将其分解质因数,带进公式里面,然后就发现做完了。

还有一种更加合理的方法可以在 O(n) 的复杂度里面解决 [1,n] 的欧拉函数,具体思想就是线性筛。

我们知道,线性筛可以得到一个数的最小质因数,然后我们就可以通过性质 6 和性质 7 对其进行递推求解,具体代码见下:

phi[1] = 1;
rep (i, 2, n) {
if (!pri[i]) {
pri[++pri[0]] = i;
phi[i] = i - 1;
}
rep (j, 1, pri[0]) {
pri[i * pri[j]] = 1;
if (i % pri[j] == 0) {
phi[i * pri[j]] = phi[i] * pri[j];
break;
}
phi[i * pri[j]] = phi[i] * (pri[j] - 1);
if (pri[j] * i > n) break;
}
}

本文作者:落花月朦胧

本文链接:https://www.cnblogs.com/falling-flowers/p/17180712.html

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   落花月朦胧  阅读(68)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
收起