多项式快速计算
多项式,由变量x、多项式系数、及其加、减、乘、幂(非负整数)构成的数学表达式。表达式如下
f
(
x
)
=
a
n
x
n
+
a
n
−
1
x
n
−
1
+
a
n
−
2
x
n
−
2
+
.
.
.
+
+
a
1
x
+
a
0
,
(
n
≥
0
)
f(x) = a_nx^n+a_{n-1}x^{n-1}+a_{n-2}x^{n-2} + ... + +a_{1}x + a_0,(n \geq 0)
f(x)=anxn+an−1xn−1+an−2xn−2+...++a1x+a0,(n≥0)
由于多项式计算涉及多次幂的加乘,且重复计算;同时编程中针对不同次数的多项式需要编写重复程序。
算法1:递归调用 (来自 Zane)
针对多项式(1)变形
f
(
x
)
=
(
(
(
(
(
a
n
x
+
a
n
−
1
)
x
+
a
n
−
2
)
x
+
a
n
−
3
)
+
a
n
−
4
)
x
+
.
.
.
+
a
1
)
x
+
a
0
f(x) = (\bigg(\Big(\big((a_nx+a_{n-1})x+a_{n-2}\big)x+a_{n-3}\Big)+a_{n-4}\bigg)x+...+a_1)x+a_0
f(x)=(((((anx+an−1)x+an−2)x+an−3)+an−4)x+...+a1)x+a0
可分解为如下迭代关系
f
n
(
x
)
=
A
n
x
+
B
n
,
初始条件
A
n
=
a
n
,
n
≥
1
f
0
=
a
0
f_n(x)=A_nx+B_n,初始条件 A_n=a_n,n\geq1 \\ f_0 = a_0
fn(x)=Anx+Bn,初始条件An=an,n≥1f0=a0
其中
A
n
=
f
n
−
1
(
x
)
,
B
n
=
a
n
−
1
,
(
n
>
1
)
A_n = f_{n-1}(x), B_n=a_{n-1} ,(n>1)
An=fn−1(x),Bn=an−1,(n>1)
则可以利用上述公式确定递归调用,实现多项式的计算
代码
# cof [a0...an]
def polycalc(x:float,cof:list)->float:
return polycalc(x,cof[1:])*x+cof[0] if len(cof) > 1 else cof[0]
算法2: 循环调用
还是针对公式(2),每一项都是
a
i
x
+
a
i
−
1
a_ix+a_{i-1}
aix+ai−1 的项目,构造循环项 A,第k次循环值为
A
k
A_k
Ak,
A
k
=
a
i
∗
A
k
−
1
+
a
i
−
1
(
i
>
1
)
A_k = a_i*A_{k-1}+a_{i-1} (i>1)
Ak=ai∗Ak−1+ai−1(i>1)
循环初始值
A
=
a
n
A=a_n
A=an, 循环 n-1 次,实现
f
(
x
)
=
A
f(x)=A
f(x)=A
代码
# cof [a0...an]
def polycalc3(x:float,cof:list[float])->float:
p = cof[-1]
for i in range(len(cof)-1,0,-1):
p = p*x+cof[i-1]
return p
算法1和算法2,都会将x的幂乘,转化为一般乘法,避免了x*x多次计算;算法1相比算法2,开销更大