Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
Download
88 views
ubuntu2004
Kernel: SageMath 9.4

Faktoriál

factorial(10)
3628800
for n in range(11): print(f"{n}! = ", factorial(n))
0! = 1 1! = 1 2! = 2 3! = 6 4! = 24 5! = 120 6! = 720 7! = 5040 8! = 40320 9! = 362880 10! = 3628800
(n+1)!=(n+1)n!(n+1)! = (n+1)n!
M = {"a", "b", "c"} p = Permutations(M) print(p) p.list()
Permutations of the set ['b', 'c', 'a']
[['b', 'c', 'a'], ['b', 'a', 'c'], ['c', 'b', 'a'], ['c', 'a', 'b'], ['a', 'b', 'c'], ['a', 'c', 'b']]
bool(p.cardinality() == factorial(3))
True
P = Subsets(M) P.cardinality() #Subsets(M).list()
8
P.list()
[{}, {'b'}, {'c'}, {'a'}, {'b', 'c'}, {'b', 'a'}, {'c', 'a'}, {'b', 'c', 'a'}]
Subsets(M, 2).list()
[{'b', 'c'}, {'b', 'a'}, {'c', 'a'}]

Počet permutací n-prvkové množiny bez opakování = n!n!

Binomická čísla

(nk)=n!(nk)!k!.\binom{n}{k} = \frac{n!}{(n-k)!k!}.
b = binomial(3, 1) b
3
(a+b)n=i=0n(ni)anibi(a + b)^n = \sum_{i=0}^n \binom{n}{i}a^{n-i}b^i

Úloha. Uvažujme karetní hru "Poker." Tato hra se hraje s balíkem 4x13 karet. Má zde 4 barvy: srdce, káry, piky a kříže.

Barvy = Set(["Srdce", "Káry", "Piky", "Kříže"]) Hodnoty = Set([2, 3, 4, 5, 6, 7, 8, 9, 10, "Kluk", "Královna", "Král", "Eso"]) Karty = cartesian_product([Hodnoty, Barvy]) Karty
The Cartesian product of ({2, 3, 4, 5, 6, 7, 8, 9, 10, 'Královna', 'Král', 'Eso', 'Kluk'}, {'Kříže', 'Piky', 'Káry', 'Srdce'})
list(Karty)
[(2, 'Kříže'), (2, 'Piky'), (2, 'Káry'), (2, 'Srdce'), (3, 'Kříže'), (3, 'Piky'), (3, 'Káry'), (3, 'Srdce'), (4, 'Kříže'), (4, 'Piky'), (4, 'Káry'), (4, 'Srdce'), (5, 'Kříže'), (5, 'Piky'), (5, 'Káry'), (5, 'Srdce'), (6, 'Kříže'), (6, 'Piky'), (6, 'Káry'), (6, 'Srdce'), (7, 'Kříže'), (7, 'Piky'), (7, 'Káry'), (7, 'Srdce'), (8, 'Kříže'), (8, 'Piky'), (8, 'Káry'), (8, 'Srdce'), (9, 'Kříže'), (9, 'Piky'), (9, 'Káry'), (9, 'Srdce'), (10, 'Kříže'), (10, 'Piky'), (10, 'Káry'), (10, 'Srdce'), ('Královna', 'Kříže'), ('Královna', 'Piky'), ('Královna', 'Káry'), ('Královna', 'Srdce'), ('Král', 'Kříže'), ('Král', 'Piky'), ('Král', 'Káry'), ('Král', 'Srdce'), ('Eso', 'Kříže'), ('Eso', 'Piky'), ('Eso', 'Káry'), ('Eso', 'Srdce'), ('Kluk', 'Kříže'), ('Kluk', 'Piky'), ('Kluk', 'Káry'), ('Kluk', 'Srdce')]
pocet_karet = Karty.cardinality() pocet_karet
52
Hodnoty.cardinality()
Barvy.cardinality()
4
# Vytáhněme náhodně jednu kartu: Karty.random_element()
(7, 'Piky')
# Vytáhněme náhodně dvě karty: Set([Karty.random_element(), Karty.random_element()])
{('Eso', 'Kříže'), (10, 'Kříže')}

