数列通项/递推式 求解与分析入门

如无特别说明,本文数列的起始项下标为 \(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=k_1 \cdot a_{n-1} + k_2 \cdot a_{n-2} + \cdots + k_q \cdot a_{n-q} \]

我们构造 \(a_{n-i}=x^{q-i}\),原式可写为

\[x_k=k_1 \cdot x^{q-1} + k_2 \cdot x^{q-2} + \cdots + k_q \cdot x \]

求解 \(q\) 次方程,如果解的个数恰好为 \(q\) 个,则通项可表示为

\[a_n=A_1 \cdot x_1^n+A_2 \cdot x_2^n+ \cdots + A_q \cdot x_q^n \]

其中 \(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\),代入后可得

\[2 \cdot (b_n+1)=b_{n-1}+1+\frac{1}{b_{n-1}+1}\Longleftrightarrow 2 \cdot b_n=\frac{b_{n-1}^2}{a_{n-1}} \]

\[2 \cdot (c_n-1)=c_{n-1}-1+\frac{1}{c_{n-1}-1}\Longleftrightarrow 2 \cdot c_n=\frac{c_{n-1}^2}{a_{n-1}} \]

上下相除,解得

\[\frac{b_n}{c_n}=(\frac{b_{n-1}}{c_{n-1}})^2=(\frac{a_1-1}{a_1+1})^{2^{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\) 项的值,其中一种方法是推导通项公式,例如斐波那契数列的通项公式为

\[F_n=\frac{(\frac{1+\sqrt{5}}{2})^n-(\frac{1-\sqrt{5}}{2})^n}{\sqrt{5}}, \ F_1=1, \ F_2=1 \]

我们可以直接将 \(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\),我们期望得到

\[A_n=A_{n-1} \cdot B \]

矩阵 \(B\) 的维数是任意的,不妨先尝试 \(2 \times 2\) 的矩阵,设其为

\[B= \left[\begin{array}{c} a & b \\ c & d \end{array}\right]\]

解得

\[A_{n-1} \cdot B = \left[\begin{array}{c} a \cdot F_{n-1} + c \cdot F_{n-2} & b \cdot F_{n-1} + d \cdot F_{n-2} \end{array}\right]=A_n\]

\[\begin{equation*} \begin{cases} a \cdot F_{n-1} + c \cdot F_{n-2} = F_n = F_{n-1}+F_{n-2} \\ b \cdot F_{n-1} + d \cdot F_{n-2} = F_{n-1} \end{cases} \end{equation*}\]

容易解得 \(a=c=b=1, \ d=0\),即

\[B = \left[\begin{array}{c} 1 & 1 \\ 1 & 0 \end{array}\right]\]

根据我们的定义 \(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\),即其可以表示为

\[1919810=2^1+2^6+2^8+2^9+2^{11}+2^{14}+2^{16}+2^{18}+2^{19}+2^{20} \]

这个问题比较简单,因为序列中(除第一个)任意一个元素就是其前一个元素的平方,只需要将对应二进制位为 \(1\) 的整系数幂乘起来就

行了。换句话说,如果将指数 \(m\) 写成 \((n_tn_{t-1} \cdots n_1n_0)_2\),其中 \(n_i\in{\{0,1\}}\),那么有

\[n=n_t \cdot 2^t + n_{t-1} \cdot 2^{t-1} + \cdots + n_1 \cdot 2^1 + n_0 \cdot 2^0 \]

\[A_n=A^{(n_t \cdot 2^t + n_{t-1} \cdot 2^{t-1} + \cdots + n_1 \cdot 2^1 + n_0 \cdot 2^0)} \]

\[A_n=A^{n_t \cdot 2^t} \cdot A^{n_{t-1} \cdot 2^{t-1}} \cdot \cdots \cdot A^{n_1 \cdot 2^1} \cdot A^{n_0 \cdot 2^0} \]

根据上式我们发现,原问题被我们转化成了形式相同的子问题的乘积,并且我们可以在常数时间内从第 \(2^i\) 项推出第 \(2^{i+1}\) 项,只需要计算约 \(log(n)\) 个数,

因为一个数 \(n\) 的二进制展开位数约为 \(log(n)\) 。其时间复杂度是 \(O(log(n))\),效率不及通项公式,但远快于线性计算。

posted on 2024-08-08 03:56  _Reborn  阅读(278)  评论(0)    收藏  举报