Python 秦九韶 Horner 算法 计算多项式

问题:

  • 给定 x, 计算多项式

p n ( x ) = a n x n + a n 1 x n 1 + + a 1 x + a 0 p_n(x) = a_n x^n + a_{n-1}x^{n-1} + \cdots + a_1 x +a_0

直接表达

import numpy as np

def p_n(x,a_n:list):
    ans = 0
    for i in range(len(a_n)): 
        ans += np.power(x,i)*a_n[i]
    return ans

p_n(2,[i for i in range(20)])
18874370
  • 其中 a k x k a_kx^k 需要进行k次乘法,所以很复杂。

秦九韶算法 (Horner 算法)

p n ( x ) = x [ x [ x ( a n x + a n 1 ) + a n 2 + + a n 1 ] + a 0 p_n(x) = x \big[ x \cdots [x(a_n x + a_{n-1}) + a_{n-2}+\cdots + a_{n-1}\big] + a_0

{ b n = a n b n 1 = a n 1 + b n x \begin{aligned} \begin{cases} b_n &= a_n \\ b_{n-1} & = a_{n-1} + b_n x\end{cases}\end{aligned}

def Horner(x,a_n:list):
    n = len(a_n)-1
    def b_n(x,i):
        if i == n: return a_n[i] # b_n = a_n
        return a_n[i]+ b_n(x,i+1)*x # b_{n-1} = a_{n-1} + b_n*x
    return b_n(x,0)

Horner(2,[i for i in range(20)])
18874370
  • 只需n 次乘法和n 次加法即可得到一个多项式的值。
发布了26 篇原创文章 · 获赞 10 · 访问量 3674

猜你喜欢

转载自blog.csdn.net/Varalpha/article/details/105468074