@总结 - 9@ 那些繁琐零碎却又不得不记住的数学


@0 - 引言@

我发现学习数学要记住的东西实在太多了。。。
所以专门开一个 blog 来整理收集一下。
该篇博客应该会时刻保持 update。

如果是太过简单的东西就不予证明了。

@1 - 欧几里得算法@

@1.1 - 欧几里得算法@

作用:用于求解两个整数的最大公因数。

从最基础的开始吧。
这个算法又被叫作“辗转相除法”,非常生动形象地表现了这个算法的流程。

只需要一句话就可以描述:

\[gcd(a, b) = gcd(b, a \mod b) \]

时间复杂度初步估计为 O(log n)。据说斐波拉契数列可以卡到 gcd 的最大时间。

@1.2 - 扩展欧几里得算法@

作用:用于求解模线性方程:kx = a (mod m)。

现在,我们来看一个比较难(?)的算法吧。
稍微变化一下就可以等价的变为 kx + my = a。

显然 gcd(k, m) 如果不是 a 的因数,则无解。
如果我们求解 kx' + my' = gcd(k, m) ,可以得到 x = x'(a/gcd(k,m)), y = y'(a/gcd(k,m))。
我们仿照 gcd 的求法,稍微进行变换:

\[kx_0 + my_0 = gcd(k, m) = gcd(m, k \mod m) = mx_1 + (k \mod m)y_1 \]

\[kx_0 + my_0 = mx_1 + (k - m*\lfloor \frac{k}{m} \rfloor)y_1 \]

\[k(x_0 - y_1) + m(y_0 - x_1 + \lfloor \frac{k}{m} \rfloor y_1) = 0 \]

注意我们现在只需要求出一组特解,而代入 \(x_0 = y_1, y_0 = x_1 - \lfloor \frac{k}{m} \rfloor y_1\) 即可使等式成立。

该算法和欧几里得算法一样只需要 O(log n) 的时间即可得出一组特解。

令 t = gcd(k, m),则可以得到通解 x = x0 + a*m/t, y = y0 - a*k/t。
求解通解(包括下面的涉及求解通解的算法)有一个常规的方法,假设存在另一组解,寻找两组解之间的关系。

@1.3 - 类欧几里得算法@

作用:用于求解 \(\sum_{i=0}^{n}i^{k1}\times\lfloor\frac{a\times i+b}{c}\rfloor^{k2}\)

咕咕咕。update in 2020/03/10:我来填坑啦。

一份参考资料。

除了模板题,我们平常大概只需要用到 \(\sum_{i=0}^{n}\lfloor\frac{a\times i+b}{c}\rfloor\)。不过有的时候理性愉悦一下也是挺好的。

我们定义函数 func(n, a, b, c) 可以求出 k1 + k2 <= K 的所有 \(\sum_{i=0}^{n}i^{k1}\times\lfloor\frac{a\times i+b}{c}\rfloor^{k2}\) 的值。

(1)如果 \(a \geq c\)
此时有(为了方便,暂时用 % 代替取模符号):

\[\sum_{i=0}^{n}i^{k1}\times\lfloor\frac{a\times i+b}{c}\rfloor^{k2} = \sum_{i=0}^{n}i^{k1}\times(\lfloor\frac{a}{c}\rfloor\times i + \lfloor\frac{(a\%c)\times i+b}{c}\rfloor)^{k2} \]

简单二项式展开可得:

\[\sum_{i=0}^{n}i^{k1}\lfloor\frac{a\times i+b}{c}\rfloor^{k2} = \sum_{i=0}^{n}\sum_{p=0}^{k2}{k2 \choose p}\times\lfloor\frac{a}{c}\rfloor^p\times i^{k1+p}\times \lfloor\frac{(a\%c)\times i+b}{c}\rfloor^{k2-p} \]

递归到 func(n, a%c, b, c) 即可。

(2)如果 \(b \geq c\)
类似于上面的推导,我们有:

\[\sum_{i=0}^{n}i^{k1}\lfloor\frac{a\times i+b}{c}\rfloor^{k2} = \sum_{i=0}^{n}\sum_{p=0}^{k2}{k2 \choose p}\times\lfloor\frac{b}{c}\rfloor^p\times i^{k1}\times \lfloor\frac{a\times i+(b\%c)}{c}\rfloor^{k2-p} \]

递归到 func(n, a, b%c, c) 即可。

(3)如果 \(a < c\)\(b < c\)
此时记 \(m = \lfloor\frac{a\times n+b}{c}\rfloor\)

首先判断 m 是否为 0。如果 m = 0,则当 k2 ≠ 0 时答案为 0,否则答案为自然数幂和。
否则,此时肯定有 a ≠ 0。

