多元多项式的紧凑存储系数

时间:2014-11-14 14:38:01

标签: arrays algorithm math

设置

我正在编写一个代码,用于处理nd的多项式 - x - 维变量c(alpha),并遇到了其他人过去可能面临的问题。这样的多项式可以通过对应于x^alpha的系数alpha来表征,其中d是长度为d的多索引,指定必须提高n = 30变量的幂到。

维度和顺序是完全通用的,但在编译时是已知的,并且可以很容易地与d = 10n + d choose n一样高,但可能不是在同一时间。在大多数系数都不为零的意义上,系数是密集的。

指定这样的多项式所需的系数数量为n^d,其在高维度上远小于可填充边长n的立方体的alpha系数。因此,在我的情况下,我必须相当紧凑地存储系数。这是有代价的,因为检索给定多索引d的系数需要知道它的位置。

问题

是否有(直接)函数将alpha维多指数(n + d) choose n映射到长度为{{1}}的数组中的位置?

2 个答案:

答案 0 :(得分:2)

订购组合

可以在this wikipedia page找到一种众所周知的订购组合方式。很简单,您可以通过词汇顺序对组合进行排序,这样您就可以轻松计算较低组合的数量。可以在订购组合组合的位置部分中找到解释。

预计算二项式系数将加快指数计算。

将单项式与组合相关联

如果我们现在可以将每个单项式与组合相关联,我们可以使用上述方法有效地对它们进行排序。由于每个系数对应于这样的单项式,这将提供您正在寻找的答案。幸运的是,如果

alpha = (a[1], a[2], ..., a[d])

那么你要找的组合是

combination = (a[1] + 0, a[1] + a[2] + 1, ..., a[1] + a[2] + ... + a[d] + d - 1)

然后可以使用维基百科页面中的公式轻松计算索引。

答案 1 :(得分:1)

更好,更面向对象的解决方案是创建Monomial和Polynomial类。 Polynomial类将封装Monomials集合。通过这种方式,您可以轻松地为病态案例建模,例如

y(x) = 1.0 + x^50

仅使用两个术语而不是51个。

另一个解决方案是地图/字典,其中键是指数,值是系数。对于我的病理案例,这只需要两个条目。如果您有C / C ++哈希映射,那么您就可以开展业务了。

就我个人而言,即使使用包含1000个术语的多项式,我也不认为使用数组是如此糟糕的天真方式。 RAM很便宜;那个数组不会让你失败。