Schemat Hornera – do czego służy?

Schematu Hornera używamy do obliczania wartości wielomianu. Ten sposób działania zmniejsza liczbę potrzebnych mnożeń, dzięki czemu jest on wydajniejszy niż obliczanie wartości wielomianu w sposób standardowy. Jest to możliwe, ponieważ komputer nie zużywa czasu na zbędne mnożenia. Obliczając wartość wielomianu w sposób tradycyjny, musimy wykonać n(n+1)2 mnożeń oraz n dodawań. Natomiast przy wykorzystaniu schematu Hornera wystarczy n mnożeń oraz n dodawań.

Wprowadzenie do algorytmu

W celu zrozumienia działania algorytmu obliczającego wartość wielomianu z wykorzystaniem schematu Hornera, wyjaśnijmy kilka pojęć:

  • stopień wielomianu – najwyższa potęga, do jakiej podnosimy x,

  • x – liczba, dla której obliczamy wartość wielomianu,

  • współczynniki – liczby, przez które mnożymy kolejne składniki wielomianu.

Zadaniem algorytmu wykorzystującego schemat Hornera jest jak największe zredukowanie liczby mnożeń potrzebnych do obliczenia wartości wielomianu.

Postać ogólna wielomianu n-tego stopnia wygląda następująco:

a 0 x n + a 1 x n 1 + a 2 x n 2 + . . . + a n 1 x 1 + a n x 0

Zwróć uwagę na ostatni składnik. Omawianą formułę można zapisać również następująco:

a 0 x n + a 1 x n 1 + a 2 x n 2 + . . . + a n 1 x + a n

W tej postaci mamy do czynienia z operacją potęgowania, która okazuje się zbędna, jeżeli za pomocą schematu Hornera przekształcimy wielomian. Zacznijmy od wyłączenia x przed nawias, nie obejmując wyrazu wolnego:

x ( a 0 x n 1 + a 1 x n 2 + a 2 x n 3 + . . . + a n 1 ) + a n

Wewnątrz nawiasu powstał wielomian o stopniu n 1. Możemy go również przekształcić przez wyłączanie x przed nawias:

x ( x ( a 0 x n 2 + a 1 x n 3 + a 2 x n 4 + . . . + a n 2 ) + a n 1 ) + a n

Proces powtarzamy do momentu, w którym w najbardziej wewnętrznym nawiasie znajdzie się wielomian stopnia 1.

x ( x ( . . . x ( a 1 x + a 2 ) + . . . ) + a n 1 ) + a n

Chcąc wyznaczyć liczbę mnożeń, możemy zaobserwować, w jaki sposób obliczamy wartość powyższego wyrażenia dla danej wartości x. Zaczynamy od najbardziej zagnieżdżonego nawiasu. Wykonujemy jedno mnożenie oraz jedno dodawanie. Obliczyliśmy wartość wielomianu pierwszego stopnia. Następnie wynik mnożymy przez x oraz dodajemy kolejny współczynnik. Obliczyliśmy wartość wielomianu stopnia drugiego. Czynności powtarzamy, aż do obliczenia wartości wielomianu stopnia n, czyli n razy. W każdej czynności wykonujemy jedno mnożenie oraz jedno dodawanie. Wyznaczona liczba mnożeń wynosi zatem n.

Przykład

Przeanalizujmy przekształcenie wielomianu:

w ( x )   =   5 x 3 + 3 x 2 x + 4

na formę odpowiadającą schematowi Hornera.

Zgodnie z postacią ogólną nasz wielomian będzie wyglądał następująco:

w ( x )   =   5 x 3 + 3 x 2 + ( 1 ) x 1 + 4 x 0

Stopień tego wielomianu jest równy najwyższej potędze, do której jest podnoszona liczba x. Zatem w omawianym wypadku jest on równy 3. Współczynniki tego wielomianu to liczby, przez które są mnożone kolejne potęgi liczby x. W tym wypadku wynoszą one: 5, 3, -1, 4.

Obliczając wartość tego wielomianu metodą standardową, wykonalibyśmy następującą liczbę mnożeń:

5 x x x + 3 x x + ( 1 ) x + 4

Trzy mnożenia, gdyż mnożymy 5 razy x do potęgi 3, dwa mnożenia, by obliczyć 3 razy x do kwadratu oraz mnożenie x razy -1.

3 + 2 + 1 = 6

