U matematici, Hornеrova šema (takođe poznata i kao Hornerov metod ili Hornerovo pravilo) (engl. Horner's method, Horner's sheme, Horner's rule)[1][2] представља једну од наведених ствари: (и) алгоритам за израчунавање полинома, који се састоји из трансформације полинома у облик погоднији за израчунавање[2]; или (ии) метод за одређивање корена полинома.[3] Овај метод познат је и под називом Руффини–Хорнеров метод.[4]

Овај метод је назван по британском математичару Вилијаму Џорџу Хорнеру, иако је био познат и пре по Паулу Руфинију као и шесто година раније, по кинеском математичару Qин Јиу-Схао (енгл. Qин Јиусхао).

Опис алгоритма уреди

Нека је дат полином

 

где су   реални бројеви, а потребно је израчунати вредност полином за одређену вредност променљиве  , на пример  .

Да бисмо то постигли, дефинишемо нови низ константи:

 

Тада   има вредност  .

Како би доказали да је ова тачно, приметимо да се полином може записати у следећем облику

 

На овај начин, итеративно замењујући   у претходном изразу, добијамо

 

Множење и дељење у покретном зарезу уреди

Хорнеров метод је брз и ефикасан метод за множење и дељење бинарних бројева на микроконтролеру (енгл. мицроцонтроллер) који не садржи посебно коло за множење бинарних бројева. Један од бинарних бројева који се множе се престави као прост полином, где је (користећи горе поменуту нотацију)  , и  . Затим,   (или   на одређени степен) се изнова факторише. У овом бинарном систему (са основом 2),  , па се степени двојке понављају.

Пример уреди

На пример, да бисмо нашли производ два броја, (0.15625) и  :

 

Метод уреди

Налажење производа два бинарна броја,   и  :

  • 1. Регистар у коме се чува средњи резултат припише се променљивој  .
  • 2. Почети од најнижег бита (првог с десна) различитог од нуле у  .
    • 2б. Бројати (улево) број битова до следећег највишег не-нула бита. Ако више нема значајних битова, онда узети вредност бита са тренутне позиције.
    • 2ц. Користећи ту вредност, извести шифтовање удесно оним бројем бита који се чува у регистру за средњи резултат
  • 3. Ако су избројани ски не-нула битови, онда регистер за средњи резултат сада садржи коначно решење. У супротном, додати   средњем резултату, и наставити кораком #2 са следећим највишим битом у  .

Дељење уреди

У општем случају, за бинарни број са битовима: ( ) производ је:

 

У овој фазе алгоритма, потребно је избацити терме са коефицијентима нула, тако да буду избројани само бинарни коефицијенти једнаки јединици, тако да се не јавља проблем множења или дељења са нулом, упркос овој импликацији у факторисаној једначини:

 

Сви имениоци су јединице (или се израз изоставља), па добијамо:

 

односно:

 

У бинарној (основа 2) математици, множење степеном двојке је само аритметичко шифтовање. Тако се множење бројем 2 израчунава помоћу операције аритметичко шифтовање. Фактор   је аритметичко шифтовање удесно, а за   нема операције (како је  , неутрал за множење), и   резултује шифтовање за једно место улево. Производ множења се сада брзо може израчунати само аритметичким шифтовањем, сабирањем и одузимањем.

Метод је прилично брз на процесорима који подржавају једно-инстукционе шифтуј-и-додај операције. У поређењу са C-овом библиотеком за рачунање у покретном зарезу, Хорнеров метод жртује одређену прецизност, али ипак је 13 пута бржи, и користи само 20% простора кода.[5]

Одређивање корена полинома уреди

Коришћењем Хорнерове шеме у комбинацији са Њутновим методом, могу се одредити реални корени полинома. Алгоритам функционише на следећи начин. Нека је дат полином   степена   са нулама  , одредити полазну претпоставку   као нпр.  . Сада итеративно примењивати следећа два корака:

1. Користећи Њутнов метод, наћи највећу нулу   полинома   користећи нагађање  .

2. Користећи Хорнерову шему, поделити   да би добили  . Вратити се на корак 1 али користећи полином   и полазну претпоставку  .

Ова два корака се понављају док се не добију све реалне нуле почетног полинома. Ако одређене нуле нису довољно прецизне, добијене вредности се могу употребити као полазне претпоставке за Њутнов метод али користећи цео полином уместо редукованог.[6]

Пример уреди

 
Налажење корена полинома коришћењем Хорнерове шеме

Претпоставимо да је полином облика,

 

који се може представити као

 

Из горе наведеног знамо да је највећи корен овог полинома 7, па можемо да узмемо као полазну претпоставку број 8. Користећи Њутнов метод, први корен, са вредношћу 7, се добија као што је приказано црном бојом горњој слици. Следећи   се дели мономом   да би добили

 

што је представљено црвеном бојом на горњој слици. Њутнов метод се користи да би нашли највећу нулу полинома са полазном претпоставком 7. Највећа нула овог полинома која је у кореспонденцији са другом највећом нулом почетног полинома налази се на броју 3 и заокружена је црвеном бојом. Полином петог степена се сада дели мономом   и добија се

 

који је приказан жутом бојом. Нула овог полинома је нађена на броју 2, поново користећи Њутнов метод и заокружена је жутом бојом. Хорнерова шема се сада користи за добијање полинома трећег степена

 

који је приказан зеленом бојом и пронађена му је нула на броју  −3. Овај полином се даље редукује на

 

што је приказано плавом бојом и има нулу  −5. Коначни корен полазног полинома може се добити или коришћењем последње нуле као полазне претпоставке за Њутнов метод, или редуковање   и решавањем линеарне једначине. Као што се може видети, добијени су очекивани корени −8, −5, −3, 2, 3, и 7.

C++/C имплементација уреди

Следећи C++/C код представља функцију за израчунавање вредности полинома помоћу Хорнерове шеме.

int Horner( int a[], int n, int x ) {
    int result = a[n];
    for(int i=n-1; i >= 0 ; --i)
        result = result * x + a[i];
    return result;
}

Python имплементација уреди

Следећи Пyтхон код је имплементација Хорнеровог метода.

def horner(x, *polynomial):
    """A function that implements the Horner Scheme for evaluating a
    polynomial of coefficients *polynomial in x."""
    result = 0
    for coefficient in polynomial:
        result = result * x + coefficient
    return result

Примена уреди

Хорнерова шема се може користити за конвертовање између различитих позиционих бројевних система - у том случају   је база тог бројевног система и   коефицијенти су цифре које се користе у  - бројевном систему за репрезентацију датог броја; такође се може користити ако је   матрица, у том случају добија се још већа ефикасност при рачунању. Заправо, када је   матрица, даље убрзање је могуће и користи структуру матрице, потребно је само   уместо   множења (науштрб коришћења додатног меморијског простора) употребом 1973 метода Патерсона и Стокмавера.[7]

Ефикасност уреди

Израчунавање вредности полинома степена   у некој тачки, захтева највише   сабирања и   множења, ако се степен рачуна поновљеним множењем и сваки моном се засебно срачунава. (Ово се може свести на   сабирања и   множења, итеративним рачунањем степена од  .) Ако су нумерички подаци представљени цифрама (или битовима), онда наивни алгоритам такође захтева смештање око   пута број битова од   (оцењен полином је приближно величине  , и потребно је сместити  ). Насупрот томе, Хорнерова метода захтева само   сабирања и   множења, и смештање свега   пута број битова од  . Хорнеров метод може бити израчунат са   спојених сабирање-одузивање операција. Хорнеров метод се још може проширити тако да одређује првих   делилаца полинома   сабирања и множења.[8]

Хорнеров метод је оптималан, у смислу да сваки други алгоритам за израчунавање вредности полинома мора да искористи макар толико операција колико и Хорнеров. Александар Островски (Алеxандер Остроwски) је 1954. доказао да је број потребних сабирања минималан.[9] Виктор Пан (Вицтор Пан) је 1966. доказао да је број множења минималан.[10] У сваком случају, када је   матрица, Хорнеров метод није оптималан.

У општем случају, без Хорнерове шеме, вредност полинома степена   се може израчунати користећи свега   множења и   сабирања.

Референце уреди

  1. ^ Цормен, Тхомас Х.; Леисерсон, Цхарлес Е.; Ривест, Роналд L. & Цлиффорд Стеин (2009). Интродуцтион то Алгоритхмс (3рд изд.). МИТ Пресс. стр. 41, 900, 990. 
  2. ^ а б „Wолфрам МатхWорлд: Хорнер'с Руле”. 
  3. ^ „Wолфрам МатхWорлд: Хорнер'с Метход”. 
  4. ^ „Френцх Wикипедиа: Мéтходе де Руффини-Хорнер”. 
  5. ^ Крипасагар, Марцх 2008, "Еффициент Мицро Матхематицс", Цирцуит Целлар, иссуе 212, пп. 62.
  6. ^ Кресс, Раинер, "Нумерицал Аналyсис", Спрингер. 1991. пп. 112.
  7. ^ Хигхам, Ницхолас. (2002). Аццурацy анд Стабилитy оф Нумерицал Алгоритхмс. Пхиладелпхиа: СИАМ. ИСБН 978-0-89871-521-7. . Сецтион 5.4.
  8. ^ W. Панкиеwицз. „Алгоритхм 337: цалцулатион оф а полyномиал анд итс деривативе валуес бy Хорнер сцхеме”. 
  9. ^ Остроwски, А. M. (1954). "Он тwо проблемс ин абстрацт алгебра цоннецтед wитх Хорнер'с руле", Студиес ин Матх. Мецх. пп. 40-48. Неw Yорк: Ацадемиц Пресс.
  10. ^ Пан, Y. Ја. (1966). "Он меанс оф цалцулатинг валуес оф полyномиалс, Руссиан Матх. Сурвеyс" . 21: 105—136.  Недостаје или је празан параметар |титле= (помоћ).

Литература уреди

Спољашње везе уреди