【问题标题】:help with multiplying polynomials in lisp帮助在 lisp 中乘以多项式
【发布时间】:2010-05-15 06:40:18
【问题描述】:

例如:(3x2 - 5x + 2)(7x + 1) 你可以这样简化:

((3 2)(-5 1)(2 0))((7 1)(1 0))
((21 3)(3 2)(-35 2)(-5 1)(14 1)(2 0))
(21 3)(32 2)(9 1)(2 0)

你会得到这个答案:21x3 + 32x2 + 9x + 2

我在 lisp 中需要这个解决方案,请帮助

【问题讨论】:

  • 这是作业吗?如果是这样,你应该这样标记它。
  • 首先,检查你的代数——你的答案不正确。然后,向我们展示您到目前为止所做的尝试。你有什么问题?
  • 为什么错了?你写: (3x2-5x+2) 就像 ((3 2) (-5 1) (2 0)) 所以你先写 3 然后是幂 2 如果 5 有一个简单的 x 那么它就是 1,如果我们没有有 x 然后它是 0 下一步你 multyply 并添加 ((a b)(c d))((f g)(j k))=(((af) (b+g)) ((a j)(b+k))((cf)(d+g))((cj)(d+k))) 然后结合: (3 2) 和 (- 35 2) 和 (-5 1) 和 (14 1) 然后你变换和计算 21x3+32x2+9x+2

标签: polynomial-math clisp simplification


【解决方案1】:

对于第一阶段,您需要将每个 LHS 组件与每个 RHS 组件配对;两组的笛卡尔积。这需要一个二级映射,然后将二级对列表串联成一个顶级列表(想想(apply #'append ...)。

第二阶段可以通过建立关联列表的reduce来完成,以指数为键。

编辑:让我为您解决一个不同的问题,并让您弄清楚如何将其转化为您的问题的解决方案:

计算(a + b + ... + k) * (l + m + ... + z),首先展开成对,然后对乘积求和:

(defun mul-sums (aa bb)
  (reduce #'+
          (apply #'append
                 (map 'list
                      #'(lambda (a)
                          (map 'list
                               #'(lambda (b)
                                   (* a b))
                               bb))
                      aa))))
; Compute (1 + 2 + 3) * (3 + 4).
> (mul-sums '(1 2 3) '(3 4))
42

【讨论】:

    猜你喜欢
    • 2013-08-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-27
    相关资源
    最近更新 更多