Przekształćmy teraz wyrażenie według zaprezentowanego algorytmu. Wyciągnijmy liczbę x przed nawias:

x ( 5 x x + 3 x 1 ) + 4

Jak możemy zauważyć, liczba x występuje zarówno przy 5, jak i przy 3, zatem ponownie wyciągnijmy ją przed nawias:

x ( x ( 5 x + 3 ) 1 ) + 4

Policzmy, ile mnożeń wykonamy, chcąc obliczyć wartość tego wielomianu za pomocą schematu Hornera. Odpowiedź to 3.

Zmniejszenie liczby mnożeń wynika z tego, że wyciągnęliśmy liczbę x przed nawias dwa razy.

Algorytm zapisany w sposób iteracyjny

Wzór iteracyjny algorytmu:

  • wynik = wspolczynnik[0]

  • wynik = wynik * x + wspolczynnik[i] dla i=1, 2,..., n

Specyfikacja:

Dane:

  • StopienWielomianu – zmienna określająca stopień wielomianu, który mamy obliczyć

  • wspolczynniki[] – tablica przechowująca współczynniki, przez które mnożymy daną potęgę liczby, dla której wartość wielomianu obliczamy

  • x – liczba, dla której obliczamy wartość wielomianu

Dane wyjściowe:

  • wynik – liczba, która określa obliczoną wartość wielomianu dla argumentu x.

Krok 1

Wczytaj dane.

Linia 1. wypisz cudzysłów Podaj stopień wczytywanego wielomianu dwukropek cudzysłów. Linia 2. stopienWielomianu znak równości wprowadź liczbę całkowitą. Linia 3. dla i znak równości 0 przecinek 1 przecinek 2 kropka kropka kropka stopienWielomianu wykonuj dwukropek. Linia 4. wypisz cudzysłów Podaj współczynnik cudzysłów. Linia 5. wspolczynniki otwórz nawias kwadratowy i zamknij nawias kwadratowy znak równości wprowadź liczbę. Linia 6. wypisz cudzysłów Podaj argument przecinek dla którego chcesz obliczyć wielomian dwukropek cudzysłów. Linia 7. x znak równości wprowadź liczbę.
Ważne!

Przy wczytywaniu współczynników wielomianu nie zapominajmy o wyrazie wolnym. Leży on przy wartości zmiennej x podniesionej do potęgi 0. Dlatego współczynników jest o jeden więcej niż wynosi wartość stopnia wielomianu.

Krok 2

Do zmiennej wynik przypisz wartość zmiennej zapisanej w tablicy wspolczynniki pod indeksem 0.

Linia 1. wypisz cudzysłów Podaj stopień wczytywanego wielomianu dwukropek cudzysłów. Linia 2. stopienWielomianu znak równości wprowadź liczbę całkowitą. Linia 3. dla i znak równości 0 przecinek 1 przecinek 2 kropka kropka kropka stopienWielomianu wykonuj dwukropek. Linia 4. wypisz cudzysłów Podaj współczynnik cudzysłów. Linia 5. wspolczynniki otwórz nawias kwadratowy i zamknij nawias kwadratowy znak równości wprowadź liczbę. Linia 6. wypisz cudzysłów Podaj argument przecinek dla którego chcesz obliczyć wielomian dwukropek cudzysłów. Linia 7. x znak równości wprowadź liczbę. Linia 8. wynik znak równości wspolczynniki otwórz nawias kwadratowy 0 zamknij nawias kwadratowy.

Krok 3

Do zmiennej wynik przypisz wartość: wynik wspolczynniki[i].

Linia 1. wypisz cudzysłów Podaj stopień wczytywanego wielomianu dwukropek cudzysłów. Linia 2. stopienWielomianu znak równości wprowadź liczbę całkowitą. Linia 3. dla i znak równości 0 przecinek 1 przecinek 2 kropka kropka kropka stopienWielomianu wykonuj dwukropek. Linia 4. wypisz cudzysłów Podaj współczynnik cudzysłów. Linia 5. wspolczynniki otwórz nawias kwadratowy i zamknij nawias kwadratowy znak równości wprowadź liczbę. Linia 6. wypisz cudzysłów Podaj argument przecinek dla którego chcesz obliczyć wielomian dwukropek cudzysłów. Linia 7. x znak równości wprowadź liczbę. Linia 8. wynik znak równości wspolczynniki otwórz nawias kwadratowy 0 zamknij nawias kwadratowy. Linia 9. dla i znak równości 1 przecinek 2 przecinek 3 kropka kropka kropka stopienWielomianu wykonuj dwukropek. Linia 10. wynik znak równości wynik asterysk x plus wspolczynniki otwórz nawias kwadratowy i zamknij nawias kwadratowy.