先引入一个恒等式:\([j + 1 \leq \lfloor\frac{a\times i + b}{c}\rfloor] = 1 - [i \leq \lfloor\frac{c\times j + c - b - 1}{a}\rfloor]\)
证明需要用到两条引理:\(a\times b \leq c \Leftrightarrow a \leq \lfloor\frac{c}{b}\rfloor\)\(a\times b > c \Leftrightarrow a > \lfloor\frac{c}{b}\rfloor\)。此处不细谈。

我们可以将 \(\lfloor\frac{a\times i+b}{c}\rfloor^{k2}\) 写作 \(\sum_{j=0}^{\lfloor\frac{a\times i+b}{c}\rfloor - 1}((j + 1)^{k2} - j^{k2})\)。尝试对原式变形:

\[\sum_{i=0}^{n}i^{k1}\lfloor\frac{a\times i+b}{c}\rfloor^{k2} = \sum_{i=0}^{n}i^{k1}\sum_{j=0}^{\lfloor\frac{a\times i+b}{c}\rfloor - 1}((j + 1)^{k2} - j^{k2})\\ = \sum_{j=0}^{m - 1}((j + 1)^{k2} - j^{k2})\sum_{i=0}^{n}[j + 1 \leq \lfloor\frac{a\times i + b}{c}\rfloor]\times i^{k1}\\ = \sum_{j=0}^{m - 1}((j + 1)^{k2} - j^{k2})\sum_{i=0}^{n}(1 - [i \leq \lfloor\frac{c\times j + c - b - 1}{a}\rfloor])\times i^{k1}\\ = \sum_{j=0}^{m - 1}((j + 1)^{k2} - j^{k2})\sum_{i=0}^{n}i^{k1} - \sum_{j=0}^{m - 1}((j + 1)^{k2} - j^{k2})\sum_{i=0}^{\lfloor\frac{c\times j + c - b - 1}{a}\rfloor}i^{k1}\\ = m^{k2}\sum_{i=0}^{n}i^{k1} - \sum_{j=0}^{m - 1}\sum_{p=0}^{k2 - 1}{k2\choose p}j^p\sum_{i=0}^{\lfloor\frac{c\times j + c - b - 1}{a}\rfloor}i^{k1} \]

。。。看起来很糟但其实每一步都是很简单的变换。

注意到自然数幂和 \(\sum_{i=0}^{n}i^k\) 可以表示成 n 的 k + 1 次多项式 \(F_k(n) = \sum_{i=0}^{k+1}f_{k,i}n^i\)

\[\sum_{j=0}^{m - 1}\sum_{p=0}^{k2 - 1}{k2\choose p}j^p\sum_{i=0}^{\lfloor\frac{c\times j + c - b - 1}{a}\rfloor}i^{k1} = \sum_{p=0}^{k2 - 1}\sum_{q=0}^{k1 + 1}{k2\choose p}f_{k1, q}\sum_{j=0}^{m - 1}j^p\times\lfloor\frac{c\times j + c - b - 1}{a}\rfloor^{q} \]

因此递归到 func(n, c, c - b - 1, a) 即可。

上述过程有一个不严谨的地方,就是当 k2 = 0 时某些式子不一定成立。
不过推导结果适用于 k2 = 0 的情况就是了。

最后是时间复杂度。可以通过观察 a, c 两项发现是 (a, c) -> (a % c, c) -> (c, a % c) 的过程,因此递归次数和 gcd 一样(也就只有这一点和 gcd 一样。。。)
然后算上 K 的话一次复杂度为 O(K^4*log)。

建议一看的模板题。

@2 - 逆元@

作用:实现模意义下的除法。

比较简单的一个东西,大概主要是为后面作铺垫。
可以发现模意义下是不可以直接除的,但是我们可以通过两边同时乘以 a 的逆元来间接实现除法。
比如 \(ab = c\),两边同时乘 \(a\) 的逆元 \(a^{-1}\) 可以得到 \(b = c*a^{-1}\)

可以发现逆元是满足 \(ax = 1\) 的解,所以直接扩欧即可。
另外,根据我们即将要讲的费马小定理/欧拉定理 \(a^{\phi(m)} = 1\mod m\),就可以得到 \(a^{phi(m)-1} = 1\mod m\)

预处理多个数的逆元还有着均摊 O(1) 的算法,也有两种方法:
一种是处理 1~n 的逆元,可以采用以下方法推导:

\[令 m = \lfloor\frac{m}{p}\rfloor*p + m\mod p = k*p + r \]

\[k*p + r = 0 \mod m \]

\[r = -k*p -> p^{-1} = -k*r^{-1} \]

因为 r 始终小于 p,所以就可以递推求出 p 的逆元。初始条件 1 的逆元为 1。

