stringtranslate.com

Метод Хорнера

В математике и информатике метод Горнера (или схема Горнера ) — это алгоритм для оценки полиномов . Хотя этот метод назван в честь Уильяма Джорджа Хорнера , он гораздо старше, поскольку сам Хорнер приписывал его Жозефу-Луи Лагранжу , и его можно проследить на много сотен лет назад, до китайских и персидских математиков. [1] После появления компьютеров этот алгоритм стал основополагающим для эффективных вычислений с полиномами.

Алгоритм основан на правиле Горнера , в котором многочлен записывается во вложенной форме :

Это позволяет оценить многочлен степени n только с помощью умножений и сложений. Это оптимально, поскольку существуют многочлены степени n , которые нельзя оценить с помощью меньшего количества арифметических операций. [2]

Альтернативно, метод Хорнера иМетод Хорнера–Руффини также относится к методу аппроксимации корней многочленов, описанному Хорнером в 1819 году. Это вариант методаНьютона–Рафсона,более эффективный для ручных вычислений благодаря применению правила Хорнера. Он широко использовался до тех пор, пока компьютеры не стали общедоступными около 1970 года.

Оценка полинома и деление в столбик

Учитывая полином, где - постоянные коэффициенты, задача состоит в том, чтобы оценить полином при определенном значении

Для этого новая последовательность констант определяется рекурсивно следующим образом:

Тогда это значение .

Чтобы увидеть, почему это работает, многочлен можно записать в виде

Таким образом, итеративно подставляя в выражение,

Теперь можно доказать, что;

Это выражение представляет собой практическое применение Хорнера, поскольку оно предлагает очень быстрый способ определения результата; с (который равен ) являющимся остатком деления, как показано в примерах ниже. Если является корнем , то (то есть остаток равен ), что означает, что вы можете разложить на множители как .

Чтобы найти последовательные -значения, вы начинаете с определения , которое просто равно . Затем вы работаете рекурсивно, используя формулу: пока не достигнете .

Примеры

Оценить для .

Мы используем синтетическое деление следующим образом:

 х 0х 3  х 2  х 1  х 0 3 │ 2 −6 2 −1 │ 6 0 6 └───────────────────────── 2 0 2 5

Записи в третьей строке являются суммой записей в первых двух. Каждая запись во второй строке является произведением x -значения (3 в этом примере) с записью третьей строки сразу слева. Записи в первой строке являются коэффициентами полинома, который нужно оценить. Тогда остаток от деления на равен5 .

Но по теореме о полиномиальном остатке мы знаем, что остаток равен . Таким образом, .

В этом примере, если мы можем видеть, что , записи в третьей строке. Таким образом, синтетическое деление (которое было фактически изобретено и опубликовано Руффини за 10 лет до публикации Хорнера) проще в использовании; можно показать, что оно эквивалентно методу Хорнера.

Вследствие теоремы о полиномиальных остатках, элементы в третьей строке являются коэффициентами полинома второй степени, частного от деления на . Остаток равен5. Это делает метод Горнера полезным для деления полиномов в столбик .

Разделить на :

2 │ 1 −6 11 −6 │ 2 −8 6 └───────────────────────── 1 −4 3 0

Частное равно .

Пусть и . Разделим , используя метод Горнера.

 0,5 │ 4 −6 0 3 −5 │ 2 −2 −1 1 └──────────────────────── 2 −2 −1 1 −4

Третья строка — это сумма первых двух строк, деленная на2. Каждая запись во второй строке является произведением1 с записью в третьем ряду слева. Ответ:

Эффективность

Оценка с использованием мономиальной формы многочлена степени требует максимум сложений и умножений, если степени вычисляются повторным умножением, а каждый моном оценивается индивидуально. Стоимость может быть сведена к сложениям и умножениям путем оценки степеней путем итерации.

Если числовые данные представлены в виде цифр (или битов), то наивный алгоритм также подразумевает хранение приблизительно умноженного числа битов : вычисленный многочлен имеет приблизительную величину , и нужно также хранить себя. Напротив, метод Хорнера требует только сложений и умножений, и его требования к хранению составляют только умноженное число битов . В качестве альтернативы метод Хорнера можно вычислить с помощью объединенных умножений-сложений . Метод Хорнера также можно расширить для вычисления первых производных многочлена с помощью сложений и умножений. [3]

