在设计计数算法时,生成函数很有用。也就是说,不仅在寻找具有某种属性的对象的数量时,而且在寻找枚举这些对象的方法(并且可能会生成计算对象的算法)时。罗纳德·格雷厄姆(Ronald Graham),唐纳德·克努斯(Donald Knuth)和奥伦·帕塔什尼克(Oren Patashnik)在《具体数学》的第7章中做了非常好的介绍。下面的示例来自这些书(错误和缺乏清晰度是我的)。
假设您正在寻找使用给定硬币集进行更改的方法。例如,对于常见的美国面额¹,可能的硬币为。要给¢42零钱,一种可能性是;另一种可能性是。我们将写。更笼统地说,我们可以为所有更改方式编写生成函数:
在更专业的术语中,是在五个变量的幂级数空间中的一项[ 25 ] [ 10 ] [ 5 ] [ 1 ] [ 1 ] [ 10 ] [ 10 ] [ 10 ] [ 10 ] [ 1 ] [ 1 ] 42 ⟨ [ 25 ] [ 10 ][1],[5],[10],[25],[100][25][10][5][1][1][ 10 ] [ 10 ] [ 10 ] [ 10 ] [ 1 ] [ 1 ]ħ = Σ ħ ≥ 0 Σ q ≥ 0 Σ d ≥ 0 Σ Ñ ≥ 0 Σ p ≥ 0 [ 100 ] ^ h [ 25 ] q [ 10 ] d [ 5 ] n [ 1 ] p42 ⟨ [ 25 ] [ 10 ] [ 5 ] [ 1 ]2⟩ = ⟨ [ 10 ]4[ 1 ]2⟩
H= ∑ħ ≥ 0∑q≥ 0∑d≥ 0∑Ñ ≥ 0∑p ≥ 0[ 100 ]H[ 25 ]q[ 10 ]d[ 5 ]ñ[ 1 ]p
[ 100 ] ,[ 25 ] ,[ 10 ] ,[ 5 ] ,[ 1 ]H[ 100 ] ,[ 25 ] ,[ 10 ] ,[ 5 ] ,[ 1 ]。通过定义此空间中单项式的估值
然后,赋予分的改变的方法是,估值为的单身人士的数量。我们可以用递增的方式表示,方法是先写下仅改变便士的方法,然后写下改变便士和镍的方法,以此类推。(意思是没有硬币。)
v v⟨ [ 100 ]H[ 25 ]q[ 10 ]d[ 5 ]ñ[ 1 ]p⟩ = 100 小时+ 25 q+ 10 天+ 5 n + p
vvP Ñ 我P = 我+ [ 1 ] + [ 1 ] 2 + [ 1 ] 3 +HPñ一世P= 我+ [ 1 ] + [ 1 ]2+ [ 1 ]3+ … = 我一世− [ 1 ]ñ= (我+ [ 5 ] + [ 5 ]2+ [ 5 ]3+ … )P= P一世− [ 5 ]D = (我+ [ 10 ] + [ 10 ]2+ [ 10 ]3+ … )N= N一世− [ 10 ]Q = (我+ [ 25 ] + [ 25 ]2+ [ 25 ]3+ … )D = D一世− [ 25 ]H= (我+ [ 100 ] + [ 100 ]2+ [ 100 ]3+ … )Q = Q一世−[100]
如果您想计数而不只是列举更改的方法,那么有一种简单的方法可以使用我们获得的正式系列文章。应用同态
的系数在是的方式,得到数美分变化。
S:[1]↦X,[5]↦X5,[10]↦X10,[25]↦X25,[100]↦X100
Xv小号(C)v
一个更难的例子:假设您想研究所有用2×1多米诺骨牌平铺矩形的方法。例如,有两种方法可以使用两个水平多米诺骨牌或两个垂直多米诺骨牌来平铺2×2矩形。计算矩形的平铺方法相当容易,但是情况很快就变得不明显了。我们可以通过将多米诺骨贴在一起来枚举高度为3的水平带的所有可能的平铺,这会快速产生重复的模式:
3 × n2 × n3 × n
⎧⎩⎨⎪⎪⎪⎪⎪⎪ü= o + L V+ Γ Λ + ≡ ùV= 我ü+ =-VΛ =一世ü+-=Λ
其中有趣的形状代表基本的多米诺骨牌排列:不是多米诺骨牌,是水平多米诺骨牌左侧的垂直多米诺骨牌,是与高度3的条带的底部对齐的垂直多米诺骨牌,是与条带的顶部对齐的水平多米诺骨牌,其下还有两个水平的多米诺骨牌,向右走一步,在此,乘法表示水平级联,而不是可交换的,但是基本模式之间存在方程,这些方程构成该幂级数中的变量。与以前的硬币一样,我们可以用代替每个多米诺骨牌,并得到一个生成序列,用于生成
Ø大号一世-=X3 × (2 n / 3 )矩形(即的系数是平铺区域的矩形的方法的数量,该区域包含多米诺骨牌,宽度为)。该系列还可以更通用的方式使用。例如,通过区分垂直和水平的多米诺骨牌,我们可以计算给定数量的垂直和水平的多米诺骨牌。
X3 千6 千3 千2千
再次阅读“ 具体数学 ”以减少匆忙的演讲。
¹ 我知道我的清单不完整;假定适用于数学示例的简化美国
。²² 而且,如果出现这种情况,请假定球形硬币。
³ 和更好的排版。