Метод Хорнера - Horner's method

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

Алгоритм основан на правиле Хорнера:

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

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

Полиномиальное вычисление и деление в столбик

Учитывая многочлен

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

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

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

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

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

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

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

где b 0 (который равен p (x 0 )) является остатком от деления, как показано в приведенных ниже примерах. если x 0 является корнем p (x), то b 0 = 0 (то есть остаток равен 0), что означает, что вы можете разложить p (x) на (xx 0 ).
Что касается поиска последовательных значений b, вы начинаете с определения b n , которое просто равно a n . Затем вы переходите к другим буквам «Б», используя формулу;

пока не дойдете до точки b 0 .

Примеры

Оценка для

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

 x0x3    x2    x1    x0
 3 │   2    −6     2    −1
   │         6     0     6
   └────────────────────────
       2     0     2     5

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

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

В этом примере, если мы это видим , записи в третьей строке. Итак, синтетическое деление основано на методе Хорнера.

Как следствие теоремы о полиномиальном остатке, элементы в третьей строке являются коэффициентами многочлена второй степени, частного от деления на . Остаток равен 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  -2


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

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

Вычисление с использованием мономиальной формы многочлена степени n требует не более n сложений и ( n 2  +  n ) / 2 умножений, если степени вычисляются путем повторного умножения и каждый моном оценивается индивидуально. (Это можно уменьшить до n сложений и 2 n  - 1 умножений, итеративно оценивая степени x .) Если числовые данные представлены в виде цифр (или битов), то наивный алгоритм также влечет за собой сохранение примерно 2 n- кратного числа бит x (вычисленный многочлен имеет приблизительную величину x n , и нужно также сохранить сам x n ). В отличие от этого, метод Хорнера требует только n сложений и n умножений, а его требования к памяти всего в n раз больше числа битов x . В качестве альтернативы метод Хорнера может быть вычислен с n объединенными операциями умножения и сложения . Метод Хорнера также может быть расширен для вычисления первых k производных многочлена с помощью kn сложений и умножений.

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

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

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

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

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

В более общем виде суммирование можно разбить на k частей:

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

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

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

Пример

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

Метод

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

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

Вывод

В общем, для двоичного числа с битовыми значениями ( ) произведение равно

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

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

или эквивалентным образом (в соответствии с "методом", описанным выше)

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

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

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

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

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

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

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

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

Пример

Нахождение корня полинома с использованием метода Хорнера

Рассмотрим многочлен

который может быть расширен до

Из вышеизложенного мы знаем, что наибольший корень этого многочлена равен 7, поэтому мы можем сделать первоначальное предположение о 8. Используя метод Ньютона, первый нуль из 7 находится, как показано черным на рисунке справа. Далее делится на, чтобы получить

который показан красным на рисунке справа. Метод Ньютона используется для нахождения наибольшего нуля этого многочлена с начальным предположением 7. Наибольший ноль этого многочлена, который соответствует второму по величине нулю исходного многочлена, находится в точке 3 и обведен красным. Теперь полином 5-й степени разделим на, чтобы получить

который показан желтым цветом. Нуль для этого многочлена снова находится в 2 с помощью метода Ньютона и обведен желтым кружком. Метод Хорнера теперь используется для получения

который показан зеленым и имеет ноль при −3. Далее этот многочлен сводится к

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

Разделенная разность полинома

Метод Хорнера может быть изменен для вычисления разделенной разности с учетом полинома (как и раньше)

действовать следующим образом

По завершении у нас есть

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

История

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

Статья Хорнера под названием «Новый метод решения числовых уравнений всех порядков путем непрерывного приближения» была зачитана Лондонским королевским обществом на его заседании 1 июля 1819 года с продолжением в 1823 году. Статья Хорнера во второй части. « Философские труды Лондонского королевского общества за 1819 год» был тепло и широко встречен рецензентом в выпуске «Ежемесячного обзора» или «Литературного журнала за апрель 1820 года»; для сравнения, техническая статья Чарльза Бэббиджа в данном обзоре вкратце отклоняется. Последовательность обзоров в «Ежемесячном обзоре» за сентябрь 1821 г. приводит к выводу, что Холдред был первым человеком, открывшим прямое и общее практическое решение числовых уравнений. Фуллер показал, что метод, описанный в статье Хорнера 1819 г., отличается от того, что впоследствии стало известно как «метод Хорнера», и что, следовательно, приоритет этого метода должен быть отдан Холдреду (1820 г.).

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

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

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

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

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

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

Примечания

использованная литература

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