数列通项/递推式 求解与分析入门
如无特别说明,本文数列的起始项下标为 \(1\),\(log\) 方法的下标为 \(2\)
1.数列换元( \(Series \ Permutation\) )
基本思想是尝试构造 \(a_n = b_n + k\),其目的是为了消去常数,
本文主要考虑形式 \(a_n = p \cdot a_{n-1}+q\) 。
对于 \(a_n = p \cdot a_{n-1}+q\),代入后可得 \(b_n + k = p \cdot b_{n-1}+ p \cdot k + q\),我们希望它的常数为 \(0\),即 \(p \cdot k - k + q = 0\),可解得 \(k = \frac{q}{1-p}\),原式变为 \(b_n=p \cdot b_{n-1}\),此时 \(b_n\) 为等比数列。
回代 \(a_n\) 即可解得 $$a_n = p^{n-1} \cdot (a_1 + \frac{q}{p-1}) - \frac{q}{p-1}$$
$2. \ $特征方程( \(Characteristic \ Equation\) )
特征方程可以分为第一类特征方程和第二类特征方程。
对于第一类特征方程,其主要针对以下形式的递推公式,
我们构造 \(a_{n-i}=x^{q-i}\),原式可写为
求解 \(q\) 次方程,如果解的个数恰好为 \(q\) 个,则通项可表示为
其中 \(A_1,A_2, \cdots A_q\) 可通过给定信息,即数列的前几项的值确定。
对于第二类特征方程,它的思想类似于数列换元,即消去常数。
考虑形式 \(2 \cdot a_n = a_{n-1}+\frac{1}{a{n-1}}\),其特征方程为 \(2 \cdot x = x+\frac{1}{x}\),解得 \(x=\pm 1\) 。
令 \(a_n=b_n-1=c_n+1\),代入后可得
上下相除,解得
回代 \(a_n\),可解得
$$a_n = \frac{2}{P_n-1} + 1, \quad P_n= (\frac{a_1+1}{a_1-1})^{Q_n}, \quad Q_n=2^{n-1}$$
$3. \ $三角换元( \(Trigonometric \ Conversion\) )
基本思想是通过倍角公式求解含根号以及幂指数的通项。在求解中建议借助形式匹配表,如下。
\(\overline{\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ }\)
\(sinx \quad \sim \quad 2x \sqrt{1-x^2} \quad or \quad 3x-4x^3 \quad or \quad \sqrt{\frac{1-\sqrt{1-x^2}}{2}}\)
\(cosx \quad \sim \quad 2x^2-1 \quad or \quad 4x^3-3x \quad or \quad \sqrt{\frac{1+x}{2}}\)
\(tanx \quad \sim \quad \frac{2x}{1-x^2} \quad or \quad \frac{x^3-3x}{3x^2-1} \quad or \quad \frac{\sqrt{1+x^2}-1}{x}\)
\(cscx \quad \sim \quad \frac{x^2}{2\sqrt{x^2-1}} \quad or \quad \frac{x^3}{3x^2-4} \quad or \quad \sqrt{2x+2x\sqrt{x^2-1}}\)
\(secx \quad \sim \quad \frac{x^2}{2-x^2} \quad or \quad \frac{x^3}{4-3x^2} \quad or \quad \sqrt{\frac{2x}{1+x}}\)
\(cotx \quad \sim \quad \frac{x^2-1}{2x} \quad or \quad \frac{x^3-3x}{3x^2-1} \quad or \quad x+\sqrt{x^2+1}\)
\(\overline{\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ }\)
本文主要考虑形式 \(a_n = \sqrt{a_{n-1}+2}\) \(\quad\) \(a_n=2 \cdot a_{n-1}^2 - 1\) 。
对于 \(a_n = \sqrt{a_{n-1}+2}\),考虑匹配 \(cos \sim \sqrt{\frac{1+x}{2}}\),令 \(a_n=k \cdot b_n\),解得
\(k \cdot b_n = \sqrt{k \cdot b_{n-1}+2} \Longrightarrow \frac{、k}{2} \cdot b_n = \sqrt{\frac{\frac{k}{2} \cdot b_{n-1}+1}{2}}\),令 \(k=2\),可得 \(b_n=\sqrt{\frac{b_{n-1}+1}{2}}\)。
回代 \(a_n\) 即可解得 $$a_n = 2 \cdot cos(\frac{1}{2^{n-1}} \cdot arccos(\frac{a_1}{2}))$$
对于 \(a_n=2 \cdot a_{n-1}^2 - 1\),考虑匹配 \(cosx \sim 2x^2-1\),令 \(a_n=cos(b_n)\),解得
\(cos(b_n)=2 \cdot cos^2(b_{n-1})-1=cos(2^{n-1} \cdot b_1)\),
回代 \(a_n\) 即可解得 $$a_n=cos(2^{n-1} \cdot arccos(a_1))$$
4.时间复杂度( \(Time \ Complexity\) )
若已知递推公式和初始值,则可进行线性递推,时间复杂度是 \(O(n)\),其中 \(n\) 表示我们递推到第 \(n\) 项,此
方法最简单也最常见。我们以斐波那契( \(Fibonacci\) )数列为例,已知 \(F_1=1,F_2=1,F_n=F_{n-1}+F_{n-2}\),可以线性地递推到第 \(n\) 项,计算次数与 \(n\) 成正比。
若我们想更快地得到某数列第 \(n\) 项的值,其中一种方法是推导通项公式,例如斐波那契数列的通项公式为
我们可以直接将 \(n\) 代入计算得到 \(F_n\),只需要一次计算,或者说只需要常数次计算,其计算次数与 \(n\) 无关,时间复杂度为 \(O(1)\),效率最高。
若无法求解通项公式,但递推表达式仍然是线性的,或者类似线性,可以通过矩阵递推的形式来加速。
我们仍然以斐波那契数为例,已知 \(F_n=F_{n-1}+F_{n-2}\),我们构造答案矩阵 \(A_n= \left[\begin{array}{c} F_n & F_{n-1} \end{array}\right]\) 。
还需要一个累乘矩阵 \(B\),我们期望得到
矩阵 \(B\) 的维数是任意的,不妨先尝试 \(2 \times 2\) 的矩阵,设其为
解得
即
容易解得 \(a=c=b=1, \ d=0\),即
根据我们的定义 \(A_n= \left[\begin{array}{c} F_n & F_{n-1} \end{array}\right]\),数列第 \(n\) 项的值即为矩阵中左边这一项的值。而由 \(A_n=A_{n-1} \cdot B\)
可以得到 \(A_n=A_2 \cdot B^{n-2}\),用 \(A_2\) 来递推而不是 \(A_1\) 是因为 \(A_1= \left[\begin{array}{c} F_1 & F_0 \end{array}\right]\),\(F_0\) 这一项我们无法计算
\(A_2\) 是一个已知量,等于 \(\left[\begin{array}{c} 1 & 1 \end{array}\right]\),所以我们只需要求出 \(B^{n-2}\),用分治的思想可以快速求解。
假设我们要求出 \(114514^{1919810}\) 的值,朴素的做法是将 \(1\) 与 \(114514\) 相乘 \(1919810\) 次,这样算虽然简单但效率太低。可以通过对指数的二进制分割将幂运算分割成更小的任务。
将 \(1919810\) 用二进制表示为 \((111010100101101000010)_2\),即其可以表示为
这个问题比较简单,因为序列中(除第一个)任意一个元素就是其前一个元素的平方,只需要将对应二进制位为 \(1\) 的整系数幂乘起来就
行了。换句话说,如果将指数 \(m\) 写成 \((n_tn_{t-1} \cdots n_1n_0)_2\),其中 \(n_i\in{\{0,1\}}\),那么有
则
根据上式我们发现,原问题被我们转化成了形式相同的子问题的乘积,并且我们可以在常数时间内从第 \(2^i\) 项推出第 \(2^{i+1}\) 项,只需要计算约 \(log(n)\) 个数,
因为一个数 \(n\) 的二进制展开位数约为 \(log(n)\) 。其时间复杂度是 \(O(log(n))\),效率不及通项公式,但远快于线性计算。
浙公网安备 33010602011771号