Using generating functions to solve recurrence relations

前几天在《Discrete Mathematics and its Applications》上看到了这三道题,均要求使用生成函数求解,题目如下:

  1. ak = ak-1 + 2ak-2 + 2k, a0 = 4, a1 = 12
  2. ak = 4ak-1 - 4ak-2 + k2, a0 = 2, a1 = 5
  3. ak = 2ak-1 - 3ak-2 + 4k + 6, a0 = 20, a1 = 60

昨天在StackExchange[1]上询问之后,今天花了一早上的时间做了一遍,下面就是完整的步骤和总结。

  • Problem 1

 ak=ak-1+2ak-2+2k a0=4 a1=12

我们首先令f(x)为序列{ak}的生成函数,即

fx=k0akxk

然后我们对递推关系式(也就是上面大括号中的第一个式子)中的每一项都乘以xk,得

akxk=ak-1xk+2ak-2xk+2kxk

接着对每一项都取k从2开始的和

k2akxk=k2ak-1xk+k22ak-2xk+k22kxk

= k2ak-1xk+2k2ak-2xk+k22kxk

在这之后我们将对每一项都进行变形,变形之后将会消去求和符号。变形的目标是将和式写为f(x)和已知的项的和。

k2akxk=k2akxk+a1x+a0-a1x-a0

=k0akxk-a1x-a0

= fx-4x-12


k2ak-1xk=xk2ak-1xk-1

= xk1akxk

= xk0akxk-a0

= xfx-4


k2ak-2xk=x2k2ak-2xk-2

= x2k0akxk

= x2fx


k22kxk=k02kxk-2x

=11-2x-1-2x-1

现在我们将变形后的式子替换回去

fx-4x-12=xfx-4+2x2fx+11-2x-2x-1
合并同类项,然后分解分式多项式得

fx=23·11-2x2+389·11-2x-89·11+x

根据生成函数与序列{ak}的关系,可得

ak=23C2+k-12-12k+389·2k-89·-1k

=231+k2k+389·2k-89·-1k

=449·2k+23k·k3-89·-1k
至此,我们解出了满足递推关系和初始条件的解
  • Problem 2

 ak=4ak-1-4ak-2+k2 a0=2 a1=5

我们首先令f(x)为序列{ak}的生成函数,即

fx=k0akxk

然后我们对递推关系式(也就是上面大括号中的第一个式子)中的每一项都乘以xk,得

akxk=4ak-1xk-4ak-2xk+k2xk

接着对每一项都取k从2开始的和

k2akxk=k24ak-1xk-k24ak-2xk+k2k2xk

= 4k2ak-1xk-4k2ak-2xk+k2k2xk

在这之后我们将对每一项都进行变形,变形之后将会消去求和符号。变形的目标是将和式写为f(x)和已知的项的和。

k2akxk=k2akxk+a1x+a0-a1x-a0

=k0akxk-a1x-a0

= fx-5x-2


k2ak-1xk=xk2ak-1xk-1

= xk1akxk

= xk0akxk-a0

= xfx-2


k2ak-2xk=x2k2ak-2xk-2

= x2k0akxk

= x2fx

最后的这个k2的和式处理稍微复杂一些

k2k2xk=k0k2xk-x

=xk0k2xk-1-x

=xk0kkxk-1-x

化简到这一步之后,下面我们对和式积分,然后再求导

=xk0kxk'-x

=xxk0kxk-1'-x

再来一次

=xxk0xk''-x

到了这一步之后就简单了

=xx11-x''-x

=xx1-x2'-x

=x1+x1-x3-x

现在我们将变形后的式子替换回去

fx-5x-2=4xfx-2-4x2fx+x1+x1-x3-x

合并同类项,然后分解分式多项式得

fx=21-x3+51-x2+131-x+61-2x2-241-2x

根据生成函数与序列{ak}的关系,可得

ak=2C3+k-13-1+5C2+k-12-1+13+6C2+k-12-12k-24·2k

=22+k1+k2+51+k+13+61+k2k-24·2k

展开、合并同类项

=2+13+5+6·2k-24·2k+3k+5k+6k·2k+k2

=20-18·2k+8k+6k·2k+k2

至此,我们解出了满足递推关系和初始条件的解
  • Problem 3

Problem 3的和处理方式前面的Problem 1十分相似,这里不再给出解答。
  • 总结

一般来讲,使用生成函数求解递推关系第一步是在递推关系式的各项上乘以xk,然后取k>=m(m为递推关系式的阶数,即如果是二阶递推关系式m就取2)时的和式并分别变形,最后通过生成函数f(x)与序列ak的关系解出。

  • References

[1]: How to solve these recurrence relations bu using generating function

Hot pot & prodigals

一眨眼国庆就完了,可以说是以和梅浪的火锅开始、和梅浪的火锅结束的一个国庆节(首尾呼应阿拉wwwww)。

Prodigals

  • Facing the possibilities

和梅浪聊过之后,更坚定了这样的一些想法:仅仅是学Computer Science就太无聊了,真的应该多学习一些其它的科目,我现在自己想学的,绝不是以否赚钱、好找工作作为方向,而是希望能有一个更好的途径去了解这个世界是怎么运行的。何况

生活正是因为未知才有趣。

我说这话绝不是想表达我对Computer Science已经了如指掌了,而是真心觉得自己不能被限制在Computer Science里面,应该去面对更多的可能性。

可能你会说能真正学好一样就很不错了。的确,在Computer Science类里,小到data structure,algorithm,大到IoT,AI都可以单独拿出来写好多书,它们在实际生活中用处也十分广泛。但是学习另一科目会让你用一种新的方式来审视以前学习的知识,跳出在以前科目中形成的思维定势。

 

  • Prodigals

梅子国庆节中间去了一趟北京,在那边吃了一顿火锅,他的感受大致如下,

北京的火锅很努力地想让自己辣起来,然而并没有做到。

后来我想到,我们的很多老师也是这样,其实他们也很想把所有人教好,但无奈教材比较坑,而且多数学生也只是想混到毕业,在这样的现实条件下,大概很难有动力去做好这些事。

于是对于我们来讲,我们只能自己坑,自己去寻找好的书,好的课程。于我而言,我现在就读的学校课业压力应该是算小的,这就给了我足够多的自学时间来填上自己挖的坑。

躺在治疗颈椎病/腰椎病的病床上,想起来那个遥远的、在志愿书上写下了Computer Science/桥梁工程的那个下午的我,真想一大耳巴子扇过去><

当然,上面治疗颈椎病/腰椎病可能在多年以后会是真的,想起来那个遥远的夏日的自己也是真的,不过最后一句大概就只是玩笑话了。