Схе́ма Го́рнера (або правило Горнера, метод Горнера) — алгоритм обчислення значення многочлена, записаного у вигляді суми одночленів, при заданому значенні змінної. Метод Горнера дозволяє знайти корені многочлена, а також обчислити похідні поліному в заданій точці. Схема Горнера також є простим алгоритмом для ділення многочлена на біном у вигляді . Метод названо на честь Вільяма Джорджа Горнера.
Опис алгоритму
Дано многочлен :
- .
Нехай потрібно обчислити значення даного многочлена при фіксованому значенні . Представимо многочлен в такому вигляді:
- .
Визначимо таку послідовність:
- …
- …
Шукане значення . Покажемо, що це правильно.
В отриману форму запису підставимо і будемо обчислювати значення виразу, починаючи з внутрішніх дужок. Для цього будемо замінювати підвирази на :
Використання схеми Горнера для ділення многочлена на біном
При діленні многочлена на отримуємо многочлен з остачею .
За такої умови коефіцієнти отриманого многочлена задовольняють рекурентним співвідношенням:
- , .
Так само можна визначити кратність кореня (використати схему Горнера для нового полінома).
Так само схему можна використовувати для знаходження коефіцієнтів при розкладу поліному по степенях :
Приклади реалізації обчислення значення
C++
/* * 6 * 3 * 1 3 -2 1 -1 1 * * Відповідь: 439 */ # include <stdlib.h> /** EXIT_FAILURE **/ # include <iostream> using namespace std; int main(int argc, char *argv[]) { register unsigned int i; unsigned int n; cout << "Введіть кількість елементів: "; cin >> n; if (n < 1 ) { cerr << "Потрібно хоча б два елементи." << endl; return EXIT_FAILURE; } double *a = new double [n]; double *b = new double [n]; cout << "Введіть епсилон: "; double eps; cin >> eps; cout << "Введіть" << n << " вихідний елемент:" << endl; for ( i = 0; i < n; i++ ) cin >> a[i]; cout << endl; /* Малюємо верхню рамку */ for ( i = 0; i < n; i++ ) cout << "+-------"; cout << "+" << endl; /* Виводимо вихідні елементи */ for ( i = 0; i < n; i++ ) cout << "| " << a[i] << "\t"; cout << "|" << endl; /* Знову рамка */ for ( i = 0; i < n; i++ ) cout << "+-------"; cout << "+" << endl; /* За умовою, перший елемент b дорівнює першому елементу a */ b[0] = a[0]; cout << "| " << *b << "\t"; for( i = 1; i < n; i++ ) { b[i] = b[i - 1] * eps; /* В цьому місці b[i] буде дорівнювати значенню, що записується в другий рядок */ b[i] += a[i]; cout << "| " << b[i] << "\t"; } cout << "+" << endl; /* І ще одна завершальна рамка */ for ( i = 0; i < n; i++ ) cout << "+-------"; cout << "+" << endl << endl; cout << "Відповідь: " << b[n-1] << endl; delete []b; delete []a; return 0; }
Див. також
Література
- Anany Levitin Introduction to the Design and Analysis of Algorithms, 3rd Edition Chapter 6.5 Horner's Rule [ 1 травня 2021 у Wayback Machine.] 2012. — 565 с. (англ.)
Посилання
- Обчислення значення полінома використовуючи схему Горнера [ 27 жовтня 2020 у Wayback Machine.]
- Схема Горнера [ 8 травня 2017 у Wayback Machine.]
Вікіпедія, Українська, Україна, книга, книги, бібліотека, стаття, читати, завантажити, безкоштовно, безкоштовно завантажити, mp3, відео, mp4, 3gp, jpg, jpeg, gif, png, малюнок, музика, пісня, фільм, книга, гра, ігри, мобільний, телефон, android, ios, apple, мобільний телефон, samsung, iphone, xiomi, xiaomi, redmi, honor, oppo, nokia, sonya, mi, ПК, web, Інтернет
She ma Go rnera abo pravilo Gornera metod Gornera algoritm obchislennya znachennya mnogochlena zapisanogo u viglyadi sumi odnochleniv pri zadanomu znachenni zminnoyi Metod Gornera dozvolyaye znajti koreni mnogochlena a takozh obchisliti pohidni polinomu v zadanij tochci Shema Gornera takozh ye prostim algoritmom dlya dilennya mnogochlena na binom u viglyadi x c displaystyle x c Metod nazvano na chest Vilyama Dzhordzha Gornera Opis algoritmuDano mnogochlen P x displaystyle P x P x a 0 a 1 x a 2 x 2 a 3 x 3 a n x n a i R displaystyle P x a 0 a 1 x a 2 x 2 a 3 x 3 ldots a n x n quad a i in mathbb R Nehaj potribno obchisliti znachennya danogo mnogochlena pri fiksovanomu znachenni x x 0 displaystyle x x 0 Predstavimo mnogochlen P x displaystyle P x v takomu viglyadi P x a 0 x a 1 x a 2 x a n 1 a n x displaystyle P x a 0 x a 1 x a 2 cdots x a n 1 a n x dots Viznachimo taku poslidovnist b n a n displaystyle b n a n b n 1 a n 1 b n x displaystyle b n 1 a n 1 b n x b i a i b i 1 x displaystyle b i a i b i 1 x b 0 a 0 b 1 x displaystyle b 0 a 0 b 1 x Shukane znachennya P x 0 b 0 displaystyle P x 0 b 0 Pokazhemo sho ce pravilno V otrimanu formu zapisu P x displaystyle P x pidstavimo x x 0 displaystyle x x 0 i budemo obchislyuvati znachennya virazu pochinayuchi z vnutrishnih duzhok Dlya cogo budemo zaminyuvati pidvirazi na b i displaystyle b i P x 0 a 0 x 0 a 1 x 0 a 2 x 0 a n 1 a n x 0 a 0 x 0 a 1 x 0 a 2 x 0 b n 1 a 0 x 0 b 1 b 0 displaystyle begin aligned P x 0 amp a 0 x 0 a 1 x 0 a 2 cdots x 0 a n 1 a n x 0 dots amp a 0 x 0 a 1 x 0 a 2 cdots x 0 b n 1 dots amp vdots amp a 0 x 0 b 1 amp b 0 end aligned Vikoristannya shemi Gornera dlya dilennya mnogochlena na binomPri dilenni mnogochlena a 0 x n a 1 x n 1 a n 1 x a n displaystyle a 0 x n a 1 x n 1 cdots a n 1 x a n na x c displaystyle x c otrimuyemo mnogochlen b 0 x n 1 b 1 x n 2 b n 2 x b n 1 displaystyle b 0 x n 1 b 1 x n 2 cdots b n 2 x b n 1 z ostacheyu b n displaystyle b n Za takoyi umovi koeficiyenti otrimanogo mnogochlena zadovolnyayut rekurentnim spivvidnoshennyam b 0 a 0 displaystyle b 0 a 0 b k a k c b k 1 displaystyle b k a k cb k 1 Tak samo mozhna viznachiti kratnist korenya vikoristati shemu Gornera dlya novogo polinoma Tak samo shemu mozhna vikoristovuvati dlya znahodzhennya koeficiyentiv pri rozkladu polinomu po stepenyah x c displaystyle x c P x A 0 A 1 x c A 2 x c 2 A n x c n displaystyle P x A 0 A 1 x c A 2 x c 2 cdots A n x c n Prikladi realizaciyi obchislennya znachennyaC 6 3 1 3 2 1 1 1 Vidpovid 439 include lt stdlib h gt EXIT FAILURE include lt iostream gt using namespace std int main int argc char argv register unsigned int i unsigned int n cout lt lt Vvedit kilkist elementiv cin gt gt n if n lt 1 cerr lt lt Potribno hocha b dva elementi lt lt endl return EXIT FAILURE double a new double n double b new double n cout lt lt Vvedit epsilon double eps cin gt gt eps cout lt lt Vvedit lt lt n lt lt vihidnij element lt lt endl for i 0 i lt n i cin gt gt a i cout lt lt endl Malyuyemo verhnyu ramku for i 0 i lt n i cout lt lt cout lt lt lt lt endl Vivodimo vihidni elementi for i 0 i lt n i cout lt lt lt lt a i lt lt t cout lt lt lt lt endl Znovu ramka for i 0 i lt n i cout lt lt cout lt lt lt lt endl Za umovoyu pershij element b dorivnyuye pershomu elementu a b 0 a 0 cout lt lt lt lt b lt lt t for i 1 i lt n i b i b i 1 eps V comu misci b i bude dorivnyuvati znachennyu sho zapisuyetsya v drugij ryadok b i a i cout lt lt lt lt b i lt lt t cout lt lt lt lt endl I she odna zavershalna ramka for i 0 i lt n i cout lt lt cout lt lt lt lt endl lt lt endl cout lt lt Vidpovid lt lt b n 1 lt lt endl delete b delete a return 0 Div takozhKorin mnogochlena Dilennya mnogochleniv Dilennya stovpchikom Metod LilyaLiteraturaAnany Levitin Introduction to the Design and Analysis of Algorithms 3rd Edition Chapter 6 5 Horner s Rule 1 travnya 2021 u Wayback Machine 2012 565 s angl PosilannyaObchislennya znachennya polinoma vikoristovuyuchi shemu Gornera 27 zhovtnya 2020 u Wayback Machine Shema Gornera 8 travnya 2017 u Wayback Machine