我需要在我的lisp程序中存储多项式以进行加减法和乘法。但找不到一种简单的方法来存储一个。
我考虑了以下方式
(2x^3 + 2x + 4y^3 - 2z( 在列表列表中,其中每个列表都是每个幂量的列表
= ( ( (0 2 0 2( (0 0 04( (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",那么有一个关于多项式的好章节。