V naší verzi hry si každý hráč dostane pětici různých karet. Pořadí ve kterém jsou karty obdrženy nehraje roli. Tato pětice tvaří tzv. "hand."

# vyberme náhodně pětici karet: Hands = Subsets(Karty, 5) Hands.random_element()
{(4, 'Káry'), ('Královna', 'Srdce'), (5, 'Srdce'), ('Král', 'Srdce'), ('Kluk', 'Káry')}
# Počet možných rozdání je roven binomickému číslu: počet_pětic = binomial(52, 5) počet_pětic
2598960
# jinak lze zjistit počet prvků množiny Hands: Hands.cardinality()
2598960

Popišme jednu výherní kombinaci karet, které říkáme anglicky "flush". Pětice karet tvoří flush, pokud jsou všechny stejné barvy. Zjistěme, jaká je pravděpodobnost, že hráč obdrží při náhodném rozdání kombinaci flush!

# Vytvořme všechny možné výherní kombinace typu flush a uložme je do proměnné s názvem Flushes: Flushes = cartesian_product([Subsets(Hodnoty, 5), Barvy]) print(Flushes.cardinality()) Pravd = Flushes.cardinality() / Hands.cardinality() print(Pravd)
5148 33/16660
# Uveďmě pravděpodobnost v jednotkách promile: promile = 1000 * Pravd print(f"Ptavděpodobnost, že hráč obdrží kombinaci 'flush' je rovna přibližně {round(promile, 1)} promile!" )
Ptavděpodobnost, že hráč obdrží kombinaci 'flush' je rovna přibližně 2.0 promile!

Úloha. Ověřte ručním výpočtem správnost tohoto výsledku!

def is_flush(hand): return len(set(barva for (hodnota, barva) in hand)) == 1
pocet_rozdani = 1000000 pocet_flush = 0 for i in range(pocet_rozdani): hand = Hands.random_element() if is_flush(hand): pocet_flush += 1 print(pocet_rozdani, pocet_flush) print(float(1000 * pocet_flush / pocet_rozdani), "promile")
1000000 1976 1.976 promile
S = FiniteEnumeratedSet(["a", "b"]) for element in S: print(element)
a b
S.cardinality()
2
Arrangements?
M = set([1, 2, 3]) Arrangements(M, 2).list()
[[1, 2], [1, 3], [2, 1], [2, 3], [3, 1], [3, 2]]
Arrangements({1, 2, 3}, 2).list()
[[1, 2], [1, 3], [2, 1], [2, 3], [3, 1], [3, 2]]
Arrangements({1, 2, 3}, 2).cardinality()
6

Úloha. Řešte nyní samostatně tuto úlohu:

vypočítejte, jaká je pravděpodobnost, že hráč obdrží při rozdání pěti karet výherní kombinaci, které se říká "four-of-a-kind". Znamená to, že hráč má v ruce čtyři karty stejné hodnoty.