还有一种适用于求解任意 n 个数的逆元的方法。
我们先求出 n 个数的前缀积,记为 S[i],然后我们通过扩欧或者其他什么的求解出 S[n] 的逆元。
因为 \(S[i]*A[i+1] = S[i+1]\),所以 \(\frac{A[i+1]}{S[i+1]} = \frac{1}{S[i]}\),即我们可以线性递推出所有前缀积的逆元。
又因为 \(\frac{S[i]}{S[i+1]} = \frac{1}{A[i+1]}\) 所以又可以求解出所有数的逆元。

@3 - 中国剩余定理@

@3.1 - 中国剩余定理@

作用:求解模数互质情况下的模线性方程组。

我们通过扩欧算法解决了模线性方程,而通过这个算法我们就可以解决模线性方程组。

已知 \(x = a_0 \mod m_0, x = a_1 \mod m_1, ..., x = a_n (mod m_n)\)
如果 mi 之间两两互质,则可以仿照拉格朗日插值的方法得到 x 的解。

\(M = m_0*m_1*...*m_n\),再记 \(inv(a, m)\) 表示模 m 意义下 a 的逆元,则:

\[x = \sum_{i=0}^{n}a_i*\frac{M}{m_i}*inv(\frac{M}{m_i}, m_i) \mod M \]

只需要证明这是一组特解与通解也具有这种形式即可。

@3.2 - 扩展中国剩余定理@

作用:求解任意模数的模线性方程组。

这个时候就不能用插值的思想来做了。
为简化问题,我们不妨先只考虑两个方程组成的方程组,记这两个方程为 x = a0 mod m0, x = a1 mod m1。

首先我们将其等价地写为 x = m0*p + a0, x = m1*q + a1。
于是我们就有 x = m0*p + a0 = m1*q + a1,稍微变形可以得到扩欧的基本形式之一 m0*p - m1*q = (a1 - a0)。
通过上面的理论,该方程可以解得 p = b0 + k0*t, q = b1 + k1*t。
将 p 代入最开始的式子,可以得到 x = m0*(b0 + k0*t) + a0 = m0*b0 + a0 + m0*k0*t。
于是就有 x = m0*b0 + a0 mod m0*k0。

根据如上的推导,我们可以每次将两个方程合并,直到只剩下一个方程为止。
注意这中间的扩欧可能是会无解的,此时整个方程组也无解。

@4 - 欧拉定理@

@4.1 - 费马小定理@

作用:在模数是质数的情况下,用于指数的取模、求解逆元。

定理的描述只有一个公式:

\[a^{p-1} = 1 \mod p \]

其中 p 是质数。使用条件只需要 a 不是 p 的倍数即可。
稍微变化一下就可以得到 a 的逆元 \(a^{p-2} = a^{-1} \mod p\)
一般情况下写费马小定理比写扩欧要快得多,而且快速幂本身作为一个基础功能也可以用于其他地方。

指数取模的意思是 \(a^b = a^{b\mod p-1} \mod p\),至于正确性是很显然的。

证明需要用到剩余系什么的,因为过于数论所以就暂且不提。

@4.2 - 欧拉定理@

作用:在模数与底数互质的情况下,用于指数的取模、求解逆元。

定理的描述一样只有一个公式:

\[a^{\phi(m)-1} = 1 \mod m \]

适用条件是 gcd(a, m) = 1。可以发现这也是扩欧有解的条件。
取 m 为质数,则 \(\phi(m) = m - 1\)。于是费马小定理就是欧拉定理的一个特例。
但是因为欧拉函数 \(\phi\) 并不好求,所以一般实用性不如费马小定理。

证明一样要用什么既约剩余系,太过于数论所以暂且不提。

@4.3 - 扩展欧拉定理@

作用:用于指数的取模。

这个定理相比上述两条不需要任何的适用条件,具有普适性。描述如下:

\[a^{p} = a^{phi(m) + p\mod phi(m)}\mod m \]

证明提及一下简要的过程。首先我们从 m 中提取某个质因子 p,使得 m = s*p^r(其中 s 与 p 互质)。然后:

\[p^{\phi(s)} = 1 \mod s \]

\[p^{\phi(m)} = 1 \mod s(由积性函数的性质) \]

\[p^{k*\phi(m)} = 1 \mod s \]

\[p^{k*\phi(m) + r} = p^r \mod s*p^r = p^r \mod m \]

将 a 也拆成质因子相乘的形式,如果 a 的某个质因子 m 不含有就套用欧拉定理,否则如上所示。

@5 - 离散对数@

@5.1 - 原根@

作用:理论依据。

阶是满足 \(a^p = 1\mod m\) 的最小正整数 p(显然要求 gcd(a, m) = 1)。
我们需要的有关阶的性质一般只用得着 \(p|\phi(m)\) 这一个。

