我有一个大矩阵,n!xn!,为此我需要取行列式。对于 n 的每个排列,我将
- 长度为 2n 的向量(这在计算上很容易)
- 2n 个变量的多项式(在 n 上递归计算的线性因子的乘积)
该矩阵是向量处的多项式的评估矩阵(被认为是点)。所以矩阵的 sigma,tau 项(由排列索引)是在 tau 的向量处评估的 sigma 的多项式。
示例:对于n=3
,如果第i
th 多项式是(x1 - 4)(x3 - 5)(x4 - 4)(x6 - 1)
并且第j
th 点是(2,2,1,3,5,2)
,那么(i,j)
矩阵的第 th 项将是(2 - 4)(1 - 5)(3 - 4)(2 - 1) = -8
。这里n=3
,所以点在R^(3!) = R^6
并且多项式有3!=6
变量。
我的目标是确定矩阵是否是非奇异的。
我现在的做法是这样的:
- 该函数
point
接受一个排列并输出一个向量 - 该函数
poly
采用置换并输出多项式 - 该函数
nextPerm
按字典顺序给出下一个排列
我的代码的删节伪代码版本是这样的:
B := [];
P := [];
w := [1,2,...,n];
while w <> NULL do
B := B append poly(w);
P := P append point(w);
w := nextPerm(w);
od;
// BUILD A MATRIX IN MAPLE
M := Matrix(n!, (i,j) -> eval(B[i],P[j]));
// COMPUTE DETERMINANT IN MAPLE
det := LinearAlgebra[Determinant]( M );
// TELL ME IF IT'S NONSINGULAR
if det = 0 then return false;
else return true; fi;
我正在使用内置函数在 Maple 中工作LinearAlgebra[Determinant]
,但其他一切都是使用低级 Maple 函数(例如 和 )的自定义seq
构建convert
函数cat
。
我的问题是这需要很长时间,这意味着我可以n=7
耐心等待,但n=8
需要几天时间。理想情况下,我希望能够到达n=10
.
有谁知道我可以如何改善时间?我愿意使用不同的语言工作,例如 Matlab 或 C,但我更愿意在 Maple 中找到一种加快速度的方法。
我意识到如果没有所有血淋淋的细节,这可能很难回答,但是每个函数的代码,例如point
和poly
,已经优化,所以这里真正的问题是是否有更快的方法通过在飞,或类似的东西。
更新:这是我玩弄的两个不起作用的想法:
我可以将多项式(因为它们需要一些时间来计算,如果可以的话我不想重做)存储到一个长度向量中
n!
,并即时计算点,并将这些值插入置换公式对于行列式:这里的问题是这是
O(N!)
矩阵的大小,所以对于我来说这将是O((n!)!)
. 什么时候n=10
,(n!)! = 3,628,800!
甚至考虑这样做的方式都很大。使用 LU 分解计算行列式。幸运的是,我的矩阵的主对角线是非零的,所以这是可行的。由于这是
O(N^3)
矩阵的大小,这变得O((n!)^3)
更接近可行。但是,问题在于它需要我存储整个矩阵,这对内存造成了严重压力,更不用说运行时间了。所以这也行不通,至少在没有一点聪明的情况下是行不通的。有任何想法吗?