Barvy = FiniteEnumeratedSet(["Srdce", "Káry", "Piky", "Kříže"]) Hodnoty = FiniteEnumeratedSet([2, 3, 4, 5, 6, 7, 8, 9, 10, "Kluk", "Královna", "Král", "Eso"]) FourOfaKind = cartesian_product([Arrangements(Hodnoty, 2), Barvy])
k = 4 mnozina = set([x for x in range(k)]) mnozina
{0, 1, 2, 3}
Arrangements(mnozina, 2).list()
[[0, 1], [0, 2], [0, 3], [1, 0], [1, 2], [1, 3], [2, 0], [2, 1], [2, 3], [3, 0], [3, 1], [3, 2]]
FourOfaKind.list()
FourOfaKind[0]
([2, 3], 'Srdce')
FourOfaKind.cardinality()
624
binomial(52, 5)
2598960
Karty = cartesian_product([Hodnoty, Barvy]) Hands = Subsets(Karty, 5) p = FourOfaKind.cardinality() / Hands.cardinality() p = float(p) p
0.00024009603841536616
print(f"Pravděpodobnost je rovna {round(1000 * p, 2)} promile.")
Pravděpodobnost je rovna 0.24 promile.
WeightedIntegerVectors(100 - 36, [1, 2, 5, 10, 20, 50]).cardinality()
969
r = WeightedIntegerVectors(50 - 18, [1, 2, 5, 10, 20]) r.list()
[[0, 1, 0, 1, 1], [2, 0, 0, 1, 1], [0, 1, 2, 0, 1], [2, 0, 2, 0, 1], [1, 3, 1, 0, 1], [3, 2, 1, 0, 1], [5, 1, 1, 0, 1], [7, 0, 1, 0, 1], [0, 6, 0, 0, 1], [2, 5, 0, 0, 1], [4, 4, 0, 0, 1], [6, 3, 0, 0, 1], [8, 2, 0, 0, 1], [10, 1, 0, 0, 1], [12, 0, 0, 0, 1], [0, 1, 0, 3, 0], [2, 0, 0, 3, 0], [0, 1, 2, 2, 0], [2, 0, 2, 2, 0], [1, 3, 1, 2, 0], [3, 2, 1, 2, 0], [5, 1, 1, 2, 0], [7, 0, 1, 2, 0], [0, 6, 0, 2, 0], [2, 5, 0, 2, 0], [4, 4, 0, 2, 0], [6, 3, 0, 2, 0], [8, 2, 0, 2, 0], [10, 1, 0, 2, 0], [12, 0, 0, 2, 0], [0, 1, 4, 1, 0], [2, 0, 4, 1, 0], [1, 3, 3, 1, 0], [3, 2, 3, 1, 0], [5, 1, 3, 1, 0], [7, 0, 3, 1, 0], [0, 6, 2, 1, 0], [2, 5, 2, 1, 0], [4, 4, 2, 1, 0], [6, 3, 2, 1, 0], [8, 2, 2, 1, 0], [10, 1, 2, 1, 0], [12, 0, 2, 1, 0], [1, 8, 1, 1, 0], [3, 7, 1, 1, 0], [5, 6, 1, 1, 0], [7, 5, 1, 1, 0], [9, 4, 1, 1, 0], [11, 3, 1, 1, 0], [13, 2, 1, 1, 0], [15, 1, 1, 1, 0], [17, 0, 1, 1, 0], [0, 11, 0, 1, 0], [2, 10, 0, 1, 0], [4, 9, 0, 1, 0], [6, 8, 0, 1, 0], [8, 7, 0, 1, 0], [10, 6, 0, 1, 0], [12, 5, 0, 1, 0], [14, 4, 0, 1, 0], [16, 3, 0, 1, 0], [18, 2, 0, 1, 0], [20, 1, 0, 1, 0], [22, 0, 0, 1, 0], [0, 1, 6, 0, 0], [2, 0, 6, 0, 0], [1, 3, 5, 0, 0], [3, 2, 5, 0, 0], [5, 1, 5, 0, 0], [7, 0, 5, 0, 0], [0, 6, 4, 0, 0], [2, 5, 4, 0, 0], [4, 4, 4, 0, 0], [6, 3, 4, 0, 0], [8, 2, 4, 0, 0], [10, 1, 4, 0, 0], [12, 0, 4, 0, 0], [1, 8, 3, 0, 0], [3, 7, 3, 0, 0], [5, 6, 3, 0, 0], [7, 5, 3, 0, 0], [9, 4, 3, 0, 0], [11, 3, 3, 0, 0], [13, 2, 3, 0, 0], [15, 1, 3, 0, 0], [17, 0, 3, 0, 0], [0, 11, 2, 0, 0], [2, 10, 2, 0, 0], [4, 9, 2, 0, 0], [6, 8, 2, 0, 0], [8, 7, 2, 0, 0], [10, 6, 2, 0, 0], [12, 5, 2, 0, 0], [14, 4, 2, 0, 0], [16, 3, 2, 0, 0], [18, 2, 2, 0, 0], [20, 1, 2, 0, 0], [22, 0, 2, 0, 0], [1, 13, 1, 0, 0], [3, 12, 1, 0, 0], [5, 11, 1, 0, 0], [7, 10, 1, 0, 0], [9, 9, 1, 0, 0], [11, 8, 1, 0, 0], [13, 7, 1, 0, 0], [15, 6, 1, 0, 0], [17, 5, 1, 0, 0], [19, 4, 1, 0, 0], [21, 3, 1, 0, 0], [23, 2, 1, 0, 0], [25, 1, 1, 0, 0], [27, 0, 1, 0, 0], [0, 16, 0, 0, 0], [2, 15, 0, 0, 0], [4, 14, 0, 0, 0], [6, 13, 0, 0, 0], [8, 12, 0, 0, 0], [10, 11, 0, 0, 0], [12, 10, 0, 0, 0], [14, 9, 0, 0, 0], [16, 8, 0, 0, 0], [18, 7, 0, 0, 0], [20, 6, 0, 0, 0], [22, 5, 0, 0, 0], [24, 4, 0, 0, 0], [26, 3, 0, 0, 0], [28, 2, 0, 0, 0], [30, 1, 0, 0, 0], [32, 0, 0, 0, 0]]
len([p for p in r if p[1] == 0])
16
Partitions(10).cardinality()
--------------------------------------------------------------------------- TypeError Traceback (most recent call last) <ipython-input-35-4e3b9d07dcef> in <module> ----> 1 Partitions(Integer(10), Integer(3)).cardinality() /ext/sage/9.4/local/lib/python3.9/site-packages/sage/misc/classcall_metaclass.pyx in sage.misc.classcall_metaclass.ClasscallMetaclass.__call__ (build/cythonized/sage/misc/classcall_metaclass.c:1761)() 320 """ 321 if cls.classcall is not None: --> 322 return cls.classcall(cls, *args, **kwds) 323 else: 324 # Fast version of type.__call__(cls, *args, **kwds) TypeError: __classcall_private__() takes from 1 to 2 positional arguments but 3 were given
Partitions(4).list()
[[4], [3, 1], [2, 2], [2, 1, 1], [1, 1, 1, 1]]
1 + 4 + 2*binomial(4, 2) + 1
18
binomial(4, 2)
6
M = set(["a", "b", "c", "d"]) M
{'a', 'b', 'c', 'd'}
rozklad = SetPartitions(M) print(rozklad.list()) rozklad.cardinality()
[{{'a', 'b', 'c', 'd'}}, {{'a', 'b', 'c'}, {'d'}}, {{'a', 'b', 'd'}, {'c'}}, {{'a', 'b'}, {'c', 'd'}}, {{'a', 'b'}, {'c'}, {'d'}}, {{'a', 'c', 'd'}, {'b'}}, {{'a', 'c'}, {'b', 'd'}}, {{'a', 'c'}, {'b'}, {'d'}}, {{'a', 'd'}, {'b', 'c'}}, {{'a'}, {'b', 'c', 'd'}}, {{'a'}, {'b', 'c'}, {'d'}}, {{'a', 'd'}, {'b'}, {'c'}}, {{'a'}, {'b', 'd'}, {'c'}}, {{'a'}, {'b'}, {'c', 'd'}}, {{'a'}, {'b'}, {'c'}, {'d'}}]
15
for p in Primes(): if p < 1000: print(p) else: break