Symbol Newtona to funkcja dwóch argumentów całkowitych nieujemnych. Najpowszechniej używany jest wzór:
Istnieje również wzór rekurencyjny:
Symbol Newtona jest wykorzystywany najczęściej podczas różnego rodzaju zadań kombinatorycznych. Powyższe wzory nie zawsze są najbardziej efektywną metodą wyliczania żądanej wartości. W dalszej części artykułu zostaną przedstawione trzy metody.
Wykorzystanie silni do obliczenia symbolu Newtona jest bardzo wygodne ze względu na bardzo dużo składników, które się redukują. Jednak efektywność takiego kodu jest bardzo trudno zoptymalizować i bardzo szybko może się okazać, że zmienna przekroczyła zakres zmiennej. Warto zauważyć, że zaletą takiego algorytmu jest liniowa zależność obliczeń od kodu.
Poniżej został zamieszczony niezoptymalizowany kod liczący symbol Newtona z definicji:
(2.) Ustal wynik na neutralny element mnożenia 1. (3. - 4.) Oblicz licznik, a następnie podziel (5. - 8.) przez wszystkie elementy z mianownika. Na koniec (9.) zwróć wynik.
Problem z przekraczeniem zakresu wartości typu zmiennej jest zastosowanie rekurencji. Dzięki temu przechowywana wartość będzie mniejsza, równa wartości wynikowej. Nie jest to jednak rozwiązanie idealne, ponieważ w trakcie wykonywania rekurencji niektóre wartości są obliczane więcej niż jeden raz.
Oznaczmy dwumian Newtona przez symbol F. Przykładowo wartość F(4, 2) będzie obliczona jako suma:
F(4, 2) = F(3, 1) + F(3, 2) =
F(2, 0) + F(2, 1) + F(2, 1) + F(2, 2) =
F(2, 0) + F(1, 0) + F(1, 1) + F(1, 0) + F(1, 1) + F(2, 2)
Jak można zauważyć niektóre wartości są wyliczane więcej niż jeden raz. W przypadku większych wartości n i k powtarzających się czynników jest znacznie więcej.
Kod realizujący wyliczanie symbolu Newtona przy wykorzystaniu rekurencji wygląda następująco:
Symbolem Newtona można obliczyć współczynnik stojący w rozwinięciu wyrażenia (a + b)n na k-tej pozycji. Zapisując wszystkie wartości dla każdego n otrzymuje się trójkąt Pascala. Trzecia metoda wyznaczania wartości symbolu Newtona polega na wyliczeniu n wierszy i zwróceniu k-tej wartości z ostatniego, wyliczonego wiersza.
Chociaż z perspektywy analizy program działa oszczędniej niż rozwiązanie rekurencyjne, bo znowu nie zostanie przekroczona wartość wynikowa w trakcie obliczeń, ale te same wartości nie są wyliczane po kilka razy. Niestety złożoność obliczeniowa jest kwadratowa O(n2).
Poniżej został przedstawiony kod realizujący zadanie:
(2.) Zaalokuj miejsce w pamięci o długości ostatniego wiersza oraz jednego miejsca wolnego. (3.) Wpisz wartość z pierwszego wiersza i zakończ listę (4.) wartością 0. (5.) Wylicz kolejne wiersze: (6. - 8.) za każdym razem sumując odpowiednie wartości i (9.) stawiając na koniec 0. Wartość 0 pomaga tutaj uprościć kod, ponieważ nie trzeba rozpatrywać oddzielnie przepisywania ostatniej wartości listy. Bez zerowania sumowane byłyby "śmieci" z pamięci komputera, więc ostateczny wynik nie byłby poprawny. Na koniec (11.) należy pobrać odpowiednią wartość, (12.) zdealokować tablice i (13.) zwrócić wynik.
Poniższa funkcja main() wczytuje od użytkownika wartości n i k, a następnie wypisuje wynik symbolu Newtona .
Napisz zoptymalizowany kod wykorzystujący wzór z silnią do obliczenia symbolu Newtona. Przetestuj napisaną funkcję.