我正在编写一个代码,用于处理n
度d
的多项式 - x
- 维变量c(alpha)
,并遇到了其他人过去可能面临的问题。这样的多项式可以通过对应于x^alpha
的系数alpha
来表征,其中d
是长度为d
的多索引,指定必须提高n = 30
变量的幂到。
维度和顺序是完全通用的,但在编译时是已知的,并且可以很容易地与d = 10
和n + d choose n
一样高,但可能不是在同一时间。在大多数系数都不为零的意义上,系数是密集的。
指定这样的多项式所需的系数数量为n^d
,其在高维度上远小于可填充边长n
的立方体的alpha
系数。因此,在我的情况下,我必须相当紧凑地存储系数。这是有代价的,因为检索给定多索引d
的系数需要知道它的位置。
是否有(直接)函数将alpha
维多指数(n + d) choose n
映射到长度为{{1}}的数组中的位置?
答案 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很便宜;那个数组不会让你失败。