在 Lisp 中存储多变量多项式的最佳方法



我需要在我的lisp程序中存储多项式以进行加减法和乘法。但找不到一种简单的方法来存储一个。

我考虑了以下方式

(2x^3 + 2x + 4y^3 - 2z( 在列表列表中,其中每个列表都是每个幂量的列表

= ( ( (0 2 0 2( (0 0 0

4( (0 2( (

但是,每个列表的不确定长度和潜在长度可能会成为一个问题。

有没有一种普遍接受的方法来将它们存储在 lisp 中,可以使它们尽可能轻松地将它们加、减和相乘?

假设您事先知道可能的变量的数量,您可以像这样表示每个项:(constant x-exponent y-exponent z-exponent ...) . 然后5xy^2 (5 1 2 0),一个完整的表达式将只是这些术语的列表。

如果您希望能够处理任意数量的任意变量,则需要按照 ((constant 5) (a 0) (b 3) (z 23) (apple 13)) 行执行关联列表。

无论哪种方式,如果您从单个术语开始,都很容易构建更复杂的表达式,这样您就不需要弄乱多个维度。

也许这个想法会对你有所帮助。您可以将多项式表示为向量,当索引将是幂和元素(系数(和第一个元素(变量(时。我的意思是 5*x^3 + 10*x^2 + 40x + 50 看起来像#(50 40 10 5).使用这种表示很容易,但对于像 x^100 这样的大国来说,它看起来不是很理想。

多变量多项式可以表示为N维数组,其中N-变量数。

有几种表示多项式的方法。像往常一样,表示的选择是一种权衡。

一种方法是从顺序到系数的关联列表通常排序之后根据顺序。

12x^2 + 11x + 10 ((2 . 12( (11 . 1( (10 . 0((

如果需要使用稀疏多项式进行计算,则此表示形式可节省空间。 x^200 只是 ((200 . 1((。

如果您的计算主要由非稀疏多项式组成,则向量表示更节省空间:

12x^2 11x + 10(向量 10 11 12(

向量的长度减去 1 给出多项式的阶数。

如果您需要多个变量的多项式,则表示形式存在变体。特别是你可以看看千里马的表示:

http://maxima.sourceforge.net/docs/manual/maxima_14.html

如果你碰巧有Peter Norvig的"Paradigms of Artificial Intelligence Programming: Case Studies in Common LISP",那么有一个关于多项式的好章节。

最新更新