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

如无特别说明,本文数列的起始项下标为 1log 方法的下标为 2

1.数列换元( Series Permutation )

基本思想是尝试构造 an=bn+k,其目的是为了消去常数,

本文主要考虑形式 an=pan1+q

对于 an=pan1+q,代入后可得 bn+k=pbn1+pk+q,我们希望它的常数为 0,即 pkk+q=0,可解得 k=q1p,原式变为 bn=pbn1,此时 bn 为等比数列。

回代 an 即可解得 an=pn1(a1+qp1)qp1

2. 特征方程( Characteristic Equation )

特征方程可以分为第一类特征方程和第二类特征方程。

对于第一类特征方程,其主要针对以下形式的递推公式,

an=k1an1+k2an2++kqanq

我们构造 ani=xqi,原式可写为

xk=k1xq1+k2xq2++kqx

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

an=A1x1n+A2x2n++Aqxqn

其中 A1,A2,Aq 可通过给定信息,即数列的前几项的值确定。

对于第二类特征方程,它的思想类似于数列换元,即消去常数。

考虑形式 2an=an1+1an1,其特征方程为 2x=x+1x,解得 x=±1

an=bn1=cn+1,代入后可得

2(bn+1)=bn1+1+1bn1+12bn=bn12an1

2(cn1)=cn11+1cn112cn=cn12an1

上下相除,解得

bncn=(bn1cn1)2=(a11a1+1)2n1

回代 an,可解得

an=2Pn1+1,Pn=(a1+1a11)Qn,Qn=2n1

3. 三角换元( Trigonometric Conversion )

基本思想是通过倍角公式求解含根号以及幂指数的通项。在求解中建议借助形式匹配表,如下。

                                                                                                                  
sinx2x1x2or3x4x3or11x22

cosx2x21or4x33xor1+x2

tanx2x1x2orx33x3x21or1+x21x

cscxx22x21orx33x24or2x+2xx21

secxx22x2orx343x2or2x1+x

cotxx212xorx33x3x21orx+x2+1

                                                                                                                  

本文主要考虑形式 an=an1+2 an=2an121

对于 an=an1+2,考虑匹配 cos1+x2,令 an=kbn,解得

kbn=kbn1+2k2bn=k2bn1+12,令 k=2,可得 bn=bn1+12

回代 an 即可解得 an=2cos(12n1arccos(a12))

对于 an=2an121,考虑匹配 cosx2x21,令 an=cos(bn),解得

cos(bn)=2cos2(bn1)1=cos(2n1b1)

回代 an 即可解得 an=cos(2n1arccos(a1))

4.时间复杂度( Time Complexity )

若已知递推公式和初始值,则可进行线性递推,时间复杂度是 O(n),其中 n 表示我们递推到第 n 项,此

方法最简单也最常见。我们以斐波那契( Fibonacci )数列为例,已知 F1=1,F2=1,Fn=Fn1+Fn2,可以线性地递推到第 n 项,计算次数与 n 成正比。

若我们想更快地得到某数列第 n 项的值,其中一种方法是推导通项公式,例如斐波那契数列的通项公式为

Fn=(1+52)n(152)n5, F1=1, F2=1

我们可以直接将 n 代入计算得到 Fn,只需要一次计算,或者说只需要常数次计算,其计算次数与 n 无关,时间复杂度为 O(1),效率最高。

若无法求解通项公式,但递推表达式仍然是线性的,或者类似线性,可以通过矩阵递推的形式来加速。

我们仍然以斐波那契数为例,已知 Fn=Fn1+Fn2,我们构造答案矩阵 An=[FnFn1]

还需要一个累乘矩阵 B,我们期望得到

An=An1B

矩阵 B 的维数是任意的,不妨先尝试 2×2 的矩阵,设其为

B=[abcd]

解得

An1B=[aFn1+cFn2bFn1+dFn2]=An

{aFn1+cFn2=Fn=Fn1+Fn2bFn1+dFn2=Fn1

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

B=[1110]

根据我们的定义 An=[FnFn1],数列第 n 项的值即为矩阵中左边这一项的值。而由 An=An1B

可以得到 An=A2Bn2,用 A2 来递推而不是 A1 是因为 A1=[F1F0]F0 这一项我们无法计算

A2 是一个已知量,等于 [11],所以我们只需要求出 Bn2,用分治的思想可以快速求解。

假设我们要求出 1145141919810 的值,朴素的做法是将 1114514 相乘 1919810 次,这样算虽然简单但效率太低。可以通过对指数的二进制分割将幂运算分割成更小的任务。

1919810 用二进制表示为 (111010100101101000010)2,即其可以表示为

1919810=21+26+28+29+211+214+216+218+219+220

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

行了。换句话说,如果将指数 m 写成 (ntnt1n1n0)2,其中 ni{0,1},那么有

n=nt2t+nt12t1++n121+n020

An=A(nt2t+nt12t1++n121+n020)

An=Ant2tAnt12t1An121An020

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

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

posted on   _Reborn  阅读(162)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

点击右上角即可分享
微信分享提示