Krok 4

Wypisz „Wartość wielomianu dla argumentu x = wynik”.

Linia 1. wypisz cudzysłów Podaj stopień wczytywanego wielomianu dwukropek cudzysłów. Linia 2. stopienWielomianu znak równości wprowadź liczbę całkowitą. Linia 3. dla i znak równości 0 przecinek 1 przecinek 2 kropka kropka kropka stopienWielomianu wykonuj dwukropek. Linia 4. wypisz cudzysłów Podaj współczynnik cudzysłów. Linia 5. wspolczynniki otwórz nawias kwadratowy i zamknij nawias kwadratowy znak równości wprowadź liczbę. Linia 6. wypisz cudzysłów Podaj argument przecinek dla którego chcesz obliczyć wielomian dwukropek cudzysłów. Linia 7. x znak równości wprowadź liczbę. Linia 8. wynik znak równości wspolczynniki otwórz nawias kwadratowy 0 zamknij nawias kwadratowy. Linia 9. dla i znak równości 1 przecinek 2 przecinek 3 kropka kropka kropka stopienWielomianu wykonuj dwukropek. Linia 10. wynik znak równości wynik asterysk x plus wspolczynniki otwórz nawias kwadratowy i zamknij nawias kwadratowy. Linia 11. wypisz cudzysłów Wartość wielomianu dla argumentu x znak równości cudzysłów. Linia 12. wypisz wynik.

Przykładowe wykonanie algorytmu iteracyjnego

Oblicz wartość wielomianu, wykorzystując schemat Hornera:

x 4 + 2 x 3 + x 15

dla argumentu x = 4.

Dane po wczytaniu:

stopienWielomianu = 4 
x = 4 
wspolczynniki = {1, 2, 0, 1, -15}

Współczynnik zapisany pod indeksem 2 ma wartość zero, ponieważ w omawianym wielomianie nie ma zapisanego xIndeks górny 2.

Krok 1

wynik = 1

Krok 2

Linia 1. Wewnątrz pętli dwukropek. Linia 2. dla i znak równości 1 przecinek 2 przecinek kropka kropka kropka stopienWielomianu wykonuj dwukropek. Linia 4. gdy i znak równości 1 dwukropek. Linia 6. wynik znak równości wynik asterysk x plus wspolczynniki otwórz nawias kwadratowy i zamknij nawias kwadratowy.

Po tym kroku wynik wynosi:

1 4 + 2 = 6

Krok 3

Linia 1. Wewnątrz pętli dwukropek. Linia 2. dla i znak równości 1 przecinek 2 przecinek kropka kropka kropka stopienWielomianu wykonuj dwukropek. Linia 4. gdy i znak równości 2 dwukropek. Linia 6. wynik znak równości wynik asterysk x plus wspolczynniki otwórz nawias kwadratowy i zamknij nawias kwadratowy.

Aktualnie wynik równa się:

6 4 + 0 = 24

Krok 4

Linia 1. Wewnątrz pętli dwukropek. Linia 2. dla i znak równości 1 przecinek 2 przecinek kropka kropka kropka stopienWielomianu wykonuj dwukropek. Linia 4. gdy i znak równości 3 dwukropek. Linia 6. wynik znak równości wynik asterysk x plus wspolczynniki otwórz nawias kwadratowy i zamknij nawias kwadratowy.

Po tym kroku wynik to:

24 4 + 1 = 97

Krok 5

Linia 1. Wewnątrz pętli dwukropek. Linia 2. dla i znak równości 1 przecinek 2 przecinek kropka kropka kropka stopienWielomianu wykonuj dwukropek. Linia 4. gdy i znak równości 4 dwukropek. Linia 6. wynik znak równości wynik asterysk x plus wspolczynniki otwórz nawias kwadratowy i zamknij nawias kwadratowy.

W tym momencie wynik wynosi:

97 4 + ( 15 ) = 373

Tak obliczyliśmy wartość wielomianu metodą iteracyjnąiteracjaiteracyjną.

Algorytm zapisany w sposób rekurencyjny

W kolejnych krokach zaprezentujemy algorytm obliczania schematu Hornera zapisany metodą rekurencyjnąrekurencjametodą rekurencyjną.

