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?
SparseArrayhelp? – Tobias Hagge Apr 10 '13 at 00:58SparseArray. What is the benefit to useSparseArray? – Joonho Kim Apr 10 '13 at 01:06SparseArray? – Joonho Kim Apr 10 '13 at 05:47CoefficientArrays, 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. – Tobias Hagge Apr 10 '13 at 15:29