Метод Хорнера является оптимальным в том смысле, что любой алгоритм для вычисления произвольного многочлена должен использовать по крайней мере столько же операций. Александр Островский доказал в 1954 году, что количество требуемых сложений минимально. [4] Виктор Пан доказал в 1966 году, что количество умножений минимально. [5] Однако, когда — матрица, метод Хорнера не является оптимальным .

Это предполагает, что многочлен вычисляется в форме монома и не допускается предварительная обработка представления, что имеет смысл, если многочлен вычисляется только один раз. Однако, если предварительная обработка разрешена и многочлен должен быть оценен много раз, то возможны более быстрые алгоритмы . Они включают преобразование представления многочлена. В общем случае, многочлен степени может быть оценен с использованием только n /2 +2 умножений и сложений. [6]

Параллельная оценка

Недостатком правила Горнера является то, что все операции последовательно зависимы , поэтому невозможно воспользоваться преимуществами параллелизма на уровне инструкций на современных компьютерах. В большинстве приложений, где важна эффективность полиномиальной оценки, многие полиномы низкого порядка оцениваются одновременно (для каждого пикселя или полигона в компьютерной графике или для каждого квадрата сетки в численном моделировании), поэтому нет необходимости находить параллелизм в рамках одной полиномиальной оценки.

Однако если вычисляется один полином очень высокого порядка, может быть полезно разбить его следующим образом:

В более общем случае суммирование можно разбить на k частей: где внутренние суммирования могут быть оценены с использованием отдельных параллельных экземпляров метода Горнера. Это требует немного больше операций, чем базовый метод Горнера, но позволяет k -стороннее SIMD- выполнение большинства из них. Современные компиляторы обычно оценивают полиномы таким образом, когда это выгодно, хотя для вычислений с плавающей точкой это требует включения (небезопасной) реассоциативной математики [ требуется цитата ] .

Применение к умножению и делению чисел с плавающей точкой

Метод Хорнера — это быстрый, эффективный с точки зрения кода метод умножения и деления двоичных чисел на микроконтроллере без аппаратного умножителя . Одно из двоичных чисел, которое нужно умножить, представляется в виде тривиального многочлена, где (используя приведенные выше обозначения) , и . Затем x (или x в некоторой степени) многократно выносится за скобки. В этой двоичной системе счисления (основание 2) , поэтому степени числа 2 многократно выносятся за скобки.

Пример

Например, чтобы найти произведение двух чисел (0,15625) и m :

Метод

Чтобы найти произведение двух двоичных чисел d и m :

  1. Регистр, содержащий промежуточный результат, инициализируется значением d .
  2. Начните с наименее значимого (крайнего правого) ненулевого бита в m .
    1. Подсчитать (слева) количество позиций битов до следующего самого значимого ненулевого бита. Если более значимых битов нет, то взять значение текущей позиции бита.
    2. Используя это значение, выполните операцию сдвига влево на указанное количество бит в регистре, содержащем промежуточный результат.
  3. Если все ненулевые биты были подсчитаны, то регистр промежуточного результата теперь содержит окончательный результат. В противном случае добавьте d к промежуточному результату и продолжайте в шаге 2 со следующим наиболее значимым битом в m .

Вывод

В общем случае для двоичного числа с битовыми значениями ( ) произведение равно На этом этапе алгоритма требуется, чтобы члены с нулевыми коэффициентами были отброшены, так что учитываются только двоичные коэффициенты, равные единице, таким образом, проблема умножения или деления на ноль не возникает, несмотря на это следствие в разложенном уравнении:

Все знаменатели равны единице (или член отсутствует), поэтому это сводится к или эквивалентно (что соответствует «методу», описанному выше)

