Kombinatorikk
Contents
Kombinatorikk#
Kombinatorikk handlar om å finna antall kombinasjonar. I dette kapittelet ser me litt på korleis me kan gjera det gjennom programmering - både heilt grunnleggande med løkker og med funksjonar andre har laga.
Ordna utval med tilbakelegging.#
Me trekk eit utval på \(r\) element frå ein populasjon med \(n\) element.
Moglege kombinasjonar er då $\( n\cdot n \cdot n \cdot \ldots \cdot n = n^r \)$
Ordna utval: rekkefølgen er viktig
Med tilbakelegging: kvart element i populasjonen kan trekkast fleire gongar.
n = 5 # populasjon
r = 3 # utval
komb = n**r # kombinasjonar
print(f"Kombinasjonar: {komb}")
Kombinasjonar: 125
Ordna utval utan tilbakelegging.#
Trekk eit utval på \(r\) element på ein populasjon på \(n\).
Moglege kombinasjonar er då $\( _n P _r = n\cdot (n-1) \cdot (n-2) \cdot \ldots \cdot (n-r+1)\)$
Ordna utval: rekkefølgen er viktig
Utan tilbakelegging: når eit element er trekt kan det ikkje trekkast igjen
n = 5 # populasjon
r = 3 # utval
komb = 1 # startverdi (1 pga multiplikasjon)
for i in range(r):
komb *= (n-i)
print(f"Kombinasjonar: {komb}")
Kombinasjonar: 60
Fakultet#
Når \(n = r\) når me ser på ordna utval utan tilbakelegging gjer me eit utval som er like stort som populasjonen. I praksis vil det då bli kor mange forskjellige måtar me kan ordna populasjonen.
Trekk eit utval på \(n\) element på ein populasjon på \(n\).
Moglege kombinasjonar er då $\( _n P _n = n\cdot (n-1) \cdot (n-2) \cdot \ldots \cdot 2\cdot 1\)$
Dermed får me $\( _n P _n = n! = 1 \cdot 2 \cdot \ldots \cdot (n-2)\cdot (n-1) \cdot n \)$
\(n!\) les me som n fakultet og er produktet av alle dei naturlege tala frå og med \(1\) til og med \(n\)
n = 20
komb = 1
for i in range(n):
komb *= (n-i)
print(f"Elementa kan ordnast på {komb} måtar")
Elementa kan ordnast på 2432902008176640000 måtar
Uordna utval#
Binomialkoeffesient, \(_n C_r\), er måten me kan trekka eit utval på \(r\) frå ein populasjon på \(n\) når rekkefølgen ikkje er viktig. $\( \left({n}\atop{r}\right) = \frac{_n P_r}{r!} = \frac{n!}{r!\cdot (n-r)!}\)$
Me kan rekna denne ut i Python med å bruka SciPy-biblioteket:
import scipy.special as sc
n = 5
r = 3
# nCr - uordna utval
uordna = sc.comb(n, r, exact = True)
print(f"nCr = {uordna}")
nCr = 10
SciPy til ordna utval og fakultet#
Me kan bruka scipy.special
til å rekna ut fakultet og permutasjonar òg:
import scipy.special as sc
n = 5
r = 3
# n! - fakultet
fakultet = sc.factorial(n, exact = True)
print(f"n! = {fakultet}")
# nPr - permutasjonar - ordna utval
ordna = sc.perm(n, r, exact = True) # nøyaktig, ikkje tilnærma...
print(f"nPr = {ordna}")
n! = 120
nPr = 60