Sayım algoritmaları tasarlarken, oluşturma işlevleri kullanışlıdır. Yani, sadece belirli bir özelliğe sahip nesnelerin sayısını ararken değil, aynı zamanda bu nesneleri numaralandırmanın bir yolunu ararken (ve belki de nesneleri saymak için bir algoritma oluştururken). Ronald Graham, Donald Knuth ve Oren Patashnik'in Beton Matematiği'nin 7. bölümünde çok iyi bir sunum var . Aşağıdaki örnekler bu kitaplardan alınmıştır (hatalar ve açıklık eksikliği benimdir).
Belirli bir jeton seti ile değişiklik yapmanın yollarını aradığınızı varsayalım. Örneğin, ortak ABD mezhepleri¹ ile, olası paralar . Değişen ¢ 42 vermek için bir olasılık [ 25 ] [ 10 ] [ 5 ] [ 1 ] [ 1 ] ; bir başka olasılık da [ 10 ] [ 10 ] [ 10[1],[5],[10],[25],[100][25][10][5][1][1] . Biz yazacaksýn 42 ⟨ [ 25 ] [ 10 ] [ 5 ] [ 1 ] 2 ⟩ = ⟨ [ 10 ] 4 [ 1 ] 2 ⟩ . Daha genel olarak, değişiklik yapmanın tüm yolları için bir oluşturma işlevi yazabiliriz:
H = ∑ h ≥ 0 ∑ q ≥ 0 ∑ d ≥ 0 ∑[10][10][10][10][1][1]42⟨[25][10][5][1]2⟩=⟨[10]4[1]2⟩
Daha teknik terimlerleifade etmek gerekirse,Hkuvvet serisinin beş değişken üzerindeki uzayda bir terimidir[100],[25],[10],[5],[1]. Bu alandaki bir monomerin değerlemesini şu şekilde tanımlayın:
H=∑h≥0∑q≥0∑d≥0∑n≥0∑p≥0[100]h[25]q[10]d[5]n[1]p
H[100],[25],[10],[5],[1]
sonra elde yolları
h monomials değişim sent olan sayı olan değerlemesidir
hac . Biz ifade edebilen
H ilk yolu aşağı yazarak, artımlı bir şekilde
P birkaç kuruş vermek değişikliğine sadece, o zaman yollar
N⟨[100]h[25]q[10]d[5]n[1]p⟩=100h+25q+10d+5n+p
vvHPNIP=I+[1]+[1]2+[1]3+…=II−[1]N=(I+[5]+[5]2+[5]3+…)P=PI−[5]D=(I+[10]+[10]2+[10]3+…)N=NI−[10]Q=(I+[25]+[25]2+[25]3+…)D=DI−[25]H=(I+[100]+[100]2+[100]3+…)Q=QI−[100]
If you want to count and not just enumerate the ways to give change, then there is a simple way to use the formal series we've obtained. Apply the homomorphism
S:[1]↦X,[5]↦X5,[10]↦X10,[25]↦X25,[100]↦X100
The coefficient of
Xv in
S(C) is the number of ways to give
v cents in change.
A harder example: suppose that you want to study all the ways to tile rectangles with 2×1 dominoes. For example, there are two ways to tile a 2×2 rectangle, either with two horizontal dominoes or with two vertical dominoes. Counting the number of ways to tile a 2×n rectangle is fairly easy, but the 3×n case quickly becomes nonobvious. We can enumerate all the possible tilings of a horizontal band of height 3 by sticking dominoes together, which quickly yields repetitive patterns:
⎧⎩⎨⎪⎪⎪⎪⎪⎪U=o+LV+ΓΛ+≡UV=IU+=−VΛ=IU+−=Λ
where the funny shapes represent elementary domino arrangements:
o is no domino,
L is a vertical domino on top of the left part of a horizontal domino,
I is a vertical domino aligned with the bottom of the band of height 3,
−= is a horizontal domino aligned with the top of the band plus two horizontal dominoes below it and one step to the right, etc. Here, multiplication represents horizontal concatenation and is not commutative, but there are equations between the elementary patterns that form variables in this power series. As before with the coins, we can substitute
X for every domino and get a generating series for the number of tilings of a
3×(2n/3) rectangle (i.e. the coefficient of
X3k is the number of ways to tile a rectangle of area
6k, which contains
3k dominoes and has the width
2k). The series can also be used in more versatile ways; for example, by distinguishing vertical and horizontal dominoes, we can count the tilings with a given number of vertical and horizontal dominoes.
Again, read Concrete Mathematics for a less rushed³ presentation.
¹ I know my list is incomplete; assume a simplified US suitable for mathematical examples.²
² Also, if it comes up, assume spherical coins.
³ And better typeset.