模 m 意义下的原根 g 的阶为 \(phi(m)\)。或者说,对于 0 < i <= phi(m) 满足 g^i 的值互不相同。
怎么检验一个原根呢?貌似按照定义需要检验 1~phi(m) 的所有数作为幂。
但是我们有阶一定是 \(\phi(m)\) 的因数。考虑进行唯一分解: \(\phi(m) = p_0^{a_0}*p_1^{a_1}*...\)
于是如果 x 的阶不为 \(phi(m)\),则存在一个 i 使得 \(x^{\frac{\phi(m)}{p_i}} = 1 \mod m\)
然后就可以比较快地检验原根。至于寻找原根可以采用枚举 + 检验的方法。

原根还有一些其他性质,比如当模数为 2, 4, p^a, 2*p^a 时才有原根,以及原根个数为 \(\phi(\phi(m))\) 个。

通过原根 g 可以将所有数表示为 g^p 的形式,实现在模意义下的“对数”。也即是 离散对数 或 指标。
于是就可以将乘法转为加法,将模型进行转化(比如将下标作乘法的卷积变为下标作加法的卷积然后 fft)。

@5.2 - BSGS(大步小步法)@

作用:在模数为质数的要求下求解离散对数 a^x = b mod p。

刚刚我们介绍了原根,但是即使使用原根也没有什么高效的算法。事实上,这个问题也没什么高效的解法(比如线性或对数时间复杂度)
不过我们可以写一个勉强可以接受的时间复杂度:\(O(\sqrt{p})\)
看到这个时间复杂度想必大家都知道应该怎么做了:分块。

我们令 \(c = \sqrt{p}, x = kc - b(1 \le b \le c, k \ge 1)\)(注意这里是减法,因为用减法下面的推导更为方便)(还要注意两个参数的取值范围,只有这样才能全覆盖)。
则可以得到 \(A^{kc-b} = B\mod p\),稍作变换可得 \(A^{kc} = B*A^{b}\mod p\)
注意等式左边与右边分别只有根号种取值。我们将右边的所有可能值预处理出来存入 hash 中,然后再枚举左边并在 hash 中寻找。

暴力而优雅的分块。

@5.3 - exBSGS(扩展大步小步法)@

作用:任意模数下求解离散对数 a^x = b mod p。

事实上不带扩展的版本可以解决 gcd(a, p) = 1 的情况。
主要的问题是当 gcd(a, p) ≠ 1 时,a 的逆元不一定存在。

令 t = gcd(a, p),我们尝试在等式两边及模数同时除以 t,得到 \(\frac{a}{t}*a^{x-1} = \frac{b}{t} \mod \frac{p}{t}\)
此时因为 a/t 与 p/t 互质,所以有 \(a^{x-1} = \frac{b}{t}*(\frac{a}{t})^{-1}\mod \frac{p}{t}\)
于是就可以这样迭代到 a 与新的模数 p' 互质然后使用 BSGS 即可。

然而这个过程有两个问题:
一是,当 t 不能整除 b 时会出现问题;二是,a 上的指数在不断减,如果真正的解小于迭代次数(比如 x = 0)会出问题。

当 b = 1 时,其实存在解 x = 0。当 b 不为 1 也不为 t 的倍数时,无解。因此我们解决了第一个问题。
我们通过特判 b = 1,就可以避免我们的第二个问题:因为所有可能的解要么在最后的 BSGS 中求解出来,要么在特判时求解出来。

实现中可以不用真的去求 \(\frac{a}{t}\) 的逆元,用一些等价的方法判断即可。

@6 - 高次剩余@

这个我会的也不是很多。。。数论学得不太好。。。

@6.1 - 利用离散对数@

作用:有原根的情况下求解高次剩余 x^a = n mod p。

将 x 和 b 都表示为原根的幂,得到:

\[g^{y*a} = g^{k}\mod p \]

根据上面的什么欧拉定理就可以指数取模,然后得到一个模线性方程,然后 exgcd 即可。

@6.2 - 二次剩余@

作用:模数为素数的情况下求解二次剩余 x^2 = n mod p。

首先素数分 2 和奇素数。2 不必多说,我们接下来只考虑奇素数。

先来看看怎么判断一个数 k 是否为二次剩余。由费马小定理我们有 \(k^{p-1}=1\mod p\),于是就有 \(k^{\frac{p-1}{2}} = 1或-1\mod p\)
假设 k 有二次剩余 x,则有 \(k^{\frac{p-1}{2}} = x^{p-1} = 1\mod p\)
假设 \(k^{\frac{p-1}{2}} = 1\mod p\),用原根表示 k 得到 \(g^{{\frac{p-1}{2}}*a} = 1 = g^{p-1} \mod p\),所以 a 为偶数,所以 \(g^{\frac{a}{2}}\) 是 k 的二次剩余。
我们就得到了 k 是二次剩余的充要条件。这个好像叫作欧拉准则。

