基于符号和指数排序多项式

时间:2015-12-02 12:50:59

标签: lisp common-lisp polynomial-math clisp

我正在写lisp中编写多项式算术,目前正在进行加法。我需要帮助用指数和符号对多项式进行排序。我的多项式表示如下:

((3 ((1 x)(1 y))) (1 ((3 y)))) ; == 3xy + 1y^3

我需要指导的功能有一个像

这样的术语
((5 ((3 x))) (3 ((3 y))) (4 ((2 z)))) ((6 ((3 x))) (1 ((3 y))) (9 ((2 z)))))

我想要:

((4 ((2 Z))) (9 ((2 Z))) (5 ((3 X))) (6 ((3 X))) (3 ((3 Y))) (1 ((3 Y))))

返回,所以所有z ^ 2和z ^ 2都在一起。

2 个答案:

答案 0 :(得分:1)

您的初始示例显示了包含两个变量的术语(例如,3xy),但稍后您的示例却没有。这个解决方案不会处理多个变量项的情况(你无论如何都没有说过你想要如何分组),但它会处理你的例子。

首先,定义一些用于处理多项式项的抽象,因为它们目前相当不方便。这里有三个函数可以更容易地从每个术语中提取系数,程度和变量:

(defun polynomial-term-coefficient (term)
  (destructuring-bind (coefficient ((degree variable))) term
    (declare (ignore degree variable))
    coefficient))

(defun polynomial-term-degree (term)
  (destructuring-bind (coefficient ((degree variable))) term
    (declare (ignore coefficient variable))
    degree))

(defun polynomial-term-variable (term)
  (destructuring-bind (coefficient ((degree variable))) term
    (declare (ignore coefficient degree))
    variable))

然后,据我理解你的问题,你实际上是从两个多项式开始5x 3 + 3y 3 + 4z 2 和6x 3 + y 3 + 9z 2 。您首先将添加添加到一起,只需附加其条款列表即可。然后你可以排序在谓词字符串> (它带字符串指示符,所以符号正常),关键函数多项式术语可变即可。也就是说,您使用键功能来提取您实际想要排序的值。

(let ((p1 '((5 ((3 x))) (3 ((3 y))) (4 ((2 z)))))
      (p2 '((6 ((3 x))) (1 ((3 y))) (9 ((2 z))))))
  (let ((unsimplified-sum (append p1 p2)))
    (sort (copy-list unsimplified-sum) 'string> :key 'polynomial-term-variable)))
;=> ((4 ((2 Z))) (9 ((2 Z))) (3 ((3 Y))) (1 ((3 Y))) (5 ((3 X))) (6 ((3 X))))

答案 1 :(得分:0)

您可能希望搜索“Horner方法”,这是一种用于计算O(n)时间内多项式值的旧数值方法,n是项数。它从一开始就看起来与你想要做的很接近,或者至少在表现方面是相似的。