Числа Стірлінга другого роду

Матеріал з testwiki
Перейти до навігації Перейти до пошуку
15 розбиттів 4-елементної множини
у вигляді діаграми Гассе

Тут присутні S(4,1),...,S(4,4) = 1,7,6,1.

В комбінаториці числом Стірлінга другого роду S(n, k) називається кількість невпорядкованих розбиттів n-елементної множини на k непорожніх підмножин. Дані числа названі на честь Джеймса Стірлінґа.

Рекурентні співвідношення

Числа Стірлінга другого роду задаються рекурентним співвідношенням:

S(n,n)=1, для n ≥ 0,
S(n,0)=0, для n > 0,
S(n,k)=S(n1,k1)+kS(n1,k) для 0<k<n.

Дійсно будь-яке розбиття n-елементної множини на k непорожніх підмножин або містить одноелементну множину {n} або не містить її. В першому випадку кількість розбиттів становить S(n1,k1) оскільки решту n-1 елементів слід розбити на k-1 підмножину. У другому випадку кількість розбиттів становить kS(n1,k), оскільки слід n-1 елементів розбити на k підмножин, після чого до якоїсь із них додати елемент n. Просумувавши обидва випадки, одержуємо необхідне співвідношення.

Приклади

Перші ряди:

n \ k 0 1 2 3 4 5 6 7 8 9
0 1
1 0 1
2 0 1 1
3 0 1 3 1
4 0 1 7 6 1
5 0 1 15 25 10 1
6 0 1 31 90 65 15 1
7 0 1 63 301 350 140 21 1
8 0 1 127 966 1701 1050 266 28 1
9 0 1 255 3025 7770 6951 2646 462 36 1

Властивості

  • xn=k=0nS(n,k)(x)k, де (x)k=x(x1)(xk+1).
Доведемо методом математичної індукції. Дане твердження справджується для випадку n=1.
Припустимо, що твердження виконується для деякого n. Тоді:
xn+1=xnx=k=0nS(n,k)(x)k((xk)+k),
Оскільки:
(x)k(xk)=(x)k+1
то маємо:
xn+1=k=0nS(n,k)(x)k+1+k=0nkS(n,k)(x)k=k=0n+1S(n,k1)+kS(n,k)(x)k=k=0n+1S(n+1,k)(x)k
де використано S(n,0)=S(n,n+1)=0, а також рекурентне співвідношення для чисел Стірлінга другого роду.

Таким чином отримуємо, що твердження виконується для всіх цілих чисел.

Очевидно випливає з визначень чисел Белла і Сттірлінга другого роду.
  • S(n,k)(zw)(mod2),z=nk+12, w=k12.
  • :{nn1}=(n2).
Дійсно, розбиття на n-1 підмножину можливе тоді коли одна підмножина має два елементи, а всі інші — по одному. Саме вибір цих двох елементів і визначає розбиття, тобто кількість розбиттів рівна кількості способів вибрати два елементи з n-1, що й демонструє дана формула.
{n2}=2n11.
Справді є всього 2 n упорядкованих пар взаємодоповнюючих множин A і B. В одному випадку A є пустою, в іншому B є пустою, тому залишається 2 n − 2 пар підмножин. Для невпордкованих пар потрібно дане число поділити на 2, що й дає необхідний результат.
З рекурентного відношення також одержуємо:
{n2}=11(2n11n1)0!
{n3}=11(3n12n1)12(3n11n1)1!
{n4}=11(4n13n1)22(4n12n1)+13(4n11n1)2!
{n5}=11(5n14n1)32(5n13n1)+33(5n12n1)14(5n11n1)3!

Програми для обчислення

Delphi

type
  TTwoDimArray = array of array of Double;

procedure GetStirlingNumbers(n_max, m_max: Integer; var StirlingNumbers: TTwoDimArray);
var
  I, J: Integer;
begin
  { Виділення пам'яті під масив чисел }
  SetLength(StirlingNumbers, n_max+1, m_max+1);

  { Заповнення масиву }
  { S(n,0) = 0 }
  for I := 0 to n_max do
    StirlingNumbers[I, 0] := 0;

  { S(n,n) = 1 }
  for I := 0 to n_max do
    StirlingNumbers[I, I] := 1;

  { S(n,m) = S(n-1,m-1) + m*S(n-1,m) }
  for I := 1 to n_max do
    for J := 1 to I-1 do
      StirlingNumbers[I, J] := StirlingNumbers[I-1, J-1] + J * StirlingNumbers[I-1, J];
end;

C#

void GetStirlingNumbers(int n_max, int m_max, double[,] StirlingNumbers)
{
  // Виділення пам'яті під масив чисел
  StirlingNumbers = new double [n_max+1, m_max+1];
 
  // Заповнення масиву
  // S(n,0) = 0
  for (int i = 0; i < n_max; i++)
    StirlingNumbers[i, 0] = 0;
 
  // S(n,n) = 1
  for (int i = 0; i < n_max; i++)
    StirlingNumbers[i, i] = 1;
 
  // S(n,m) = S(n-1,m-1) + m*S(n-1,m)
  for (int i = 1; i <= n_max; i++)
    for (int j = 1; j <= i-1; j++)
      StirlingNumbers[i, j] = StirlingNumbers[i-1, j-1] + j * StirlingNumbers[i-1, j];
}

Див. також

Посилання