随机一个 a,取 w = a^2 - n。我们要随机出一个合适的 a 使得 w 为非二次剩余。
因为二次剩余与非二次剩余的数量相同,所以期望 2 次就可以找到这样一个 a。
然后求 \((a+\sqrt{w})^{\frac{p+1}{2}}\) 就可以得到 n 的二次剩余。
这里的 \(a+\sqrt{w}\) 可以类比复数中的 \(i=\sqrt{-1}\) 来理解。

为什么?首先我们证明 \((a+\sqrt{w})^{p+1} = n\)
因为 \((a+\sqrt{w})^p = a^p + \sqrt{w}^p + \sum_{i=1}^{p-1}C_p^ia^i*\sqrt{w}^{p-i}\),又因为 \(C_p^i\) 一定是 p 的倍数(因为 p 是素数),所以就可以得到 \((a+\sqrt{w})^p = a^p + \sqrt{w}^p\)
由于 w 是非二次剩余,所以就有 \(w^{\frac{p-1}{2}} = \sqrt{w}^{p-1} = -1\)。又因费马小定理可得 \(a^p = a\),所以原式变为 \(a - \sqrt{w}\)
所以 \((a+\sqrt{w})^{p+1} = (a+\sqrt{w})(a - \sqrt{w}) = a^2 - w = n\)

再证明 \((a+\sqrt{w})^{\frac{p+1}{2}}\)\(\sqrt{w}\) 的系数为 0。
\((a+\sqrt{w})^{\frac{p+1}{2}} = u + v*\sqrt{w}\),所以有 \((u + v*\sqrt{w})^2 = u^2 + v^2*w + 2*u*v*\sqrt{w} = n\)
所以 u = 0 或 v = 0 成立。我们反证,不妨假设 u = 0 而 v ≠ 0,则 \(v^2*w = n\)
左边不是二次剩余,而右边是二次剩余,矛盾。

一个 O(log n) 的算法,但是非常具有构造性。。。

@7 - 数论函数相关@

@7.1 - 数论函数@

定义域为正整数,值域为复数(不过一般来说我们用的函数值域也是正整数)的函数称为数论函数

数论函数中有一类很特殊的类型,叫做积性函数:
若 f(x) 满足若 a, b 互质,有 f(ab) = f(a)*f(b),则称 f(x) 为积性函数。
积性函数有一个很重要的性质:假如将 x 唯一因数分解得到 x = p1a1*p2a2*...*pk^ak,则积性函数 f(x) = f(p1a1)*f(p2a2)*...*f(pk^ak)。

常见的积性函数有如下几个:
\(\phi(n)\) - 欧拉函数:n 以内的与 n 互质的数。
\(\mu(n)\) - 莫比乌斯函数:n 中如果有平方因子则为 0;否则假如 n 中有偶数个质因子则为 1,有奇数个质因子则为 -1。
\(d(n)\) - 因子个数函数:n 的因子个数。
\(\sigma(n)\) - 因子和函数:n 的因子之和。

积性函数中有一类很特殊的类型,叫做完全积性函数:
若 f(x) 满足对于任意 a, b,有 f(ab) = f(a)*f(b),则称 f(x) 为完全积性函数。
完全积性函数有一个很重要的性质:假如将 x 唯一因数分解得到 x = p1a1*p2a2*...*pk^ak,则完全积性函数 f(x) = f(p1)a1*f(p2)a2*...*f(pk)^ak。

常见的完全积性函数有如下几个:
\(I(n)\) - 恒等函数:始终为 1。
\(id(n)\) - 单位函数:始终为 n。
\(e(n)\) - 元函数:等于 [n = 1](即 n = 1 时为 1,否则为 0)。

@7.2 - 狄利克雷卷积@

事实上,狄利克雷卷积与数论函数是密不可分的。

简单来说,狄利克雷卷积是定义在数论函数上的卷积,是数论函数特有的运算。
它的定义如下:

\[(f*g)(n) = \sum_{d|n}f(d)·g(\frac nd) \]

与一般的卷积类似,狄利克雷卷积满足交换律与结合律。
且狄利克雷卷积存在单位元,即 e(x)。

积性函数的狄利克雷卷积依然是积性函数,这个性质在我们遇到某些陌生的函数时可以通过线性筛解决。

