多项式快速计算

多项式快速计算

多项式,由变量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+an1xn1+an2xn2+...++a1x+a0,(n0)
由于多项式计算涉及多次幂的加乘,且重复计算;同时编程中针对不同次数的多项式需要编写重复程序。

算法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+an1)x+an2)x+an3)+an4)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,n1f0=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=fn1(x),Bn=an1,(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+ai1 的项目,构造循环项 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=aiAk1+ai1(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,开销更大

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Z@=

你的鼓励,换取更多的回报与惊喜

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值