• 数论数论函数基础知识


    基本符号

    1. \((a,b)=\gcd(a,b)\)
    2. \(a \bot b \Leftrightarrow (a,b)=1\)
    3. \([\mathrm{expr}]=0/1\)如果表达式为真,那么值为\(1\),否则为\(0\).

    积性函数

    基本概念:对于一个数论函数\(f(n)\),当\(n \bot m\)时,满足\(f(nm)=f(n)f(m)\),那么就称\(f(n)\)是一个积性函数。

    完全积性函数:如果\(n,m\)不互质的时候仍然满足\(f(nm)=f(n)f(m)\),那么就称\(f(n)\)是一个完全积性函数。

    完全积性函数是积性函数的一个子集

    一些基本的积性函数

    元函数(或称为单位元):\(\epsilon(n)=[n=1]\),判断\(n\)是否为\(1\)

    恒等函数:\(I(n)=1\),无论\(n\)取何值,函数值都为\(1\)

    单位函数:\(\mathrm{id}(n)=n\),等于\(n\)自身。

    欧拉函数:\(\varphi(n)=\sum\limits_{i=1}^n [i \bot n]\),\(n\)以内和\(n\)互质的数的个数。

    约数函数:\(d(n)=\sum\limits_{i=1}^n [i|n]=\sum\limits_{d|n} 1\), 其前缀和有一个\(O(\sqrt{n})\)方法求解:

    \[\sum\limits_{i=1}^n d(i)=\sum\limits_{i=1}^n\left\lfloor\frac{n}{i}\right\rfloor \]

    欧拉函数存在一些简单有用的性质:

    \[\sum\limits_{d|n}\varphi(d)=n\\ \sum\limits_{i=1}^n [i \bot n]\times i=\frac{n\times\varphi(n)}{2}\\ \varphi(nm)=\frac{\varphi(n)\varphi(m)(n,m)}{\varphi((n,m))} \]

    对于第二个性质,稍微给一个小证明:

    因为\(\gcd(x,n)=\gcd(n-x,n)\)所以\(n\)以内和\(n\)互质的数一定成对出现,并且他们的和一定为\(n\),这样的数对一定有\(\cfrac{\varphi(n)}{2}\)个,所以这些数的总和为\(\cfrac{n\times\varphi(n)}{2}\)

    莫比乌斯函数:\(\mu(i)\),它的定义和求值方式之后再说。

    狄利克雷卷积

    现在有两个数论函数\(f(n),g(n)\),他们的狄利克雷卷积表示为\((f*g)(n)\),两个积性函数的卷积一定是一个积性函数。

    \[(f*g)(n)=\sum\limits_{d|n}f(d)g\left(\frac{n}{d}\right) \]

    上面欧拉函数的其中一条性质用狄利克雷卷积表示就是\((\varphi*I)(n)=\mathrm{id}(n)\)

    逆元:如果说\((f*g)(n)=\epsilon(n)\),那么就称\(f\),\(g\)互为逆元,\(g\)可以写为\(f^{-1}\)。一个积性函数的逆元一定是一个积性函数

    单位元:\((f*\epsilon)=f\)

    结合律:\((f*g)*k=f*(g*k)\)

    莫比乌斯反演

    首先解释一下,之前说的\(\mu(n)\),其实就是\(I(n)\)的逆元。接下来我们推一下这个函数的求值方式。

    因为\(\mu(n)\)是一个积性函数,所以可以分开每个质因子进行考虑。

    对于\(\mu(p^k)\)

    \(k=0\),易得\(\mu(1)=1\),

    \(k=1\),因为\((I*\mu)(p)=0\Rightarrow I(1)\mu(p)+I(p)\mu(1)=0\Rightarrow \mu(p)=-1\)

    \(k>2\),可以得到

    \[(I*\mu)\left(p^k\right) =\sum_{d=0}^k \mu\left(p^d\right)I\left(p^{k-d}\right) =\sum_{d=0}^k \mu\left(p^d\right) \]

    可以发现,如果\(k=2\),因为\(\mu(1)=1,\mu(p)=-1\),那么\(\mu(p^2)=0\),以此类推,可以得到:

    \[\forall~~k>1, \mu(p^k)=0 \]

    接着考虑所有正整数的情况:

    \[对n进行质因数分解,得到n=\prod\limits_{i=1}^n c_i^{k_i}\\ \mu(n)=\begin{cases} 0 &存在k_i>1\\ (-1)^n &otherwise \end{cases} \]

    莫比乌斯反演,实际上是对于两个函数进行的变换:

    \[F(n)=\sum\limits_{d|n}f(d)\Leftrightarrow f(n) =\sum\limits_{d|n}\mu\left(\frac{n}{d}\right)F(d) \]

    这个实际上证明非常简单,将其转化为狄利克雷卷积的形式:

    \[\begin{aligned} &F(n)=(f*I)(n)\\ \Rightarrow& (F*\mu)(n)=(f*I*\mu)(n)\\ \Rightarrow& (F*\mu)(n)=f(n) \end{aligned} \]

    小例题(有点难度)

    解法可能和莫比乌斯没有任何关系。

    给定一个正整数\(n(n\leq 10^{14})\),计算

    \[\left(\sum\limits_{i=1}^n\sum\limits_{d|i} \gcd\left(d,\frac{i}{d}\right)\right)\mod (10^9+7) \]

    直接画柿子即可:

    \[\begin{aligned} &\sum\limits_{i=1}^n \sum\limits_{d|i} (\varphi*I)\left(\gcd\left(d,\frac{i}{d}\right)\right)\\ =&\sum\limits_{i=1}^n \sum\limits_{d|i} \sum\limits_{k|d,k|\frac{i}{d}} \varphi(k)\\ =&\sum\limits_{i=1}^n \sum\limits_{k^2|i} \varphi(k) \sum\limits_{d=1}^{\lfloor\frac{n}{i}\rfloor} 1\\ =&\sum\limits_{i=1}^n \sum\limits_{k^2|i} \varphi(k)\times \left\lfloor\frac{n}{i}\right\rfloor\\ =&\sum\limits_{k=1}^{\lfloor{\sqrt{n}}\rfloor} \varphi(k) \sum\limits_{i=1}^{\left\lfloor{\frac{n}{k^2}}\right\rfloor} \left\lfloor{\frac{n}{ik^2}}\right\rfloor \end{aligned} \]

    可以发现,前半部分可以使用前缀和进行计算,而后半部分可以使用整除分块。

    杜教筛

    现在我们需要求出一个积性函数的前缀和,
    假设为\(f(n)\)
    \(S_f(n)=\sum\limits_{i=1}^n f(i)\)。如果n较小,可以使用线性筛求出。

    但是\(n>10^7\),现在需要一种较为快速的计算方法。

    由于\(f\)是一个积性函数,可以构造两个积性函数\(g,h\),满足\((g*f)(n)=h(n)\)。而\(g,h\)都很容易求出。而\(h\)的前缀非常容易求出,而\(g(1)\)的逆元很容易求。

    \[\begin{aligned} \sum\limits_{i=1}^n h(i) &=\sum\limits_{i=1}^n \sum\limits_{d|i} f(i)\left(\frac{d}{i}\right)\\ &=\sum\limits_{d=1}^n g(d) \sum\limits_{i=1}^{\left\lfloor\frac{i}{d}\right\rfloor} f(i)\\ &=\sum\limits_{d=1}^n g(d) S_f\left(\left\lfloor{\frac{n}{d}}\right\rfloor\right)\\ &= g(1)S(n) + \sum\limits_{d=2}^n g(d) S_f\left(\left\lfloor{\frac{n}{d}}\right\rfloor\right)\\ g(1)S(n) &= \sum\limits_{i=1}^n h(i) - \sum\limits_{d=2}^n g(d) S_f\left(\left\lfloor{\frac{n}{d}}\right\rfloor\right) \end{aligned} \]

    在实际实现的时候,在复杂度允许的情况下,用线性筛先将\(n\)较小的前缀和求出,在调用函数的时候,用一个unordered_map保存前缀和,就能加快运算。

    构造例子

    Example 1:\(f\rightarrow \mu\), 可以考虑构造\(g\rightarrow I, h\rightarrow \epsilon\)

    Example 2:\(f\rightarrow \varphi\), 考虑式子\((\varphi*I)=\mathrm{id}\),构造\(g\rightarrow I,h\rightarrow \mathrm{id}\)

    Example 3:\(f\rightarrow \mathrm{id}\times\mu\), 可以考虑构造\(g\rightarrow \mathrm{id}\),那么

    \[\begin{aligned} (g*f)(n) &=\sum\limits_{d|n} g\left(\frac{n}{d}\right)f(d)\\ &=\sum\limits_{d|n} \frac{n}{d} \times \mu(d) \times d\\ &= n\sum\limits_{d|n} \mu(d)\\ &= n[n=1]\\ &= \epsilon(n) \end{aligned} \]

    所以\(h\)函数就是\(\epsilon\)

    Example 4:\(f\rightarrow \mathrm{id}^2 \times \varphi\)
    构造\(g(n)=\mathrm{id}(n)^2\), 那么可以得到:

    \[\begin{aligned} (f*g)(n) &=\sum\limits_{d|n} g\left(\frac{n}{d}\right)f(d)\\ &=\sum\limits_{d|n} \left(\frac{n}{d}\right)^2 \times d^2 \times \varphi(d)\\ &=n^2 \sum\limits_{d|n}\varphi(d)\\ &=n^3 \end{aligned} \]

    所以\(h\)函数就是\(\mathrm{id}^3\)

    附录:积性函数的线性筛法

    \(\varphi\)为例:

    void init() {
      phi[1] = 1;
      for (int i = 2; i < MAXN; ++i) {
        if (!vis[i]) {
        	//i是一个质数
          phi[i] = i - 1;
          pri[cnt++] = i;
        }
        for (int j = 0; j < cnt; ++j) {
          if (1ll * i * pri[j] >= MAXN) break;
          vis[i * pri[j]] = 1;
          if (i % pri[j]) {
            phi[i * pri[j]] = phi[i] * (pri[j] - 1);
          } else {
            phi[i * pri[j]] = phi[i] * pri[j];
            break;
          }
        }
      }
    }
    
  • 相关阅读:
    自然语言交流系统 phxnet团队 创新实训 项目博客 (十一)
    install ubuntu on Android mobile phone
    Mac OS, Mac OSX 与Darwin
    About darwin OS
    自然语言交流系统 phxnet团队 创新实训 项目博客 (十)
    Linux下编译安装qemu和libvirt
    libvirt(virsh命令总结)
    深入浅出 kvm qemu libvirt
    自然语言交流系统 phxnet团队 创新实训 项目博客 (九)
    自然语言交流系统 phxnet团队 创新实训 项目博客 (八)
  • 原文地址:https://www.cnblogs.com/juruohjr/p/15699609.html
Copyright © 2020-2023  润新知