常见的一些狄利克雷卷积结果:
(1)\(\mu*I = e\),可以通过组合数恒等式得到。
(2)\(\phi*I = id\),构造集合 S1 = {1/n, 2/n, ... n/n},再构造 S2 为 S1 中各分数化为既约分数,即可通过 |S1| = |S2| 证明。
(3)\(\mu*id = \phi\),这个可以根据(1)(2)合在一起得到。
(4)\(I*I = d\)\(I*d = \sigma\),根据定义可轻易得证。
(5)\(\mu*d = I\)\(\mu*\sigma = d\),其实与 (4) 等价。

还有一个与 \(\phi\) 相关的常用性质因为我实在不知道放哪里所以就放在这里好了
与 n 互质的数之和 \(S = \frac{n*\phi(n)+[n=1]}{2}\)。因为若 gcd(n, i) = 1,则 gcd(n, n - i) = 1。

update 2020/09/09:数论函数还可以通过狄利克雷级数(类似于数论中的生成函数)\(F(s)=\sum_{n=1} f_n n^{-s}\) 来理解。

比如:\(\zeta(s) = \sum_{n=1} n^{-s}\),为 \(I\) 的狄利克雷级数;\(\zeta(s-k) = \sum n^{-s+k} = \sum n^k\times n^{-s}\),为 \(id^k\) 的狄利克雷级数。

两个狄利克雷级数相乘 \(F(s)\times G(s)\) 即对应数论函数的狄利克雷卷积,由此也可以得到 \(\frac{1}{\zeta(s)}=\sum \mu(n)\times n^{-s}\)\(\frac{\zeta(s-1)}{\zeta(s)}=\sum \phi(n)\times n^{-s}\)

狄利克雷级数给出了数论函数的一种封闭形式。对于积性函数,我们还可以定义其贝尔级数 \(f_p(z) = \sum f(p^i)z^i\),其中 \(p\) 是个质数,这给出了另一种封闭形式。

比如:\(I_p(z)=\frac{1}{1-z}\)\(\mu_p(z) = 1 - z\)\(\phi_p(z)=\frac{1-z}{1-pz}\)。那么该级数相乘也对应了狄利克雷卷积(其实我也是今天才知道)

@7.3 - 莫比乌斯反演@

事实上,我们一般所说的莫比乌斯反演有两种形式:

形式 1:已知 \(g(n)=\sum_{d|n}f(d)\),则 \(f(n)=\sum_{d|n}\mu(d)g(\frac{n}{d})\)
形式 2:已知 \(g(n)=\sum_{n|d}f(d)\),则 \(f(n)=\sum_{n|d}\mu(d)g(\frac{n}{d})\)

由狄利克雷卷积很容易理解形式 1。
但是从偏序关系的角度来讲,其实两者是等价的——仅仅只是调换偏序关系的两边而已。
当然你从容斥的角度也可以理解。

一般来说,我们用莫比乌斯反演主要是两种情况:
一种根据定义,题目给出的函数真的长得就是一副可以反演的函数。
另一种是含 gcd(i, j) 的式子,我们可以令 gcd(i, j) = x,将和式乘上 [gcd(i, j) = x]。然后将 [gcd(i, j) = x] 直接反演成 [gcd(i, j)|x]。
对于第二种,举个小例子。

当然也不要见到什么含有 gcd 的数论题就开始莫比乌斯反演,举个例子:
\(\sum_{i=1}^{n}\sum_{j=1}^{n} gcd(i, j)\)。此时就可以先枚举 gcd(i, j) 的取值 x,然后就是求 1~n/x 之中的互质对数。
然后相当于求 \(2*\sum_{i=1}^{n/x}\sum_{j=1}^{i}[gcd(i, j) = 1] - 1\),其实就是欧拉函数的定义 \(2*\sum_{i=1}^{n/x}\phi(i) - 1\)

@8 - 各类筛法@

可以看这一篇博客查看更多详情。

@9 - 大数素性测试与因数分解@

详情可以点击这篇博客。

@10 - 组合数取模@

@10.1 - lucas 定理@

作用:模数 p 为素数的情况下求解组合数取模 C(n, m) mod p。

假如我们要求一个组合数取模的结果 \(C_{n}^{m} \mod p\),其中 p 是一个质数。
lucas 定理表明了以下关系的存在:

\[C_{n}^{m} = C_{n/p}^{m/p}*C_{n\%p}^{m\%p} \mod p \]

其中证明。。。百度百科里面提到了一个构造性的证明,但为了与下面的扩展 lucas 定理统一,我们采用另一个证明。
首先有:

\[C_{n}^{m} = \frac{n!}{m!*(n-m)!} = \frac{1*2*...*n}{1*2*...*m*1*2*...*(n-m)} \]

为了得到它取模的结果,我们需要讨论分子分母中质数因子 p 的出现。
我们提取出分子分母 p 的倍数,得到:

