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 pn(x)=anxn+an1xn1++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
  • 其中 a k x k a_kx^k akxk 需要进行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 pn(x)=x[x[x(anx+an1)+an2]++an1]+a0

{ 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} {bnbn1=an=an1+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 次加法即可得到一个多项式的值。
  • 1
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我可以帮你实现这个程序。这里提供一种基于链式存储结构的实现方法: 1. 定义节点结构体PolyNode,包含系数和指数两个成员变量,以及指向下一个节点的指针next。 ``` struct PolyNode { int coef; // 系数 int expn; // 指数 PolyNode *next; // 下一个节点指针 }; ``` 2. 定义多项式类Polynomial,包含多项式的头节点指针head和项数n。提供以下成员函数: - 构造函数Polynomial():初始化头节点指针为空,项数为0。 - 析构函数~Polynomial():释放所有节点内存。 - void createPoly():输入建立多项式。 - void printPoly():输出多项式。 - Polynomial operator+(const Polynomial &b):多项式加法。 - Polynomial operator-(const Polynomial &c):多项式减法。 - int calcPoly(int x):计算多项式在x处的。 下面是具体实现: ``` class Polynomial { private: PolyNode *head; // 多项式头节点指针 int n; // 多项式项数 public: Polynomial() { head = nullptr; n = 0; } ~Polynomial() { PolyNode *p = head, *q; while (p) { q = p->next; delete p; p = q; } head = nullptr; n = 0; } void createPoly() { cout << "请输入多项式的项数n:"; cin >> n; PolyNode *p = head, *q; for (int i = 1; i <= n; i++) { int coef, expn; cout << "请输入第" << i << "项的系数和指数:"; cin >> coef >> expn; q = new PolyNode; q->coef = coef; q->expn = expn; q->next = nullptr; if (!head) { head = q; p = q; } else { p->next = q; p = q; } } } void printPoly() { PolyNode *p = head; cout << "多项式的项数为:" << n << endl; cout << "多项式各项系数和指数依次为:"; while (p) { cout << p->coef << " " << p->expn << " "; p = p->next; } cout << endl; } Polynomial operator+(const Polynomial &b) { Polynomial c; PolyNode *p = head, *q = b.head, *r = c.head, *s; while (p && q) { if (p->expn < q->expn) { s = new PolyNode; s->coef = p->coef; s->expn = p->expn; s->next = nullptr; if (!c.head) { c.head = s; r = s; } else { r->next = s; r = s; } c.n++; p = p->next; } else if (p->expn > q->expn) { s = new PolyNode; s->coef = q->coef; s->expn = q->expn; s->next = nullptr; if (!c.head) { c.head = s; r = s; } else { r->next = s; r = s; } c.n++; q = q->next; } else { s = new PolyNode; s->coef = p->coef + q->coef; s->expn = p->expn; s->next = nullptr; if (!c.head) { c.head = s; r = s; } else { r->next = s; r = s; } c.n++; p = p->next; q = q->next; } } while (p) { s = new PolyNode; s->coef = p->coef; s->expn = p->expn; s->next = nullptr; r->next = s; r = s; c.n++; p = p->next; } while (q) { s = new PolyNode; s->coef = q->coef; s->expn = q->expn; s->next = nullptr; r->next = s; r = s; c.n++; q = q->next; } return c; } Polynomial operator-(const Polynomial &c) { Polynomial d; PolyNode *p = head, *q = c.head, *r = d.head, *s; while (p && q) { if (p->expn < q->expn) { s = new PolyNode; s->coef = p->coef; s->expn = p->expn; s->next = nullptr; if (!d.head) { d.head = s; r = s; } else { r->next = s; r = s; } d.n++; p = p->next; } else if (p->expn > q->expn) { s = new PolyNode; s->coef = -q->coef; s->expn = q->expn; s->next = nullptr; if (!d.head) { d.head = s; r = s; } else { r->next = s; r = s; } d.n++; q = q->next; } else { s = new PolyNode; s->coef = p->coef - q->coef; s->expn = p->expn; s->next = nullptr; if (!d.head) { d.head = s; r = s; } else { r->next = s; r = s; } d.n++; p = p->next; q = q->next; } } while (p) { s = new PolyNode; s->coef = p->coef; s->expn = p->expn; s->next = nullptr; r->next = s; r = s; d.n++; p = p->next; } while (q) { s = new PolyNode; s->coef = -q->coef; s->expn = q->expn; s->next = nullptr; r->next = s; r = s; d.n++; q = q->next; } return d; } int calcPoly(int x) { int result = 0; PolyNode *p = head; while (p) { result += p->coef * pow(x, p->expn); p = p->next; } return result; } }; ``` 这样,我们就可以通过链式存储结构实现一元稀疏多项式简单计算器了。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值