递推式 (recurrence) 又叫递归式或差分方程, 它与常微分方程理论中的许多内容平行, 对照学习收获更多!
这些公式目前是足够的; 我们以后将得出 `sum_(k=1)^n k^m` (`m` 为非负整数) 的公式.
对于非负整数 `m, n`, Ackermann 函数定义为 `A(m, n) = { n+1, if m = 0; A(m-1, 1), if m gt 0 and n = 0; A(m-1, A(m, n-1)), if "else"; :}` 试计算 `A(0, n)`, `A(1, n)`, `A(2, n)`, `A(3, n)` 的通项公式, 并求 `A(4, 2)`.
在计算机上, 可以用 ^
代替箭头, 如 `a uarr b` 写作 a^b
,
`a uarr uarr b` 写作 a^^b
.
Conway 的生命游戏 (game of life) 也很有名:)
Graham 数 (葛立恒数)
设 `g(1) = 3 uarr^4 3`, `g(n+1) = 3 uarr^(g(n)) 3`, 则 `g(64)` 称为 Graham 数:
`g(n) = 3 underbrace(uarr cdots uarr)_{::} 3`
`qquad quad vdots`
`g(3) = 3 underbrace(uarr cdots uarr)_{::} 3`
`g(2) = 3 underbrace(uarr cdots uarr)_{::} 3`
`g(1) = 3 uarr uarr uarr uarr 3`
TREE(1): * TREE(2): * * * \ * TREE(3): ...
设递推关系为 `a_n x_n = b_n x_(n-1) + c_n`, 等号两边乘以适当的 `s_n` 得 `s_n a_n x_n = s_n b_n x_(n-1) + s_n c_n`. 如果 `s_n b_n = s_(n-1) a_(n-1)`, 记 `y_n = s_n a_n x_n`, 就有 `y_n = y_(n-1) + s_n c_n`, 这一递推式的解为 `y_n = y_0 + sum_(k=1)^n (y_k - y_(k-1))` `= y_0 + sum_(k=1)^n s_k c_k`. 再将 `s_n b_n = s_(n-1) a_(n-1)` 的解 `s_n = lambda (a_(n-1) cdots a_1 a_0)/(b_n cdots b_2 b_1)` 代入即可, 其中 `lambda` 为任意常数.
`x_1 = 2`, `x_n = 1/((n-1)!) + 1/n x_(n-1)`, `n gt 1`. 求 `x_n` 通项公式.
两边同乘以求和因子 `n!`, `n! x_n = (n-1)! x_(n-1) + n` `= 1! x_1 + sum_(k=2)^n k` `= 2 + (n(n+1))/2 - 1`. 所以 `x_n = 1/(n!) (1 + (n(n+1))/2)`.
`x_1 = 1`, `x_n = 1 + 2/n^2 sum_(k=1)^(n-1) k x_k`, `n gt 1`. 求 `x_n` 通项公式.
记 `S_n = 2 sum_(k=1)^n k x_k`. 从递推式中解出 `S_(n-1) = n^2 (x_n - 1)`, 相减得 `2 (n-1) x_(n-1) = S_(n-1) - S_(n-2)` `= n^2 x_n - (n-1)^2 x_(n-1) - (n^2 - (n-1)^2)`. 即 `n^2 x_n = (n+1)(n-1) x_(n-1) + 2n - 1`. 两边同加 `n^2`, 再同除以 `n(n+1)`, `n/(n+1) (x_n + 1) = (n-1)/n (x_(n-1) + 1) + 2/(n+1)` `= 1/2 (x_1 + 1) + sum_(k=2)^n 2/(k+1)` `= 2 sum_(k=1)^n 1/(k+1)`. 即 `x_n = 2(1+1/n) sum_(k=1)^n 1/(k+1) - 1`.
成套方法 (repertoire method) 适用于线性递推式的方程组.
用成套方法求解 `{ x_1 = alpha,; x_(2n) = 2 x_n + beta, n ge 1; x_(2n+1) = 2x_n + gamma, n ge 1 :}`
设通解为 `x_n = alpha a_n + beta b_n + gamma c_n`, 将 `x_n = 1` 代入原方程组得 `{1 = alpha; 1 = 2 + beta; 1 = 2 + gamma:}`, 从而 `(alpha, beta, gamma) = (1, -1, -1)`. 代入通解有 `1 = a_n - b_n - c_n`. 类似地, 再将 `x_n = n` 代入原方程组, 得到 `(alpha, beta, gamma) = (1, 0, 1)`, 然后代入通解有 `n = a_n + c_n`. 最后, 取 `(alpha, beta, gamma) = (1, 0, 0)`, 代入通解有 `x_n = a_n`, 代入原方程组有 `{a_1 = 1; a_(2n) = 2a_n; a_(2n+1) = 2a_n:}`, 用归纳法可以证明其解为 `a_n = 2^m`, 其中 `2^m le n lt 2^(m+1)`. 现在联立 `{a_n-b_n-c_n = 1; a_n+c_n = n; a_n = 2^m:}` 最终解为 `x_n = alpha 2^m + beta(2^(m+1)-1-n) + gamma(n-2^m)`.
求 Fibonacci 数列 `f_n = { 0, if n = 0; 1, if n = 1; f_(n-1) + f_(n-2){::}, if n ge 2; :}` 的通项公式.
待定系数法化为等差/等比数列
设
`f_n = (varphi + psi) f_(n-1) - varphi psi f_(n-2)`,
则 `varphi, psi` 应是方程 `x^2 - x - 1` 的两根, 不妨令
`varphi, psi = (1 +- sqrt 5)//2`.
上式变形得到
`{
f_n - varphi f_(n-1) = psi(f_(n-1) - varphi f_(n-2));
f_n - psi f_(n-1) = varphi(f_(n-1) - psi f_(n-2));
:}`
于是 `{f_n - varphi f_(n-1)}`, `{f_n - psi f_(n-1)}` 皆为等比数列.
由等比数列的通项公式有:
`f_n - varphi f_(n-1) = psi^(n-1) (f_1 - varphi f_0) =
psi^(n-1)`,
`f_n - psi f_(n-1) = varphi^(n-1) (f_1 - psi f_0) = varphi^(n-1)`.
注意 `varphi psi = -1`, 由上式得到
`{
psi f_n + f_(n-1) = psi^n;
varphi f_n + f_(n-1) = varphi^n;
:}`
解得
`f_n = 1/sqrt 5 (varphi^n - psi^n)`.
生成函数法 记 `F(x) = sum_(n=0)^oo f_n x^n`, 于是 `F(x) = 0 + x + sum_(n=2)^oo (f_(n-1) + f_(n-2)) x^n` `= x + sum_(n=1)^oo f_n x^(n+1) + sum_(n=0)^oo f_n x^(n+2)` `= x + x F(x) + x^2 F(x)`. 解得 `F(x) = x/(1-x-x^2)`. 记上式分母的两个零点的相反数为 `varphi, psi = (1 +- sqrt 5)//2`, 则 `varphi psi = -1`. 通过分解分式, `F(x) = 1/sqrt 5(psi/(x + psi) - varphi/(x + varphi))` `= 1/sqrt 5(1/(1-varphi x) - 1/(1-psi x))` `= 1/sqrt 5 sum_(n=0)^oo [(varphi x)^n - (psi x)^n]`. 于是 `f_n = 1/sqrt 5(varphi^n - psi^n)`.
特征根法 将 `f_n = lambda^n` (`lambda != 0`) 代入递推公式, 得 `lambda^n = lambda^(n-1) + lambda^(n-2)`, 由 `lambda != 0`, 有 `lambda^2 = lambda + 1`. 这个二次方程的两根记为 `varphi, psi = (1 +- sqrt 5)//2`, 由线性叠加原理, 该差分方程的通解为 `f_n = c_1 varphi^n + c_2 psi^n`. 再代入初值条件 `f_0 = 0`, `f_1 = 1`, 有 `{ c_1 + c_2 = 0; varphi c_1 + psi c_2 = 1; :}` 解得 `c_1, c_2 = +- 1/sqrt 5`. 于是 Fibonacci 数列的通项公式是 `f_n = 1/sqrt 5 (varphi^n - psi^n)`.
注意 `|psi| = |1-sqrt 5|//2 lt 1`, 从而对 `n = 0, 1, 2...` 都成立 `|psi^n/sqrt 5| lt 1/sqrt 5 lt 1/2`. 我们推出: `f_n` 等于最接近 `varphi^n/sqrt 5` 的整数.
`varphi = (1+sqrt 5)//2` 即是著名的黄金比例, 它定义为方程 `x^2 = 1 + x` 的正根. 利用通项公式容易计算, Fibonacci 数列前后项的比值 `f_(n+1)//f_n` 的极限是 `varphi`, 因此它在某种意义上是对等比数列 `varphi^n/sqrt 5` 的逼近.
现在我们不用通项公式, 只借助递推式来推导极限 `lim_(n to oo) f_(n+1)//f_n`. 记 `x_n = f_(n+1)//f_n`, 则 `x_1 = 1`, `quad x_n = (f_n + f_(n-1))/(f_n) = 1 + 1/x_(n-1)`. 假设 `x_n to a`, 则 `a` 满足 `a = 1 + 1/a`. 显然 `a` 是正数, 由上式解得 `a = varphi = (1+sqrt 5)//2`. 下证极限存在. 注意到 `x_n ge 1`, `n = 1, 2, cdots`, 有 `|x_n - a| = |(1 + 1/x_(n-1)) - (1 + 1/a)|` `= |1/x_(n-1) - 1/a|` `= |x_(n-1) - a|/(a x_(n-1))` `le 1/a |x_(n-1) - a|` 由 `1/a lt 1` 知 `|x_n - a| to 0`, 即 `x_n to a`.
0.01 + 0.001 + 0.0002 + 0.00003 + 0.000005 + 0.0000008 + 0.00000013 + 0.000000021 + 0.0000000034 + 0.00000000055 + 0.000000000089 + 0.0000000000144 + ... = 1/89
设有两种译码规则 0 = A 和 00 = B, 现收到一串 `n` 个 0 的序列, 问有几种不同的解释. 事实上, 设这个数为 `x_n`, 则 `x_1 = 1`, `x_2 = 2` (因为两个 0 可以解释为一个 B, 也可以解释为两个 A). 设 `n ge 3`, 考虑 `n` 个 0 的序列, 若将第一个 0 解释为一个 A, 则余下 `n-1` 个 0 有 `x_(n-1)` 种解释; 若将前两个 0 解释为一个 B, 则余下 `n-2` 个 0 有 `x_(n-2)` 种解释. `x_n = x_(n-1) + x_(n-2)`, `quad n ge 3`. 注意 `x_1 = f_2`, `x_2 = f_3`, 所以 `x_n = f_(n+1)`.
用数学归纳法可证 `f_(n+1) f_(n-1) - f_n^2 = (-1)^n`, 反之, 若数列 `{x_n}` 满足 `x_1 = x_2 = 1` 和 `x_(n+1) x_(n-1) - x_n^2 = (-1)^n`, 则 `x_n = f_n`.
我们看到, 求解 Fibonacci 数列通项公式的所有方法中, 特征根法计算量最小, 且抓住了问题的本质. 这一方法很容易推广到一般的常系数线性递推式, 形如: `sum_(i=0)^k a_i x_(n+i) = 0`, `quad a_k != 0`. 将 `x_n = lambda^n` (`lambda != 0`) 代入方程即得到关于 `lambda` 的一元 `k` 次方程 `sum_(i=0)^k a_i lambda^i = 0`, 称为递推式的特征方程, 方程左边的 `k` 次多项式称为特征多项式, 它的根称为特征根. 事实上, 方程有 `k` 个线性无关的特解 `x_n = n^j lambda^n`, `quad j = 0, 1, cdots, m-1`, 其中 `lambda` 取遍所有不同的特征根, `m` 是 `lambda` 的重数. 我们来说明它们确实是方程的解, 即证 `sum_(i=0)^k a_i (n+i)^j lambda^(n+i) = 0`. 这只需证明下面的引理:
设 `lambda != 0` 是多项式 `f(x) = sum_(i=0)^k a_i x^i` 的 `m` 重根 (`m ge 1`), 那么 `sum_(i=0)^k a_i (n+i)^j lambda^i = 0`, `quad j = 0, 1, cdots, m-1`.
如果特征方程有 `m` 重零根 `lambda = 0`, 则对应的系数满足 `a_0 = a_1 = cdots = a_(m-1) = 0`, 且 `a_m != 0`. 此时令 `y_n = x_(n+m)`, 原方程就化为 `sum_(i=m)^k a_i x_(n+i)` `= sum_(i=0)^(k-m) a_(i+m) y_(n+i) = 0`. 由于 `a_m != 0`, 它的特征方程无零根.
如果系数 `a_0, a_1, cdots, a_k` 为实数, 而特征方程有复根
`lambda = r"e"^("i" theta) = r(cos theta + "i"sin theta)`,
则在特征方程两端同时取其共轭, 容易证明
`bar lambda = r(cos theta - "i"sin theta)` 也是特征根,
且和 `lambda` 具有相同重数.
可以取两个实的特解
`1/2 n^j (lambda^n + {:bar lambda:}^n) = n^j r^n cos {:n theta:}`,
`1/(2"i") n^j (lambda^n - {:bar lambda:}^n) = n^j r^n sin {:n
theta:}`.
来替换对应的复数特解
`n^j lambda^n` 和 `n^j {:bar lambda:}^n`.
设 `x^2-2x+6 = 0` 的两根为 `alpha, beta`, 求 `alpha^10 + beta^10`.
构造线性递推式 `x_n = 2 x_(n-1) - 6 x_(n-2)`, 它的特征方程恰为 `x^2-2x+6 = 0`. 于是通解为 `x_n = c_1 alpha^n + c_2 beta^n`. 取 `c_1 = c_2 = 1`, 则 `x_10` 即为所求. 这时满足的初值条件为 `x_0 = alpha^0 + beta^0 = 2`, `x_1 = alpha + beta = 2`. 利用递推式迭代计算可得答案 `7552`.
构造多项式 `f(x) = x^2-2x+6` 的友阵 `bm A = [0, -6; 1, 2]`, 它的特征多项式恰为 `f(x)`. 由线性代数的知识知道, `alpha^10+beta^10` 恰好为 `bm A^10` 的迹. 依次计算 `bm A^2, bm A^4, bm A^8`, 最后得到 `bm A^10 = [6816, **; **, 736]`. 所以答案是 `6816+736=7552`.
[题源 brilliant.org] 求 `(sqrt(71)+1)^71 - (sqrt(71)-1)^71` 的个位数.
将题目改写为 `(1+sqrt(71))^71 + (1-sqrt(71))^71`, 构造线性递推式 `x_n = 2 x_(n-1) + 70 x_(n-2)`, 它的两个特征根恰为 `1+-sqrt(71)`. 题目转化为求解 `x_71 (mod 10)`. 代入初值条件 `x_1 = 2`, 容易知道 `x_2 -= 4`, `x_3 -= 8`, `x_4 -= 6`, `x_5 = 2` `quad (mod 10)`. 由于 `71 -= 3 (mod 4)`, 所以 `x_71 -= 8 (mod 10)`.
[题源 brilliant.org] 求 `|__ (sqrt 2+1)^6 __|`.
记 `x_n = (1+sqrt 2)^n + (1-sqrt 2)^n`. 容易求得 `x_6 = 198`. 注意到 `(1-sqrt 2)^6 lt 1`, 所以答案是 `197`.
`f(n)` | 方程的特解 |
---|---|
`P(n) lambda^n` | `n^m Q(n) lambda^n` |
`r^n (A(n) cos n theta + B(n) sin n theta)` | `n^m r^n (P(n) cos n theta + Q(n) sin n theta)` |
事实上, 前面所述的特征方程的方法, 也可以推广到非线性的递推式中. 一般地, 设 `x_(n+1) = f(x_n)`, 我们称方程 `x = f(x)` 的根为函数 `f(x)` 的不动点. 我们利用不动点来求解一些递推式.
`x_(n+1) = n/(n+2) x_n + 2/(n+2)`.
这是非常系数的线性递推式. 注意到系数之和为 `1`, 显然特征方程 `x = n/(n+2) x + 2/(n+2)` 有不动点 `1`. 计算知 `x_(n+1) - 1 = n/(n+2) (x_n - 1)`. 递推, `x_n - 1 = (n-1)/(n+1) (n-2)/n (n-3)/(n-1)` `cdots 2/4 1/3 (x_1-1)` `= 2/(n(n+1)) (x_1-1)`.
`x_(n+1) = 1/2(x_n + a/x_n)`, `a gt 0`.
这是熟知的开平方根的牛顿迭代公式, 对所有正的初值都收敛到 `sqrt a`. 为求通项公式, 先求得不动点为 `+- sqrt a`, 再计算 `(x_(n+1) - sqrt a)/(x_(n+1) + sqrt a)` `= ((x_n^2+a)/(2x_n) - sqrt a)/((x_n^2+a)/(2x_n) + sqrt a)` `= ((x_n-sqrt a)/(x_n+sqrt a))^2`. 记 `y_n = (x_n-sqrt a)/(x_n+sqrt a)`, 则 `y_(n+1) = y_n^2`. 利用高次递推式的结果, `y_n = y_0^(2^n)`. 由此可得 `x_n` 的通项公式.
[来自群友 我是的的我是] 反复投一枚硬币, 记投掷总次数为 `X`, 求出现连续 `n` 次正面时 `X` 的期望.
用 `x_n` 表示达成连续 `n` 次正面平均所需的次数. 假设当前已经连续掷出 `n-1` 次正面, 再掷一次, 如果为正面, 则达成连续 `n` 次正面; 如果为背面, 则重新来过, 还需掷 `x_n` 次: `x_n = x_(n-1) + 1/2 + (1+x_n)/2`. 利用 `x_0 = 0` 解得 `x_n = 2^(n+1) - 2`.
记投出正面为胜, 背面为负. 用 `x_k` 表示当前已经 `k` 连胜, 距离达成 `n`
连胜平均还需要玩的对局数. 讨论每种情况的胜负, 列出方程组
`{
x_0 = (1+x_1)/2 + (1+x_0)/2;
x_1 = (1+x_2)/2 + (1+x_0)/2;
cdots;
x_(n-1) = (1+x_n)/2 + (1+x_0)/2;
x_n = 0;
:}`
方程组化为
`x_k = 2 x_(k-1) - x_0 - 2`, `quad k = 1, cdots, n`,
`x_n = 0`.
将通解 `x_k = a 2^k + b` 代入得
`a 2^k + b = 2(a 2^(k-1)+b) - x_0 - 2`,
`a 2^n + b = 0`.
即 `b = x_0 + 2`, `a = -(x_0+2) 2^-n`. 将它们代入 `x_0 = a + b`
最终解得
`E X = x_0 = 2^(n+1)-2`.