R1GFQ6NNTMUDK
Obraz przedstawia wzór schematu Hornera zapisany na granatowym tle.

PYI_R_W14_M30 Schemat Hornera - efektywna metoda obliczania wartości wielomianów 

Źródło: Obraz wygenerowany za pomocą Copilot, domena publiczna.

Implementacja schematu Hornera - wersja iteracyjna

Jak już wiemy, schemat Hornera jest wykorzystywany do obliczania wartości wielomianów. Wykorzystamy tę metodę w czasie bieżącej lekcji.

Ważne!

Wielomian, którego stopień jest równy n, składa się z n+1 składników.

A oto przykładowy wielomian trzeciego stopnia:

WX=6x3+8x22x+23

Dla x = 2 jego wartość wynosi:

WX=2=623+82222+23=48+324+23=99

Aby obliczyć wynik, trzeba sześć razy wykonać operację mnożenia oraz trzykrotnie operacje dodawania:

WX=2=6222+82222+23=48+324+23=99

1
Przykład 1

Zapiszemy algorytm tradycyjny, dzięki któremu będziemy mogli obliczyć wartość takiego wielomianu.  W liście, która jest jednym z parametrów funkcji, współczynniki przy niewystępujących potęgach w wielomianie uzupełniamy zerami.

Zdefiniujmy funkcję, która wykorzystując ten algorytm obliczy wartość wielomianu. 

Linia 1. def wielomian podkreślnik iter otwórz nawias okrągły stopien przecinek lista podkreślnik wsp przecinek argument zamknij nawias okrągły dwukropek. Linia 2. wynik znak równości 0. Linia 4. for i in range otwórz nawias okrągły stopien plus 1 zamknij nawias okrągły dwukropek. Linia 5. wynik plus znak równości lista podkreślnik wsp otwórz nawias kwadratowy i zamknij nawias kwadratowy asterysk otwórz nawias okrągły argument asterysk asterysk otwórz nawias okrągły stopien minus i zamknij nawias okrągły zamknij nawias okrągły. Linia 7. return f cudzysłów Wynikiem dla argumentu otwórz nawias klamrowy argument zamknij nawias klamrowy jest wartość otwórz nawias klamrowy wynik zamknij nawias klamrowy cudzysłów. Linia 9. kratka przykład wykonania. Linia 10. print otwórz nawias okrągły wielomian podkreślnik iter otwórz nawias okrągły 3 przecinek otwórz nawias kwadratowy 6 przecinek 8 przecinek minus 2 przecinek 23 zamknij nawias kwadratowy przecinek 7 zamknij nawias okrągły zamknij nawias okrągły. Linia 11. kratka Wynikiem dla argumentu 7 jest wartość 2459.
1
Przykład 2

Zmodyfikujmy zapisaną funkcję w taki sposób, by obliczyć, ile operacji podstawowych było niezbędnych podczas wyznaczania wartości wielomianu. 

Linia 1. def wielomian podkreślnik iter podkreślnik licz otwórz nawias okrągły stopien przecinek lista podkreślnik wsp przecinek argument zamknij nawias okrągły dwukropek. Linia 2. wynik znak równości lista podkreślnik wsp otwórz nawias kwadratowy 0 zamknij nawias kwadratowy. Linia 3. ile podkreślnik oblicz znak równości 0. Linia 5. for podkreślnik stopien in range otwórz nawias okrągły 1 przecinek stopien plus 1 zamknij nawias okrągły dwukropek. Linia 6. wynik plus znak równości lista podkreślnik wsp otwórz nawias kwadratowy podkreślnik stopien zamknij nawias kwadratowy asterysk otwórz nawias okrągły argument asterysk asterysk podkreślnik stopien zamknij nawias okrągły. Linia 7. ile podkreślnik oblicz plus znak równości podkreślnik stopien kratka liczba mnożeń. Linia 8. ile podkreślnik oblicz plus znak równości 1 kratka liczba dodawań. Linia 10. return f cudzysłów Aby obliczyć wartość wielomianu konieczne jest otwórz nawias klamrowy ile podkreślnik oblicz zamknij nawias klamrowy operacji podstawowych kropka cudzysłów. Linia 12. kratka przykład wykonania. Linia 13. print otwórz nawias okrągły wielomian podkreślnik iter podkreślnik licz otwórz nawias okrągły 3 przecinek otwórz nawias kwadratowy 6 przecinek 8 przecinek minus 2 przecinek 23 zamknij nawias kwadratowy przecinek 7 zamknij nawias okrągły zamknij nawias okrągły. Linia 14. kratka Aby obliczyć wielomian konieczne jest 9 operacji podstawowych kropka.

Obliczanie wartości wielomianu z zastosowaniem schematu Hornera