Definicja rekurencyjna tego algorytmu:

  • aIndeks dolny 0 = wspolczynniki[0]

  • aIndeks dolny n = x * aIndeks dolny n‑1 + wspolczynniki[n] dla n>0

Krok 1

Wczytaj dane w taki sposób, jak w algorytmie iteracyjnym.

Krok 2

Wywołaj funkcję Horner(), podając jako argumenty: wspolczynniki, stopienWielomianu, x.

Linia 1. funkcja Horner otwórz nawias okrągły wspolczynniki otwórz nawias kwadratowy zamknij nawias kwadratowy przecinek stopienWielomianu przecinek x zamknij nawias okrągły.

Krok 3

W funkcji Horner() sprawdź, czy stopienWielomianu jest równy zero.

Linia 1. funkcja Horner otwórz nawias okrągły wspolczynniki otwórz nawias kwadratowy zamknij nawias kwadratowy przecinek stopienWielomianu przecinek x zamknij nawias okrągły. Linia 2. jeżeli stopienWielomianu znak równości znak równości 0 wykonaj dwukropek.

Krok 4

Jeśli tak jest, zwróć wspolczynniki[0]. Jest to wykonanie elementarnewykonanie elementarne w rekurencjiwykonanie elementarne w naszej funkcji rekurencyjnej.

Linia 1. funkcja Horner otwórz nawias okrągły wspolczynniki otwórz nawias kwadratowy zamknij nawias kwadratowy przecinek stopienWielomianu przecinek x zamknij nawias okrągły. Linia 2. jeżeli stopienWielomianu znak równości znak równości 0 dwukropek. Linia 3. zwróć wspolczynniki otwórz nawias kwadratowy 0 zamknij nawias kwadratowy.

Krok 5

Jeśli tak nie jest, zwróć:

Linia 1. x asterysk Horner otwórz nawias okrągły wspolczynniki przecinek stopienWielomianu minus 1 przecinek x zamknij nawias okrągły plus wspolczynniki otwórz nawias kwadratowy stopienWielomianu zamknij nawias kwadratowy.

Oto gotowa funkcja:

Linia 1. wypisz cudzysłów Podaj stopień wczytywanego wielomianu dwukropek cudzysłów. Linia 2. stopienWielomianu znak równości wprowadź liczbę całkowitą. Linia 3. dla i znak równości 0 przecinek 1 przecinek 2 kropka kropka kropka stopienWielomianu wykonuj dwukropek. Linia 4. wypisz cudzysłów Podaj cudzysłów. Linia 5. wypisz i. Linia 6. wypisz cudzysłów współczynnik cudzysłów. Linia 7. wspolczynniki otwórz nawias kwadratowy i zamknij nawias kwadratowy znak równości wczytaj liczbę. Linia 8. Wyswietl cudzysłów Podaj argument przecinek dla którego chcesz obliczyć wielomian dwukropek cudzysłów. Linia 9. x znak równości wczytaj liczbę. Linia 10. wynik znak równości Horner otwórz nawias okrągły wspolczynniki przecinek stopienWielomianu przecinek x zamknij nawias okrągły. Linia 11. wypisz cudzysłów Wynik znak równości cudzysłów. Linia 12. wypisz x. Linia 14. funkcja Horner otwórz nawias okrągły wspolczynniki otwórz nawias kwadratowy zamknij nawias kwadratowy przecinek stopienWielomianu przecinek x zamknij nawias okrągły. Linia 15. jeżeli stopienWielomianu znak równości znak równości 0 wykonaj. Linia 16. zwróć wspolczynniki otwórz nawias kwadratowy 0 zamknij nawias kwadratowy. Linia 17. w przeciwnym razie wykonaj dwukropek. Linia 18. zwróć x asterysk Horner otwórz nawias okrągły wspolczynniki przecinek stopienWielomianu ‑ 1 przecinek x zamknij nawias okrągły plus wspolczynniki otwórz nawias kwadratowy stopienWielomianu zamknij nawias kwadratowy.

Przykładowe wykonanie algorytmu rekurencyjnego

Oblicz wartość wielomianu, wykorzystując schemat Hornera:

x 4 + 2 x 3 + x 15

dla argumentu x = 4.

Dane po wczytaniu:

stopienWielomianu = 4 
x = 4 
wspolczynniki = {1, 2, 0, 1, -15}

