Numerele lui Stirling. Numerele Bell
În acest articol voi prezenta trei elemente importante de combinatorică, ușor asemănătoare între ele: numerele lui Stirling de speța a II-a, numerele Bell și numerele lui Stirling de speța I. Ele sunt utile în problemele de combinatorică, pentru că primele două numără partițiile unei mulțimi, iar al treilea tip de numere este referitor la ciclurile unei permutări.
Numerele lui Stirling de speța a II-a
Numerele lui Stirling de speța a II-a reprezintă numărul de partiții ale unei mulțimi cu elemente în submulțimi, și se notează cu O partiție a unei mulțimi reprezintă un set de submulțimi nevide, disjuncte, a căror reuniune este mulțimea respectivă.
Formula pentru calcularea
Cazurile elementare pentru calcularea sunt:
- Prin convenție, adică există un singur mod de a partiționa mulțimea vidă în submulțimi.
- adică nu putem partiționa o mulțime de elemente în mai mult de submulțimi (este destul de logic, pentru că nu am avea de unde să punem elemente în ele).
- adică nu putem partiționa o mulțime nevidă în submulțimi (toate elementele ar rămâne pe afară).
Dacă și nu se încadrează în vreun caz de mai sus, atunci se poate calcula recurent, prin următoarea formulă:
Deducerea formulei
Formula nu trebuie învățată pe de rost. Ea se deduce ușor din modul prin care se formează partițiile. Pentru demonstrație, voi scrie partițiile mulțimii în submulțimi:
Pentru a forma partițiile lui în submulțimi, vom folosi partițiile de mai sus la care vom adăuga elementul Acesta poate fi adăugat în două moduri. Fie la fiecare partiție, într-o submulțime nouă, ce-l va conține doar pe el, fie într-una dintre submulțimile deja existente din fiecare partiție. Pornind de la prima partiție, adăugându-l pe vom obține:
Analog pentru celelalte partiții. Așadar, pentru cazul 1 obținem noi partiții, iar pentru cazul 2 obținem Coeficientul vine din faptul că în fiecare partiție veche avem submulțimi la care putem adăuga noul element.
Sursă C++ pentru calcularea
Putem folosi metoda programării dinamice pentru calcularea Vom reține într-o matrice rezultatele subproblemelor, mai exact
#include <bits/stdc++.h>using namespace std;
int main() { int n, k; cin >> n >> k; vector stir(n + 1, vector<int>(k + 1)); stir[0][0] = 1; for (int i = 1; i <= n; i++) for (int j = 1; j <= min(i, k); j++) stir[i][j] = stir[i - 1][j - 1] + j * stir[i - 1][j]; cout << stir[n][k] << '\n'; return 0;}
Numărul de funcții surjective
Aceasta e cea mai cunoscută problemă ce folosește numerele lui Stirling. Se dau mulțimile și cu și trebuie să determinăm numărul funcțiilor surjective definite pe cu valori în
O funcție este surjectivă dacă și numai dacă imaginea ei este egală cu codomeniul. Iată un exemplu de funcție surjectivă definită pe cu valori în
Iar așa arată toate funcțiile surjective definite pe cu valori în
Cu alte cuvinte, trebuie aflat numărul de moduri de a împărți elementele lui în grupe și de a asocia fiecărei dintre aceste grupe câte o valoare diferită din (adică valoarea pe care o va avea funcția aplicată numerelor din acel grup).
După această reformulare, problema devine destul de simplă. Numărul de partiții este dat de iar pe acesta îl înmulțim cu (numărul permutărilor de elemente), deoarece pentru fiecare partiție putem permuta în toate modurile posibile valorile asociate fiecărei submulțimi. Formula finală este:
Multe probleme de combinatorică, interpretate matematic, pot fi reduse la aceasta. De exemplu, problema 100m, dată la ONI 2017 la clasa a 10-a.
Bonus
Colorând cu alb numerele pare și cu negru cele impare, numerele lui Stirling de speța a II-a, așezate într-o matrice, vor forma Triunghiul lui Sierpinski!
Numerele Bell
Numerele Bell se referă la numărul de modalități prin care putem partiționa o mulțime cu elemente, și se notează cu Seamănă cu numerele lui Stirling de speța a II-a, doar că nu iau în calcul numărul de submulțimi ale partițiilor. Astfel, ele numără toate partițiile posibile ale unei mulțimi. Numerele Bell pot fi calculate trivial pe baza numerelor lui Stirling de speța a II-a:
Însă putem formula și o recurență ce depinde doar de numerele Bell:
Cazul de bază este Din păcate, recurența aceasta se calculează tot în însă pe noi ne interesează modul prin care a fost obținută. Ne putem gândi că din cele elemente ale mulțimii noastre, putem selecta pe care să le punem într-o submulțime, rămânând ca pe celelalte să le partiționăm separat, în moduri. Cum cele elemente pot fi alese în moduri, obținem că
Însă, avem o greșeală fundamentală în raționament. De exemplu, pe partiția am numărat-o de două ori: Când am ales să-i punem pe și în aceeași submulțime, rămânând să partiționăm recursiv submulțimea dar și atunci când am ales să-l punem pe într-o submulțime și să partiționăm recursiv submulțimea Pentru a remedia această problemă, trebuie să fixăm un element arbitrar (de exemplu pe care-l punem mereu în submulțimea de cardinal selectată de noi. Este perfect în regulă, pentru că el oricum trebuie să se afle într-o submulțime. Acum rămâne să selectăm în moduri ce elemente punem în aceeași submulțime cu Astfel, ajungem la recurența inițială, fără să numărăm de mai multe ori vreo configurație.
Numerele lui Stirling de speța I
Numerele lui Stirling de speța I numără câte permutări de ordin cu cicluri există, și se notează cu De exemplu, permutarea
are cicluri: și Al doilea ciclu, de pildă, a fost format așa:
Cazurile particulare sunt: și Motivele sunt similare cu cele de la numerele de speța a II-a. Recurența este:
Explicație: Putem forma o permutare de ordin pornind de la una de ordin în două moduri. Prima variantă este să adăugăm elementul la final, deci formând un nou ciclu, ce-l conține doar pe el. A doua variantă este să-l introducem pe într-un ciclu deja existent. Pentru asta, alegem un număr cu și îl schimbăm pe în iar lui îi atribuim valoarea
Așadar, folosind prima metodă obținem permutări noi, iar folosind-o pe a doua obținem Coeficientul vine de la faptul că, de fiecare dată când alegem ul despre care vorbeam mai devreme, avem variante.
Sursă C++ pentru calcularea
Iată mai jos o sursă care calculează Este aproape identică cu cea pentru numere lui Stirling de speța a II-a, singura diferență fiind relația de recurență (linia 10).
#include <bits/stdc++.h>using namespace std;
int main() { int n, k; cin >> n >> k; vector stir(n + 1, vector<int>(k + 1)); stir[0][0] = 1; for (int i = 1; i <= n; i++) for (int j = 1; j <= min(i, k); j++) stir[i][j] = stir[i - 1][j - 1] + (i - 1) * stir[i - 1][j]; cout << stir[n][k] << '\n'; return 0;}
Probleme recomandate
100m și Permutări folosesc numerele lui Stirling (de ambele spețe), iar Sistem folosește o recurență foarte asemănătoare cu cea a numerelor Bell. Ultima problemă nu e legată în mod direct vreun concept din cele trei, însă procedeul pentru deducerea recurenței din spatele ei este foarte asemănător cu cele prezentate în acest articol. Dacă aveți întrebări despre numerele lui Stirling sau despre numerele Bell, nu ezitați să le adresați în rubrica de comentarii