I am considering identities involving t[a, b, c, d, ...]
, where number of indices is fixed. t
has the cyclic property so that t[3, 4, 1, 2]
is equal to t[1, 2, 3, 4]
.
When $k=4$, all possible elements are generated by
basis = (# /. {List -> t}) & /@ Permutations[Range[4]];
basis = basis /. {t[a___, 1, b___] -> t[1, b, a]} // Union
Here comes the output:
{t[1, 2, 3, 4], t[1, 2, 4, 3], t[1, 3, 2, 4], t[1, 3, 4, 2], t[1, 4, 2, 3], t[1, 4, 3, 2]}
I want to convert expressions like t[1, 2, 3, 4] + t[1, 3, 2, 4] - t[1, 4, 3, 2]
into a coefficient matrix to do some linear algebra. I tried the following code:
identity = {t[1, 2, 3, 4] + t[1, 3, 2, 4] - t[1, 4, 3, 2],
t[1, 2, 4, 3] + t[1, 3, 2, 4],
t[1, 3, 4, 2] - t[1, 2, 3, 4] - t[1, 4, 2, 3]};
coeffmatrix = Coefficient[identity, #] & /@ basis // Transpose
The output is
{{1, 0, 1, 0, 0, -1}, {0, 1, 1, 0, 0, 0}, {-1, 0, 0, 1, -1, 0}}.
Efficiency does not matter for this small example. However, when I increase number of indices and identities, getting coeffmatrix
becomes very slow and spends a huge amount of memory. For the real case, t
has 10 indices and the size of coeffmatrix
is approximately $362880 \times 362880$.
Here comes my question: Coefficients are always restricted to {-1, 0, 1}
for some reasons. Would this fact probably help me to boost up the performance? Could anyone give me a suggestion for better efficiency?
SparseArray
help? $\endgroup$SparseArray
. What is the benefit to useSparseArray
? $\endgroup$SparseArray
? $\endgroup$CoefficientArrays
, by the way, produces aSparseArray
, so if you want to test performance you can compute the rank using the matrices computed by both your algorithm and Mr. Wizard's, and see which is faster. $\endgroup$