В двоичной (основание 2) математике умножение на степень 2 — это просто операция сдвига регистра . Таким образом, умножение на 2 вычисляется в основе 2 с помощью арифметического сдвига . Множитель (2 −1 ) — это правый арифметический сдвиг , a (0) не приводит к какой-либо операции (поскольку 2 0 = 1 — это мультипликативный тождественный элемент ), а a (2 1 ) приводит к левому арифметическому сдвигу. Продукт умножения теперь можно быстро вычислить, используя только операции арифметического сдвига, сложения и вычитания.

Метод особенно быстр на процессорах, поддерживающих одноинструкционный сдвиг-и-сложение-накопление. По сравнению с библиотекой с плавающей точкой C, метод Хорнера жертвует некоторой точностью, однако номинально он в 13 раз быстрее (в 16 раз быстрее, когда используется форма " канонической знаковой цифры " (CSD)) и использует только 20% пространства кода. [7]

Другие приложения

Метод Хорнера может быть использован для преобразования между различными позиционными системами счисления – в этом случае x является основанием системы счисления, а коэффициенты a i являются цифрами представления данного числа по основанию x – и может также использоваться, если x является матрицей , в этом случае выигрыш в вычислительной эффективности еще больше. Однако для таких случаев известны более быстрые методы . [8]

Нахождение корня полинома

Используя алгоритм длинного деления в сочетании с методом Ньютона , можно аппроксимировать действительные корни многочлена. Алгоритм работает следующим образом. Дано многочлен степени с нулями, сделайте некоторое начальное предположение, такое что . Теперь повторите следующие два шага:

  1. Используя метод Ньютона , найдите наибольший ноль , используя предположение .
  2. Используя метод Горнера, разделите, чтобы получить . Вернитесь к шагу 1, но используйте многочлен и начальное предположение .

Эти два шага повторяются до тех пор, пока не будут найдены все действительные нули для полинома. Если приближенные нули недостаточно точны, полученные значения можно использовать в качестве начальных догадок для метода Ньютона, но с использованием полного полинома, а не редуцированных полиномов. [9]

Пример

Нахождение корня полинома методом Горнера

Рассмотрим многочлен , который можно разложить до

Из вышесказанного мы знаем, что наибольший корень этого многочлена равен 7, поэтому мы можем сделать начальное предположение 8. Используя метод Ньютона, первый ноль 7 находится, как показано черным на рисунке справа. Затем делится на , чтобы получить , который нарисован красным на рисунке справа. Метод Ньютона используется для нахождения наибольшего нуля этого многочлена с начальным предположением 7. Наибольший ноль этого многочлена, который соответствует второму по величине нулю исходного многочлена, находится в точке 3 и обведен красным. Теперь многочлен степени 5 делится на , чтобы получить , который показан желтым цветом. Ноль для этого многочлена снова находится в точке 2 с помощью метода Ньютона и обведен желтым цветом. Теперь используется метод Хорнера для получения , который показан зеленым цветом и обнаруживается, что имеет ноль в точке −3. Этот многочлен далее сводится к , который показан синим цветом, и дает ноль −5. Окончательный корень исходного полинома можно найти, либо используя конечный ноль в качестве начального предположения для метода Ньютона, либо сокращая и решая линейное уравнение . Как видно, ожидаемые корни −8, −5, −3, 2, 3 и 7 были найдены.

Разделенная разность многочлена

Метод Хорнера можно модифицировать для вычисления разделенной разности. Учитывая полином (как и прежде), действуйте следующим образом [10]

В конце мы имеем Это вычисление разделенной разности подвержено меньшей ошибке округления, чем оценка и по отдельности, особенно когда . Подстановка в этот метод дает , производную от .

История

Результат алгоритма Цинь Цзюшао для решения квадратного полиномиального уравнения : x =840 [11]

