Algorytm Hornera

Zgodnie z prośbą cośniecoś postaram się z polskiego na nasze przełożyć ;)

No to tak, bierzemy jakiś wielomian, np 7x5 - 3x4 + 2x3 - 14x2 + x - 3

Co z nim robimy?? Ano bierzemy siódemeczkę, mnożymy ją przez x, odejmujemy 3 i mnożymy wszystko przez x, dodajemy 2 i
mnożymy wszystko przez x i tak aż do końca. Co do implementacji… Nie daje głowy że to zadziała, a nie mam w tej chwili czasu na
testy więc sklecę coś na szybko ;)

#include <iostream>
 
using namespace std;
 
int main()
{
   int podstawy[1000], n, x;
   char znaki[1000];
   long long suma=0;
   cout << "Podaj największy wykładnik wielomianu i wartość x: ";
   cin >> n >> x;
   cout << "A teraz podstawy kolejnych potęg wraz ze znakami(oddzielone spacją):" << endl;
   for (int i=n; i>=0; i--)
      cin >> znaki[i] >> podstawy[i];
   for (int i=n; i>0; i--)
   {
      if (znaki[i]=='+')
         suma+=podstawy[i];
      else suma-=podstawy[i];
      suma*=x;
   }
   suma+=podstawy[0];
   cout << suma << endl;
   return 0;
}

Algorytm Hornera

pomaga obliczyć wartość dowolnego wielomianu, oraz jego pochodnych w dowolnym punkcie.
Wielomian możemy zapisać w postaci:

w(x)=anxn + an-1xn-1 + … + a2x2 + a1x + a0

gdzie ak(k=0,1,…,n) są liczbami rzeczywistymi, x jest zmienną. W zależności od wartości zmiennej x wielomian w(x) przyjmuje różne wartości.

Algorytm Hornera oblicza te wartości dla konkretnie przyjętych współczynników ak i zmiennej x. Wyłączając x sprowadźmy wielomian w do postaci:

w(x)=(anxn-1 + an-1xn-2 + … + a2x + a1)x + a0.

Powtarzając to postępowanie otrzymujemy następującą równoważną postać wielomianu w :

w(x)=(…((anx + an-1)x + … + a2)x + a1)x + a0.

Powtarzające się operacje, które tworzą następujący schemat, zwany algortymem Hornera wygladają nastepująco :

// zmienna - pomocnicza zmienna
// := --->  operacja przypisania :) 
zmienna := an
zmienna := zmienna*q + an-i (tę linię powta kolejno dla i=1,2,...,n)

Otrzymana po wszystkich powtórzeniach wartość w zmiennej pom jest już szukaną wartością w(q).

Jednak nie to nas tak bardzo interesuje

Próbując ustawić otrzymywane kolejno wartości zmiennej zmienna w ciąg oznaczając je :

bn,bn-1,…,b2,b1,b0.

Wyglądałby on następująco:

bn = an
bi = bi+1*q + ai

gdzie i=n-1,n-2,…,1,0 oraz q jest punktem, dla którego poszukujemy wartości wielomianu w.
Okazuje się, że wielomian:

w1(x)=bnxn-1 + bn-1xn-2 + … + b2x + b1

jest ilorazem otrzymanym z dzielenia wielomianu w(x) przez x-q, a b0 - resztą z tego dzielenia.
Różniczkując to dalej stronami względem x otrzymujemy:

w|(x) = w1|(x)*(x-q) + w1(x).

W punkcie q mamy jednak: w|(q) = w1(q).

Widać, że aby otrzymać wartość pierwszej pochodnej wielomianu w w punkcie q należy tylko obliczyć wartość wielomianu w1 w tym samym punkcie q. Czyli powinniśmy wykonać algorytm Hornera dwa razy.

Myślę, że teraz po lekcjach o wielomianach na matematyce wszystko wydaje się zrozumiałe, zwłaszcza, że przerabialiśmy schemat Hornera i temat ten był często poruszany :)
 
Chase
Unless otherwise stated, the content of this page is licensed under Creative Commons Attribution-ShareAlike 3.0 License