Schemat Hornera optymalizuje ilość operacji arytmetycznych niezbędnych do obliczenia wartości wielomianu.

Wykorzystując go otrzymujemy wzór:

WX=a0x+a1x+a2x++an1x+an

Kolejne współczynniki:

a0an

są mnożnikami potęg zmiennej x, zapisanymi od lewej do prawej strony wielomianu. Poszczególne wyrazy wielomianu (jednomiany) są zapisane od najwyższej potęgi zmiennej x do najniższej.

Po przekształceniu przykładowego wielomianu z wykorzystaniem schematu Hornera okazuje się, że w celu wyznaczenia wartości całego wyrażenia konieczne jest wykonanie trzech operacji mnożenia i trzech operacji dodawania:

WX=a0x+a1x+a2x++an1x+an

1
Przykład 3

Zapiszemy algorytm obliczania wartości wielomianu za pomocą wersji iteracyjnej schematu Hornera

Zdefiniujmy funkcję, która wykorzystując ten algorytm pozwoli nam obliczyć wartość wielomianu. Stopień wielomianu to najwyższa potęga x'a w tym wielomianie. W liście, która jest jednym z parametrów, współczynniki przy niewystępujących potęgach w wielomianie uzupełniamy zerami. Wówczas możemy pominąć podawanie stopnia jako parametru funkcji, gdyż będziemy mogli obliczyć go ze wzoru stopien = liczba współczynników -1.

Linia 1. def horner podkreślnik iter otwórz nawias okrągły wsp przecinek x zamknij nawias okrągły dwukropek. Linia 2. stopien znak równości len otwórz nawias okrągły wsp zamknij nawias okrągły minus 1. Linia 3. wynik znak równości wsp otwórz nawias kwadratowy 0 zamknij nawias kwadratowy. Linia 4. i znak równości 0. Linia 6. while i otwórz nawias ostrokątny stopien dwukropek. Linia 7. i plus znak równości 1. Linia 8. wynik znak równości wynik asterysk x plus wsp otwórz nawias kwadratowy i zamknij nawias kwadratowy. Linia 10. return wynik. Linia 12. kratka przykładowe wykonanie. Linia 13. print otwórz nawias okrągły horner podkreślnik iter otwórz nawias okrągły otwórz nawias kwadratowy 6 przecinek 8 przecinek minus 2 przecinek 23 zamknij nawias kwadratowy przecinek 7 zamknij nawias okrągły zamknij nawias okrągły. Linia 14. kratka 2459.

Możemy również sprawdzić, ile operacji podstawowych wykonujemy w tej funkcji:

Linia 1. def horner podkreślnik iter otwórz nawias okrągły wsp przecinek x zamknij nawias okrągły dwukropek. Linia 2. zlicz znak równości 0. Linia 3. stopien znak równości len otwórz nawias okrągły wsp zamknij nawias okrągły minus 1. Linia 4. wynik znak równości wsp otwórz nawias kwadratowy 0 zamknij nawias kwadratowy. Linia 5. i znak równości 0. Linia 7. while i otwórz nawias ostrokątny stopien dwukropek. Linia 8. i plus znak równości 1. Linia 9. wynik znak równości wynik asterysk x plus wsp otwórz nawias kwadratowy i zamknij nawias kwadratowy. Linia 10. zlicz plus znak równości 2. Linia 12. return wynik przecinek zlicz. Linia 14. kratka przykładowe wykonanie. Linia 15. print otwórz nawias okrągły horner podkreślnik iter otwórz nawias okrągły otwórz nawias kwadratowy 6 przecinek 8 przecinek minus 2 przecinek 23 zamknij nawias kwadratowy przecinek 7 zamknij nawias okrągły zamknij nawias okrągły. Linia 16. kratka 2459 przecinek 6.

Słownik

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

wielomian
wielomian

wyrażenie algebraiczne będące sumą jednomianów, czyli wyrażeń postaci <mathanxn

stopień wielomianu
stopień wielomianu

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

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

rekurencja
rekurencja

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

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ść

wykonanie elementarne w rekurencji
wykonanie elementarne w rekurencji

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

przestrzeń nazw
przestrzeń nazw

(ang. namespace) – miejsce w pamięci operacyjnej, w której przechowywana jest dana zmienna; najczęściej przestrzeń nazw związana jest z funkcją, a zmienne używane w niej są widoczne tylko w obrębie tej przestrzeni – jest to „zakres obowiązywania” tych zmiennych

niezmienna
niezmienna

(ang. immutable) sekwencja lub zmienna, która jest niemodyfikowalna „w miejscu”, a więc nie można zmienić żadnego z jej elementów wewnątrz, trzeba stworzyć nowy obiekt, który zawiera zmienione elementy