我正在写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都在一起。
答案 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是项数。它从一开始就看起来与你想要做的很接近,或者至少在表现方面是相似的。