Współczynnik zapisany pod indeksem 2 ma wartość zero, ponieważ w naszym wielomianie nie ma zapisanego xIndeks górny 2.

Krok 1

Wywołaj funkcję Horner(wspolczynniki, stopienWielomianu, x).

Krok 2

Sprawdź, czy stopienWielomianu jest równy 0.

Krok 3

W tym przypadku tak nie jest, zwróć:

x * Horner(wspolczynniki,stopienWielomianu - 1,x) + wspolczynniki[stopienWielomianu]

Krok 4

Sprawdź, czy stopienWielomianu jest równy 0.

Krok 5

W tym przypadku tak nie jest, ponieważ stopienWielomianu = 3. Zwróć:

x * Horner(wspolczynniki,stopienWielomianu - 1,x) + wspolczynniki[stopienWielomianu]

Krok 6

Sprawdź, czy stopienWielomianu jest równy 0.

Krok 7

W tym przypadku tak nie jest, ponieważ stopienWielomianu = 2. Zwróć:

x * Horner(wspolczynniki,stopienWielomianu - 1,x) + wspolczynniki[stopienWielomianu]

Krok 8

Sprawdź, czy stopienWielomianu jest równy 0.

Krok 9

W tym przypadku tak nie jest, ponieważ stopienWielomianu = 1. Zwróć:

x * Horner(wspolczynniki,stopienWielomianu - 1,x) + wspolczynniki[stopienWielomianu]

Krok 10

Sprawdź, czy stopienWielomianu jest równy 0.

Krok 11

W tym przypadku tak jest. Zwróć wspolczynniki[0] równe 1.

Krok 12

Powróć do kroku 9.

x = 4

Funkcja Horner(wspolczynniki,stopienWielomianu - 1,x) zwróciła wartość wspolczynniki[0], co jest równe 1. Natomiast wspolczynniki[stopienWielomianu] jest równe 2.

Zatem:

4 1 + 2 = 6

Krok 13

Powróć do kroku 7.

x = 4

Funkcja Horner(wspolczynniki,stopienWielomianu - 1,x) zwróciła wartość obliczoną w kroku 12., co jest równe 6. Natomiast wspolczynniki[stopienWielomianu] jest równe 0.

Zatem:

4 6 + 0 = 24

Krok 14

Powróć do kroku 5.

x = 4

Funkcja Horner(wspolczynniki, stopienWielomianu - 1, x) zwróciła wartość obliczoną w kroku 13., co jest równe 24. Natomiast wspolczynniki[stopienWielomianu] jest równe 1.

Zatem:

4 24 + 1 = 97

Krok 15

Powróć do kroku 3.

x = 4

Funkcja Horner(wspolczynniki,stopienWielomianu - 1,x) zwróciła wartość obliczoną w kroku 13., co jest równe 97. Natomiast wspolczynniki[stopienWielomianu] jest równe -15.

4 97 + ( - 15 ) = 373

Słownik

algorytm
algorytm

przepis postępowania prowadzący do rozwiązania ustalonego problemu, określający ciąg czynności elementarnych, które należy w tym celu wykonać

iteracja
iteracja

technika programowania polegająca na powtarzaniu tych samych operacji w pętli określoną liczbę razy lub do momentu, aż zostanie spełniony zadany warunek

przypadek podstawowy
przypadek podstawowy

przypadek, dla którego funkcja rekurencyjna nie wywołuje samej siebie, a zamiast tego zwraca z góry określoną wartość

rekurencja
rekurencja

technika programowania polegająca na odwoływaniu się procedur lub funkcji do samych siebie, aż do momentu spełnienia warunku podstawowego

stopień wielomianu
stopień wielomianu

najwyższa potęga przy zmiennej, która nie jest równa zero

wielomian
wielomian

wyrażenie algebraiczne będące sumą jednomianów, czyli wyrażeń postaci aIndeks dolny nxIndeks górny n

William George Horner
William George Horner

brytyjski matematyk żyjący w latach 1786–1837; w wieku 14 lat został asystentem nauczyciela w szkole w Bristolu, a w 1809 roku założył własną szkołę w Bath; podał sposób wyznaczania wartości wielomianu z wykorzystaniem minimalnej liczby operacji możenia

wykonanie elementarne w rekurencji
wykonanie elementarne w rekurencji

moment, gdy funkcja rekurencyjna zwraca konkretną wartość zamiast kolejnego wywołania rekurencyjnego