@0 - 引言@
我发现学习数学要记住的东西实在太多了。。。
所以专门开一个 blog 来整理收集一下。
该篇博客应该会时刻保持 update。
如果是太过简单的东西就不予证明了。
@1 - 欧几里得算法@
@1.1 - 欧几里得算法@
作用:用于求解两个整数的最大公因数。
从最基础的开始吧。
这个算法又被叫作“辗转相除法”,非常生动形象地表现了这个算法的流程。
只需要一句话就可以描述:
时间复杂度初步估计为 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 的求法,稍微进行变换:
注意我们现在只需要求出一组特解,而代入 (x_0 = y_1, y_0 = x_1 - lfloor frac{k}{m} floor 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} imeslfloorfrac{a imes i+b}{c} floor^{k2})。
咕咕咕。update in 2020/03/10:我来填坑啦。
除了模板题,我们平常大概只需要用到 (sum_{i=0}^{n}lfloorfrac{a imes i+b}{c} floor)。不过有的时候理性愉悦一下也是挺好的。
我们定义函数 func(n, a, b, c) 可以求出 k1 + k2 <= K 的所有 (sum_{i=0}^{n}i^{k1} imeslfloorfrac{a imes i+b}{c} floor^{k2}) 的值。
(1)如果 (a geq c)。
此时有(为了方便,暂时用 % 代替取模符号):
简单二项式展开可得:
递归到 func(n, a%c, b, c) 即可。
(2)如果 (b geq c)。
类似于上面的推导,我们有:
递归到 func(n, a, b%c, c) 即可。
(3)如果 (a < c) 且 (b < c)。
此时记 (m = lfloorfrac{a imes n+b}{c}
floor)。
首先判断 m 是否为 0。如果 m = 0,则当 k2 ≠ 0 时答案为 0,否则答案为自然数幂和。
否则,此时肯定有 a ≠ 0。
先引入一个恒等式:([j + 1 leq lfloorfrac{a imes i + b}{c}
floor] = 1 - [i leq lfloorfrac{c imes j + c - b - 1}{a}
floor])。
证明需要用到两条引理:(a imes b leq c Leftrightarrow a leq lfloorfrac{c}{b}
floor),(a imes b > c Leftrightarrow a > lfloorfrac{c}{b}
floor)。此处不细谈。
我们可以将 (lfloorfrac{a imes i+b}{c} floor^{k2}) 写作 (sum_{j=0}^{lfloorfrac{a imes i+b}{c} floor - 1}((j + 1)^{k2} - j^{k2}))。尝试对原式变形:
。。。看起来很糟但其实每一步都是很简单的变换。
注意到自然数幂和 (sum_{i=0}^{n}i^k) 可以表示成 n 的 k + 1 次多项式 (F_k(n) = sum_{i=0}^{k+1}f_{k,i}n^i):
因此递归到 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)} = 1mod m),就可以得到 (a^{phi(m)-1} = 1mod m)。
预处理多个数的逆元还有着均摊 O(1) 的算法,也有两种方法:
一种是处理 1~n 的逆元,可以采用以下方法推导:
因为 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 的逆元,则:
只需要证明这是一组特解与通解也具有这种形式即可。
@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 - 费马小定理@
作用:在模数是质数的情况下,用于指数的取模、求解逆元。
定理的描述只有一个公式:
其中 p 是质数。使用条件只需要 a 不是 p 的倍数即可。
稍微变化一下就可以得到 a 的逆元 (a^{p-2} = a^{-1} mod p)。
一般情况下写费马小定理比写扩欧要快得多,而且快速幂本身作为一个基础功能也可以用于其他地方。
指数取模的意思是 (a^b = a^{bmod p-1} mod p),至于正确性是很显然的。
证明需要用到剩余系什么的,因为过于数论所以就暂且不提。
@4.2 - 欧拉定理@
作用:在模数与底数互质的情况下,用于指数的取模、求解逆元。
定理的描述一样只有一个公式:
适用条件是 gcd(a, m) = 1。可以发现这也是扩欧有解的条件。
取 m 为质数,则 (phi(m) = m - 1)。于是费马小定理就是欧拉定理的一个特例。
但是因为欧拉函数 (phi) 并不好求,所以一般实用性不如费马小定理。
证明一样要用什么既约剩余系,太过于数论所以暂且不提。
@4.3 - 扩展欧拉定理@
作用:用于指数的取模。
这个定理相比上述两条不需要任何的适用条件,具有普适性。描述如下:
证明提及一下简要的过程。首先我们从 m 中提取某个质因子 p,使得 m = s*p^r(其中 s 与 p 互质)。然后:
将 a 也拆成质因子相乘的形式,如果 a 的某个质因子 m 不含有就套用欧拉定理,否则如上所示。
@5 - 离散对数@
@5.1 - 原根@
作用:理论依据。
阶是满足 (a^p = 1mod 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} = Bmod 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 都表示为原根的幂,得到:
根据上面的什么欧拉定理就可以指数取模,然后得到一个模线性方程,然后 exgcd 即可。
@6.2 - 二次剩余@
作用:模数为素数的情况下求解二次剩余 x^2 = n mod p。
首先素数分 2 和奇素数。2 不必多说,我们接下来只考虑奇素数。
先来看看怎么判断一个数 k 是否为二次剩余。由费马小定理我们有 (k^{p-1}=1mod p),于是就有 (k^{frac{p-1}{2}} = 1或-1mod p)
假设 k 有二次剩余 x,则有 (k^{frac{p-1}{2}} = x^{p-1} = 1mod p)。
假设 (k^{frac{p-1}{2}} = 1mod 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 - 狄利克雷卷积@
事实上,狄利克雷卷积与数论函数是密不可分的。
简单来说,狄利克雷卷积是定义在数论函数上的卷积,是数论函数特有的运算。
它的定义如下:
与一般的卷积类似,狄利克雷卷积满足交换律与结合律。
且狄利克雷卷积存在单位元,即 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 imes n^{-s}),为 (id^k) 的狄利克雷级数。
两个狄利克雷级数相乘 (F(s) imes G(s)) 即对应数论函数的狄利克雷卷积,由此也可以得到 (frac{1}{zeta(s)}=sum mu(n) imes n^{-s}),(frac{zeta(s-1)}{zeta(s)}=sum phi(n) imes 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 定理表明了以下关系的存在:
其中证明。。。百度百科里面提到了一个构造性的证明,但为了与下面的扩展 lucas 定理统一,我们采用另一个证明。
首先有:
为了得到它取模的结果,我们需要讨论分子分母中质数因子 p 的出现。
我们提取出分子分母 p 的倍数,得到:
(不要怕,这个公式只是看起来长而已。。。)
其中表达式中的除法表示向下取整。
可以发现,只有当 (lfloorfrac{n-m}{p}
floor + lfloorfrac{m}{p}
floor = lfloorfrac{n}{p}
floor),这个式子在模 p 的意义下才有意义。
我们可以把阶乘组合一下得到组合数,此时原式就可以变为:
于是可以通过预处理 < p 的阶乘,在 O(log) 的时间内解决组合数取模问题。
@10.2 - 扩展 lucas 定理@
作用:模数 p 为任意数的情况下求解组合数取模 C(n, m) mod p。
懒得再写一遍,大家直接打开这篇博客看吧。
@11 - burnside 引理@
终于从数论中脱离出来了。。。
你可以在这篇博客里找到详情。
@12 - 整数拆分@
作用:求将 n 拆分成若干个正整数之和的方案数(无顺序、可重复)
写出正整数拆分的生成函数:
考虑函数 (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(3ppm 1)}{2}})。接着你也就可以解出 (F(x) = frac{1}{Phi(x)})。
这里有一个点。你可以直接多项式求逆,不过注意到 (Phi(x)) 的表达式中 x 的幂成二次函数增长,因此 n 项中只有 (sqrt{n}) 项有值。因此也可以作 (O(nsqrt{n})) 的多项式求逆。
一个变式是,有时候它会限制每种数最多用 k 次,此时生成函数为 (F(x) = prod_{i=1}frac{1 - x^{k+1}}{1 - x^i} = frac{Phi(x^{k+1})}{Phi(x)})。还是该咋求咋求。
@13 - 二项式反演@
以及:
从卷积的角度来看,上下两式的结构一致,只是卷积类型不同。
证明可以采用生成函数,也可以上式代入下式算。
我们就用代入法证一下第一种形式吧,第二种类似证明即可。
其实只是背下来过后推式子可以直接写,不用再推导一遍。
14 - 数值积分(自适应simpson法)
simpson 法:简单来说就是二次函数(一次函数是直的,用来拟合弯的太为难它了)拟合原函数求积分。
对于区间 ([L, R]),取中点 (M) 得到原函数上三点 ((L, f(L)), (M, f(M)), (R, f(R)))。
设过这三点的二次函数为 (g(x) = Ax^2 + Bx + C),有:
自适应 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)。
虽然算起来很麻烦(