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

时间:2014-11-30 15:45:00

标签: list lisp polynomial-math

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

我考虑过以下方式

列表列表中的

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

=((0 2 0 2)(0 0 0 4)(0 2))

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

是否有一种普遍接受的方式将它们存储在lisp中,这可以使它们尽可能容易地添加,减去它们并将它们相乘?

3 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:1)

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

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

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

答案 2 :(得分:0)

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

一种方法是从订单到系数的关联列表通常排序 按照命令。

12x ^ 2 + 11x + 10((2.12)(11。1)(10。0))

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

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

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

向量的长度减1表示多项式的阶数。

如果需要多个变量的多项式,则表示形式有变化。特别是你可以看一下Maxima中的表示:

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

如果您碰巧拥有"人工智能编程的范例:共同LISP中的案例研究"作者:Peter Norvig,关于多项式有一个很好的章节。