# Declaring constants and Antisymmetry in only some indices..

How do you declare

${f^{a}}_{b c}$

to be antisymmetric in just two indices, i.e. $b$ and $c$?

Also, how do you tell Cadabra that something, i.e. our structure constant above, is indeed a constant (when it appears under integrals or inside derivatives) and not dependent on $x$ or any $\texttt{Coordinate}$?

edited

If you have a tensor (anti)symmetric in only a subset of its indices, you need to use TableauSymmetry. In your case,

 f^{a}_{b c}::TableauSymmetry(shape={1,1}, indices={1,2});

after which

ex:= f^{a}_{b c} + f^{a}_{c b};
canonicalise(_);

yields zero. The arguments to TableauSymmetry mean that indices 1 and 2 of the 'f' tensor (counting starts from 0) should have the Young tableau symmetry given by a diagram with one column and two rows. That's an anti-symmetric tensor.

I am considering adding options to Symmetric and AntiSymmetric to make this more user-friendly (i.e. avoid having to use TableauSymmetry in simple situations such as yours). Will post a comment here when that is ready.

As for your second question, use the unwrap algorithm. Here's an example:

\partial{#}::PartialDerivative.
F{#}::Depends(\partial).
A{#}::Depends(\partial).
ex:=\int{ f^{a}_{b c} f_{a d e} \partial_{\mu}{A^{b c}_{\nu}} F^{d e \mu \nu}}{x};

then

integrate_by_parts(_, $A^{b c}_{\nu}$);
unwrap(_);

produces the answer you want, without derivatives hitting the structure constants.

(note: handling dependencies and integration variables is still a bit messy and will be cleaned up at some point in the near future).

by (66.3k points)
edited by

Thanks @kasper!

I'm in favour of defining the properties Symmetric and Antisymmetric! without dropping the TableauxSymmetry of course.

I hope you don't mind me resurrecting an old thread. But just to clarify, are the shape options to TableauSymmetry specified in the format (cols, rows)?

For example

g_{a b}::TableauSymmetry(shape={2,1}, indices={0, 1});
ex:=g_{b a};
canonicalise(_);

has the same effect as

g_{ab}::Symmetric;
ex:=g_{b a};
canonicalise(_);

And I assume we're using a row with 2 columns to indicate a symmetric rank-2 tensor, and a column with 2 rows to indicate an antisymmetric rank-2 tensor.

No, shape specifies a list of row lengths, so {2,1} is the tableau

XX
X

So a symmetric two-index tensor and and anti-symmetric tensor are given by the tableaux

symmetric: XX

and

antisymmetric: X
X

g_{a b}::TableauSymmetry(shape={2}, indices={0,1});
A_{a b}::TableauSymmetry(shape={1,1}, indices={0,1});

ex:= g_{b a} + A_{b a};
canonicalise(_);

gives $g_{a b} - A_{a b}$.

Hi Kasper,

Thanks for the helpful clarification! Perhaps you will consider adding the line, "shape specifies a list of row lengths" to the documentation as well (https://cadabra.science/manual/TableauSymmetry.html ).

Have added some information as well as the example in this thread to the manual page now.