Статья Хорнера под названием «Новый метод решения числовых уравнений всех порядков с помощью непрерывного приближения» [12] была прочитана перед Лондонским королевским обществом на его заседании 1 июля 1819 года, с продолжением в 1823 году. [12] Статья Хорнера в Части II «Философских трудов Лондонского королевского общества» за 1819 год была тепло и горячо встречена рецензентом [ постоянная мертвая ссылка ] в выпуске «The Monthly Review: or, Literary Journal» за апрель 1820 года; для сравнения, техническая статья Чарльза Бэббиджа в этом обзоре кратко отвергнута. Последовательность обзоров в «The Monthly Review» за сентябрь 1821 года заключает, что Холдред был первым человеком, открывшим прямое и общее практическое решение числовых уравнений. Фуллер [13] показал, что метод, изложенный в статье Хорнера в 1819 году, отличается от того, что впоследствии стало известно как «метод Хорнера», и что, следовательно, приоритет этого метода должен принадлежать Холдреду (1820).

В отличие от своих английских современников, Хорнер черпал вдохновение из континентальной литературы, в частности из работ Арбогаста . Известно также, что Хорнер внимательно прочитал книгу Джона Бонникасла по алгебре, хотя и проигнорировал работу Паоло Руффини .

Хотя Хорнеру приписывают создание метода доступным и практичным, он был известен задолго до Хорнера. В обратном хронологическом порядке метод Хорнера был уже известен:

Цинь Цзюшао в своем труде «Шу Шу Цзю Чжан» ( «Математический трактат в девяти разделах» ; 1247) представляет набор методов типа Хорнера для решения полиномиальных уравнений, основанный на более ранних работах математика династии Сун XI века Цзя Сяня ; например, один метод специально подходит для би-квинтиков, пример которого Цинь приводит в соответствии с тогдашним китайским обычаем изучения случаев. Ёсио Миками в «Развитии математики в Китае и Японии» (Лейпциг, 1913) писал:

«... кто может отрицать тот факт, что знаменитый процесс Хорнера использовался в Китае по крайней мере на шесть долгих столетий раньше, чем в Европе... Мы, конечно, никоим образом не намерены приписывать изобретение Хорнера китайскому происхождению, но промежуток времени в достаточной степени делает не совсем невозможным, что европейцы могли знать о китайском методе прямым или косвенным путем». [20]

Ульрих Либбрехт пришел к выводу: Очевидно, что эта процедура является китайским изобретением... этот метод не был известен в Индии . Он сказал, что Фибоначчи, вероятно, узнал о нем от арабов, которые, возможно, заимствовали его у китайцев. [21] Извлечение квадратных и кубических корней по аналогичным линиям уже обсуждалось Лю Хуэем в связи с задачами IV.16 и 22 в «Цзю Чжан Суань Шу» , в то время как Ван Сяотун в 7 веке предполагал, что его читатели могут решать кубические уравнения с помощью метода приближения, описанного в его книге «Цзигу Суаньцзин» .

Смотрите также

Примечания

  1. ^ 600 лет назад, китайский математик Цинь Цзюшао и 700 лет назад, персидский математик Шараф ад-Дин ат-Туси
  2. ^ Пан 1966
  3. ^ Панкевич 1968.
  4. ^ Островский 1954.
  5. Пан 1966.
  6. ^ Кнут 1997.
  7. ^ Крипасагар 2008, стр. 62.
  8. ^ Хайэм 2002, Раздел 5.4.
  9. ^ Кресс 1991, стр. 112.
  10. ^ Фейтмен и Кахан 2000
  11. ^ Либбрехт 2005, стр. 181–191.
  12. ^ ab Horner 1819.
  13. Фуллер 1999, стр. 29–51.
  14. ↑ Каджори 1911.
  15. ^ ab O'Connor, John J.; Robertson, Edmund F. , "Метод Хорнера", Архив истории математики MacTutor , Университет Сент-Эндрюс
  16. ^ Анализ по количественной серии, Fluctiones ac Differentias: Cum Enumeratione Linearum Tertii Ordinis, Londini. Экс Officina Pearsoniana. Анно MDCCXI, с. 10, 4-й абзац.
  17. Собрание сочинений Ньютона, издание 1779 г., в сноске, т. I, стр. 270-271
  18. ^ Берггрен 1990, стр. 304–309.
  19. Темпл 1986, стр. 142.
  20. Миками 1913, стр. 77
  21. ^ Либбрехт 2005, стр. 208.

Ссылки

Внешние ссылки