\[C_{n}^{m} = \frac{((p-1)!)^{\frac{n}{p}}*p^{\frac{n}{p}}*(\frac{n}{p})!*(n\%p)!}{((p-1)!)^{\frac{m}{p}}*p^{\frac{m}{p}}*(\frac{m}{p})!*(m\%p)!*((p-1)!)^{\frac{n-m}{p}}*p^{\frac{n-m}{p}}*(\frac{n-m}{p})!*((n-m)\%p)!} \]

(不要怕,这个公式只是看起来长而已。。。)
其中表达式中的除法表示向下取整。

可以发现,只有当 \(\lfloor\frac{n-m}{p}\rfloor + \lfloor\frac{m}{p}\rfloor = \lfloor\frac{n}{p}\rfloor\),这个式子在模 p 的意义下才有意义。
我们可以把阶乘组合一下得到组合数,此时原式就可以变为:

\[C_{n}^{m} = \frac{(\frac{n}{p})!*(n\%p)!}{(\frac{m}{p})!*(m\%p)!*(\frac{n-m}{p})!*((n-m)\%p)!} = C_{n/p}^{m/p}*C_{n\%p}^{m\%p} \]

于是可以通过预处理 < p 的阶乘,在 O(log) 的时间内解决组合数取模问题。

@10.2 - 扩展 lucas 定理@

作用:模数 p 为任意数的情况下求解组合数取模 C(n, m) mod p。
懒得再写一遍,大家直接打开这篇博客看吧。

@11 - burnside 引理@

终于从数论中脱离出来了。。。
你可以在这篇博客里找到详情。

@12 - 整数拆分@

作用:求将 n 拆分成若干个正整数之和的方案数(无顺序、可重复)

写出正整数拆分的生成函数:

\[F(x) = \prod_{i=1}(x^{0\times i} + x^{1\times i} + x^{2\times i} + \dots)\\ = \prod_{i=1}\frac{1}{1 - x^i} \]

考虑函数 \(\Phi(x) = \prod_{i=1}(1 - x^i)\)(没错又是个欧拉函数)。它的组合意义为 “将 n 拆分成偶数个不同的正整数方案数” - “将 n 拆分成奇数个不同的正整数方案数”。

数形结合,我们使用 ferrers 图像描述整数拆分(可左转百科)。不过因为要求拆分成不同的正整数,所以每一行必须严格短于上一行。

举一个例子:
o o o o o o
o o o o o
o o o

我们记 p 为最靠右一条对角线上元素数量(上例中为 2),q 为最后一行元素数量(上例中为 3)。
定义一个变换:当 p < q 时,将最靠右的对角线挪到最后一行下方;当 p >= q 时,将最后一行挪到最右边作为新的对角线。
举两个变换的例子:

变换前
o o o o o x
o o o o x
o o o
变换后
o o o o o
o o o o
o o o
x x

变换前
o o o o o o o
o o o o o o
o o o o o
x x x
变换后
o o o o o o o x
o o o o o o x
o o o o o x

可以清楚地发现该变换是可逆,而变换一次行数的奇偶性就改变了。那么每一个奇数拆分对应了一个偶数拆分,因此差为 0。。。?

存在以下两类图变换后不合法:
o o o o o
o o o o
o o o

o o o o o o
o o o o o
o o o o

满足的性质:首先两张图都满足 p = 行数,除此之外第一张图满足 p = q;而第二张图满足 p = q - 1。
那么第一张图的总点数(被拆分数)n = (3*p - 1)*p/2;而第二张图 n = (3*p + 1)*p/2。

由此就可以得到 \(\Phi(x) = \prod_{i=1}(1 - x^i) = \sum_{p=1}(-1)^px^{\frac{p(3p\pm 1)}{2}}\)。接着你也就可以解出 \(F(x) = \frac{1}{\Phi(x)}\)

这里有一个点。你可以直接多项式求逆,不过注意到 \(\Phi(x)\) 的表达式中 x 的幂成二次函数增长,因此 n 项中只有 \(\sqrt{n}\) 项有值。因此也可以作 \(O(n\sqrt{n})\) 的多项式求逆。

一个变式是,有时候它会限制每种数最多用 k 次,此时生成函数为 \(F(x) = \prod_{i=1}\frac{1 - x^{k+1}}{1 - x^i} = \frac{\Phi(x^{k+1})}{\Phi(x)}\)。还是该咋求咋求。

不限制使用次数的模板题限制使用次数的模板题

@13 - 二项式反演@

\[\begin{aligned} f_n &= \sum_{i=0}^{n}{n\choose i}g_i\\ g_n &= \sum_{i=0}^{n}(-1)^{n-i}{n\choose i}f_i \end{aligned} \]

以及:

