私は大きな行列nを持っています!xn !、行列式を取る必要があります。nの順列ごとに、関連付けます
- 長さ2nのベクトル(これは計算上簡単です)
- in 2n変数の多項式(nで再帰的に計算された線形因子の積)
行列は、ベクトルでの多項式の評価行列です(点として考えられます)。したがって、行列のsigma、tauエントリ(順列によってインデックス付けされます)は、tauのベクトルで評価されたシグマの多項式です。
例: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
すでに最適化されているので、ここでの本当の問題は、行列式を構築することによって行列式を取得するより速い方法があるかどうかです。飛ぶ、またはそのようなもの。
更新:これは私がいじった2つのアイデアが機能しないものです:
多項式を長さのベクトルに格納し(計算に時間がかかるため、やり直したくない)、
n!
その場で点を計算し、これらの値を順列式に代入することができます。行列式の場合:ここでの問題は、これが
O(N!)
行列のサイズにあることです。したがって、私の場合、これはになりますO((n!)!)
。いつn=10
、(n!)! = 3,628,800!
それはやることを検討するのにさえ大きな方法です。LU分解を使用して行列式を計算します。幸い、私の行列の主対角線はゼロ以外なので、これは実行可能です。これは
O(N^3)
マトリックスのサイズであるため、O((n!)^3)
実行可能にはるかに近いものになります。ただし、問題は、マトリックス全体を保存する必要があることです。これにより、メモリに深刻な負担がかかり、実行時間を気にする必要がありません。したがって、これも機能しません。少なくとももう少し賢くなければ機能しません。何か案は?