178 lines
5.6 KiB
Typst
178 lines
5.6 KiB
Typst
#import "@preview/cetz:0.4.2"
|
|
Section 6.4
|
|
|
|
#title[Binomial coefficients, formula and identities]
|
|
= Binomial coefficient
|
|
From last week:
|
|
|
|
$C(n, k) = $ the number of k-combinations from an n-set. Or the number of ways to select k elements from an n-set. Or the number of k-subsets of an n-set. Formula: $n!/(k!-(n-k)!)=mat(n;k)$ for $0<=k<=n$
|
|
|
|
|
|
== Pascal's triangle
|
|
#align(center, grid(columns: 2, column-gutter: 1em, cetz.canvas({
|
|
import cetz.draw: *
|
|
|
|
let n = 6
|
|
|
|
// calculate the triangle
|
|
let pascal = ()
|
|
for row in range(n + 1) {
|
|
let row-data = ()
|
|
for col in range(row + 1) {
|
|
let value = if col == 0 or col == row {
|
|
1
|
|
} else {
|
|
let prev = pascal.at(row - 1)
|
|
prev.at(col - 1) + prev.at(col)
|
|
}
|
|
row-data.push(value)
|
|
}
|
|
pascal.push(row-data)
|
|
}
|
|
|
|
// draw lines
|
|
for (row-idx, row) in pascal.enumerate() {
|
|
if row-idx < n {
|
|
let row-len = row.len()
|
|
let y = n - row-idx
|
|
for (col-idx, val) in row.enumerate() {
|
|
let x = col-idx - row-len / 2 + 0.5
|
|
|
|
let next-row-len = row-len + 1
|
|
let left-child-x = col-idx - next-row-len / 2 + 0.5
|
|
let right-child-x = (col-idx + 1) - next-row-len / 2 + 0.5
|
|
let child-y = y - 1
|
|
|
|
line((x, y / 1.5), (left-child-x, child-y / 1.5), stroke: gray)
|
|
line((x, y / 1.5), (right-child-x, child-y / 1.5), stroke: gray)
|
|
}
|
|
}
|
|
}
|
|
|
|
// draw values
|
|
for (row-idx, row) in pascal.enumerate() {
|
|
let row-len = row.len()
|
|
let y = (n - row-idx) / 1.5
|
|
for (col-idx, val) in row.enumerate() {
|
|
let x = col-idx - row-len / 2 + 0.5
|
|
circle((x, y), radius: 0.25, fill: white, stroke: none, name: "c-" + str(row-idx) + "-" + str(col-idx))
|
|
content((x, y), $binom(#str(row-idx), #str(col-idx))$)
|
|
}
|
|
}
|
|
|
|
// draw n
|
|
for i in range(n + 1) {
|
|
content((rel: (-2, 0), to: ("c-" + str(i) + "-0", "-|", "c-" + str(n - 1) + "-0")), [n=#i])
|
|
}
|
|
}), cetz.canvas({
|
|
import cetz.draw: *
|
|
|
|
let n = 6
|
|
|
|
// calculate the triangle
|
|
let pascal = ()
|
|
for row in range(n + 1) {
|
|
let row-data = ()
|
|
for col in range(row + 1) {
|
|
let value = if col == 0 or col == row {
|
|
1
|
|
} else {
|
|
let prev = pascal.at(row - 1)
|
|
prev.at(col - 1) + prev.at(col)
|
|
}
|
|
row-data.push(value)
|
|
}
|
|
pascal.push(row-data)
|
|
}
|
|
|
|
// draw lines
|
|
for (row-idx, row) in pascal.enumerate() {
|
|
if row-idx < n {
|
|
let row-len = row.len()
|
|
let y = n - row-idx
|
|
for (col-idx, val) in row.enumerate() {
|
|
let x = col-idx - row-len / 2 + 0.5
|
|
|
|
let next-row-len = row-len + 1
|
|
let left-child-x = col-idx - next-row-len / 2 + 0.5
|
|
let right-child-x = (col-idx + 1) - next-row-len / 2 + 0.5
|
|
let child-y = y - 1
|
|
|
|
line((x, y / 1.5), (left-child-x, child-y / 1.5), stroke: gray)
|
|
line((x, y / 1.5), (right-child-x, child-y / 1.5), stroke: gray)
|
|
}
|
|
}
|
|
}
|
|
|
|
// draw values
|
|
for (row-idx, row) in pascal.enumerate() {
|
|
let row-len = row.len()
|
|
let y = (n - row-idx) / 1.5
|
|
for (col-idx, val) in row.enumerate() {
|
|
let x = col-idx - row-len / 2 + 0.5
|
|
circle((x, y), radius: 0.25, fill: white, stroke: none, name: "c-" + str(row-idx) + "-" + str(col-idx))
|
|
content((x, y), str(val))
|
|
}
|
|
}
|
|
})))
|
|
|
|
#figure(image("Pascals triangle-2.png"),caption: [Another form of Pascals triangle. It is mirrored])
|
|
|
|
Binomial identity:
|
|
|
|
$ mat(n;k) = mat(n;n-k) $
|
|
You can do analytic proof (mathematic proof using the formulas) or the combinatorial proof (count it in one way to get first result, then in a different way to get the other result).
|
|
|
|
*Combinatorial proof for $mat(n;k)=mat(n;n-k)$:* You could say that for n people, you ask k people to walk out the door, or you could ask `n-k` people to stay in the room.
|
|
|
|
In Pascal's triangle, adding the rows:
|
|
$ mat(n;0)+mat(n;1)+mat(n;2)+dots+(n;n)=sum^n_(k=0)mat(n;k)=2^k $
|
|
|
|
= Binomial identity
|
|
For $mat(n;k)$ you can also write $mat(n-1;k)+mat(n-1;k-1)$. It is called Pascal's identity.
|
|
#image("pascals identity.png")
|
|
|
|
= Binomial formula
|
|
$ (x+y)¹=x¹+y¹\
|
|
(x+y)²=x²+2x y+y²\
|
|
(x+y)³=x³ + 3x²y + 3x y³ + y³\
|
|
(x+y)⁴=x⁴+4x³y+6x²y²+4x y³+y⁴
|
|
$
|
|
Note for each $x^(a)y^(b)$, you have $(x+y)^(a+b)$
|
|
|
|
You also have that the coefficients (for $(x+y)⁴$ you have 1,4,6,4,1) they follow Pascal's triangle
|
|
|
|
== The formula
|
|
$ (x+y)^n&=mat(n;0)x^n+mat(n;1)x^(n-1) y + mat(n;2)x^(n-2)y²+dots+mat(n;n-1)x y^(n-1)+mat(n;n)y^n\
|
|
&=sum^n_(k=0) mat(n;k)x^(n-k)y^k $
|
|
|
|
$ (x+y)^n=sum^n_(k=0)mat(n;k)x^k y^(n-k)$
|
|
|
|
== Proof by induction with respect to `n`
|
|
*Basis step:* Put $n=1$ and prove that the formular is true:
|
|
$ (x+y)¹&=mat(1;0)dot x⁰ dot y¹ + mat(1;1)dot x¹ dot y⁰\
|
|
&=y+x $
|
|
*Induction step:* Assume true for `n-1`, then prove that it's then true for `n`:
|
|
$ (x+y)^(n-1)=sum^(n-1)_(k=0)mat(n-1;k)x^k y^(n-1-k) $
|
|
$
|
|
(x+y)^n&=(x+y)dot (x+y)^(n-1) \
|
|
&= (x+y)dot sum^(n-1)_(k=0)mat(n-1;k)x^k y^(n-1-k)\
|
|
&=sum^(n-1)_(k=0)mat(n-1;k)x^(k+1)y^(n-1-k)+sum^(n-1)_(k=0)mat(n-1;k)x^k y^(n-k)\
|
|
&= x^n+ sum^(n-2)_(k=0)mat(n-1;k)x^(k+1)y^(n-1-k) + sum^(n-1)_(k=1)mat(n-1;k)x^k y^(n-k)+y^n\
|
|
&"Replace k+1 with k"\
|
|
&= x^n+ sum^(n-1)_(k=1)mat(n-1;k-1)x^(k)y^(n-k) + sum^(n-1)_(k=1)mat(n-1;k)x^k y^(n-k)+y^n\
|
|
& "Note from pascals identity:" mat(n-1;k-1) + mat(n-1;k) = mat(n;k)\
|
|
$
|
|
|
|
*Combinatorial Proof:*
|
|
|
|
Consider expanding $(x+y)^n = (x+y)(x+y)dots.c(x+y)$ (n factors).
|
|
|
|
To get a term $x^(n-k)y^k$, we must:
|
|
- Choose $k$ of the $n$ factors to contribute a $y$ (the rest contribute $x$)
|
|
- There are $binom(n,k)$ ways to do this
|
|
|
|
Therefore, the coefficient of $x^(n-k)y^k$ is $binom(n,k)$.
|
|
|
|
= Van der Mande
|
|
$mat(m+n;r)=sum^r_(k=0)mat(m;r-k) mat(n;k)$ |