问题:
- 给定 x, 计算多项式
pn(x)=anxn+an−1xn−1+⋯+a1x+a0p_n(x) = a_n x^n + a_{n-1}x^{n-1} + \cdots + a_1 x +a_0pn(x)=anxn+an−1xn−1+⋯+a1x+a0
直接表达
def p_n(x,a_n:list):
ans = 0
for i in range(len(a_n)):
ans += x**i*a_n[i]
return ans
%%time
ans1 = 0
for i in range(1000):
ans1 += p_n(2,[i for i in range(200)])
Wall time: 116 ms
- 其中 akxka_kx^kakxk 需要进行k次乘法,所以很复杂。
秦九韶算法 (Horner 算法)
pn(x)=x[x⋯[x(anx+an−1)+an−2]+⋯+an−1]+a0p_n(x) = x \big[ x \cdots [x(a_n x + a_{n-1}) + a_{n-2}]+\cdots + a_{n-1}\big] + a_0pn(x)=x[x⋯[x(anx+an−1)+an−2]+⋯+an−1]+a0
{bn=anbn−1=an−1+bnx\begin{aligned} \begin{cases} b_n &= a_n \\ b_{n-1} & = a_{n-1} + b_n x\end{cases}\end{aligned}{bnbn−1=an=an−1+bnx
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)
%%time
ans2 = 0
for i in range(1000):
ans2 += Horner(2,[i for i in range(200)])
Wall time: 51.9 ms
ans1 == ans2
True
- 只需n 次乘法和n 次加法即可得到一个多项式的值。
242



被折叠的 条评论
为什么被折叠?



