# 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= 