\[\begin{aligned} f_n &= \sum_{i=n}{i\choose n}g_i\\ g_n &= \sum_{i=n}(-1)^{i-n}{i\choose n}f_i \end{aligned} \]

从卷积的角度来看,上下两式的结构一致,只是卷积类型不同。

证明可以采用生成函数,也可以上式代入下式算。
我们就用代入法证一下第一种形式吧,第二种类似证明即可。

\[\begin{aligned} g_n &= \sum_{i=0}^{n}(-1)^{n-i}{n\choose i}f_i \\ &= \sum_{i=0}^{n}(-1)^{n-i}{n\choose i}\sum_{j=0}^{i}{i\choose j}g_j \\ &= \sum_{j=0}^{n}g_j{n\choose j}\sum_{i=j}^{n}(-1)^{n-i}{n - j\choose i - j}\\ &= \sum_{j=0}^{n}g_j{n\choose j}(-1)^{j}\times(1+(-1))^{n-j} \\ &= g_n \end{aligned} \]

其实只是背下来过后推式子可以直接写,不用再推导一遍。

14 - 数值积分(自适应simpson法)

simpson 法:简单来说就是二次函数(一次函数是直的,用来拟合弯的太为难它了)拟合原函数求积分。

对于区间 \([L, R]\),取中点 \(M\) 得到原函数上三点 \((L, f(L)), (M, f(M)), (R, f(R))\)
设过这三点的二次函数为 \(g(x) = Ax^2 + Bx + C\),有:

\[\begin{aligned} \int_{L}^{R}f(x)dx &\sim \int_{L}^{R}g(x)dx \\ &=\frac{2A(R^3 - L^3)+3B(R^2-L^2)+6C(R-L)}{6} \\ &=\frac{R-L}{6}\times(2AR^2+2ALR+2AL^2+3BR+3BL+6C) \\ &=\frac{R-L}{6}\times[(AL^2+BL+C)+(AR^2+BR+C)+4(AM^2+BM+C)] \\ &=\frac{R-L}{6}\times(f(L) + f(R) + 4f(M)) \end{aligned} \]

自适应 simpson 法:平衡精度与时间的方法。简单来说,如果 [L, R] 的拟合值与 [L, M] + [M, R] 相差可以接受,则认为拟合值可接受;否则分治递归。

模板题(请尽量不要自己手算不定积分),以及模板:

double f(double x) {/*...*/}
double simpson(double L, double R) {
	double M = (L + R) / 2;
	return (R - L) / 6 * (f(L) + f(R) + 4*f(M));
}
double integral(double L, double R) {
	double M = (L + R) / 2;
	if( fabs(simpson(L, M) + simpson(M, R) - simpson(L, R)) < EPS )
		return simpson(L, R);
	else return integral(L, M) + integral(M, R);
}

15 - 拉格朗日乘子法

对于单变量函数 \(y=f(x)\),欲求其极值,可以令其导数 \(\frac{dy}{dx} = 0\) 并解出对应的点。

对于多变量函数 \(y=f(x_1,x_2,\dots,x_n)\),欲求其极值,可以令其所有偏导 \(\frac{\partial y}{\partial x_i} = 0\) 并解出对应的点。

对于带有约束 \(g(x_1,x_2,\dots,x_n)=0\) 的多变量函数 \(y=f(x_1,x_2,\dots,x_n)\),欲求其极值。

我们想要规约到不带约束的情况。注意到不带约束时极值满足 \(\frac{\partial y}{\partial x_i} = 0\),尝试构造 \(g(x_1,x_2,\dots,x_n)=\frac{\partial y}{\partial \lambda} = 0\)

构造成 \(y=f(x_1,x_2,\dots,x_n)-\lambda g(x_1,x_2,\dots,x_n)\) 即可,此时有 \(\frac{\partial y}{\partial \lambda} = g(x_1,x_2,\dots,x_n)\)

如果有多个约束条件,对于每个条件设个 \(\lambda_i\) 即可。

其实只是因为我在做文化课时看到了一道不等式,发现我不会(

大概是已知 \(ax+by=cxy\),求 \(px+qy\) 的最小值(当然 \(a,b,c,p,q\) 是已知的常数,\(x,y\) 是正数)

你的中学数学老师会教你变形 \(\frac{a}{y}+\frac{b}{x}=c\),那么 \(px+qy=\frac{1}{c}(\frac{a}{y}+\frac{b}{x})(px+qy)\),展开均值不等式。

然后显然这道题拉格朗日乘子法也可以做,令 \(g(x,y)=ax+by-cxy=0\),目标函数 \(f(x,y) = px + qy\)

虽然算起来很麻烦(

posted @ 2019-07-10 21:50  Tiw_Air_OAO  阅读(500)  评论(0编辑  收藏  举报