I have a tensor $t$ with components $t_{i_1 i_2 \dots i_n}$. The tensor $t$ has some index symmetries $\{s_i\}_{i=1}^m$. Consider now all index permutations $p = \{\{1,2,3,\dots,n\},\{2,1,3,\dots,n\},\dots\}$. I consider a permutations $p_i$ as linear independent, if the application of the permutation on the tensor $\pi(t,p_i)$ delivers a tensor which is not linear dependent of $t$, i.e., $\nexists \alpha \in \mathbb{R}: \pi(t,p_i) \neq \alpha t$.

Question: how do you efficiently extract the set of linear independent permutations?

My approach until now is to use the symbolic tools in Mathematica. For example, I will generate a symbolic tensor t (just as one example)

$Assumptions = {
   Element[t1, Arrays[{3, 3, 3}, Reals, Antisymmetric[{1, 2, 3}]]]
   , Element[t2, Arrays[{3, 3}, Reals, Symmetric[{1, 2}]]]
t = TensorProduct[t1, t2, t2];
ts = TensorSymmetry@t

{{Cycles[{{1, 2}}], -1}, {Cycles[{{2, 3}}], -1}, {Cycles[{{4, 5}}], 1}, {Cycles[{{6, 7}}], 1}, {Cycles[{{4, 6}, {5, 7}}], 1}}

where ts shows the index symmetries. Now, from all possible permutations p

p = Permutations@Range@TensorRank@t;

I will select the linear independent permutations as follows (the plus and minus cases arise due to the antisymmetric symmetries of t1 defined as an example above)

pli = Select[p, 
   Not[TensorReduce@TensorTranspose[t, #] === t || 
      TensorReduce@TensorTranspose[t, #] === -t] &];

You can then see




that, as expected, you can eliminate some of the p's, in this case 48 = 5040-4992 permutations were linearly dependent. Sadly, I have pretty large tensors and I am looking for efficient ways to improve the search for linear independent permutations. Any ideas? Thanks!


1 Answer 1


What you call the "linear independent permutations" are the permutations that do not belong to the symmetry group of the tensor. Hence a possible way to compute them is by finding the complement of those that do belong to the symmetry group. Using your notations:

group = PermutationGroup[First /@ ts];
syms = PermutationList[#, 7] & /@ GroupElements[group];

Then we have

Complement[p, syms] === pli
(* True *)

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge that you have read and understand our privacy policy and code of conduct.

Not the answer you're looking for? Browse other questions tagged or ask your own question.