Efficiently Store Arrays with Symmetry

A new type of array allows you to specify and store only the independent components.
 In:= XSymmetrizedArray[{{1, 2} -> a, {1, 3} -> b, {2, 3} -> c}, {3, 3}, Antisymmetric[{1, 2}]]; % // Normal // MatrixForm
 Out//MatrixForm= For matrices, the only nontrivial symmetries are symmetry and antisymmetry, but for higher-rank arrays there are many more possibilities. The following figure illustrates some of them for a rank-4 array. Warm-colored squares represent independent components, with like-colored squares equal. Cold-colored squares are the negatives of the independent components, and white squares are forced to be zero by the symmetry. Storing only the independent components can produce enormous space savings.

 In:= Xnormal = Array[Signature[{##}] &, ConstantArray[8, 8]]; sparse = SparseArray@normal; symmetrized = SymmetrizedArray[Range -> 1, ConstantArray[8, 8], Antisymmetric[All]];
 In:= Xnormal == sparse == symmetrized ByteCount /@ {normal, sparse, symmetrized}
 Out= Out= This allows exterior algebra computations in large dimensions—in this case a 4-form and 20-form in 25 dimensions.

 In:= Xform1 = SymmetrizedArray[_ :> RandomInteger[], ConstantArray[25, 4], Antisymmetric[All]]; form2 = SymmetrizedArray[_ :> RandomInteger[], ConstantArray[25, 20], Antisymmetric[All]];
 In:= XHodgeDual[form1 \[TensorWedge] form2] // Normal
 Out= 