Unless I'm mistaken, you have to write a rule yourself, but
Mathematica is not guaranteed to actually be able to match the pattern
-- especially if you have the cyclic sum of Riemann contracted with
another tensor expression, all multiplied out.
I think you have to give Mathematica some guidance in this case. I
would define the rule
Bianch1Rule = MakeRule[{ Riemanncd[-a, -b, -c, -d] , -Riemanncd[-b,
-c, -a, -d] - Riemanncd[-c, -a, -b, -d] }];
If you apply this rule to your whole expression, you will simply
double the number of Riemann terms without making any progress. But if
you apply this rule to a specific part of your expression, you can
make the cyclic combination vanish. For example, an expression like
expr = Texp[a,b] Riemanncd[-a, -b, -c, -d] + Texp[a,b] Riemanncd[-b,
-c, -a, -d] + Texp[a,b] Riemanncd[-c, -a, -b, -d];
should vanish, with Texp[a,b] any tensor expression. If you apply the
rule just to one of the terms, you will introduce -(other two terms),
e.g.
MapAt[ Replace[ #, Bianchi1Rule ] &, expr , 1 ] // ToCanonical
> 0
I have been lucky enough to only have to implement the first Bianchi
identity in the form of
MakeRule[ { Riemanncd[-a, -b, -c, -d] epsilonmet[ a, b, c, e] , 0 } ]
which is much simpler to deal with.
Does anybody have more wisdom about multiterm symmetries?
Good luck,
Leo
>
> I'd like to use xAct to help verify some of my tensor computations.
> At one point I need to use the first Bianchi identity. For example,
> if I have the expression
>
> Riemanncd[-a, -b, -c, -d] + Riemanncd[-b, -c, -a, -d] +
> Riemanncd[-c, -a, -b, -d]
>
> what is the easiest way for xAct to simplify this to zero?
>
> I feel bad for asking such an elementary question, but I couldn't find
> a good answer after spending a fair amount of time searching the
> documentation. Probably I missed something obvious.
>
> I noticed that "Invar" states:
>
>> There is no known efficient algorithm to handle the cyclic and Bianchi symmetries of Riemann
>
Noticing that
1/12 a1 a2 R_a1b1a2b3 = R_a1b1a2b3
b1 b2
where a1 a2 is a Young symmetrizer,
b1 b2
you can replace the Riemann's entering a Bianchi-type sum by the combination
of Riemann's resulting from applying explicitly the above projector. I believe
this yields an expression that vanishes identically. But this is really a
brute force solution...
See the following link
http://www.qgf.uni-jena.de/gk_quantenmedia/Texte/schoebel100112-p-97.pdf
for a clear and short introduction to this type of approach.
I don't know much myself about it and perhaps some of you are more familiar
than me with representations theory of Sn and GL(N).
Yours,
Guillaume.
Yes, that's one (the only one?) systematic method that you can use to
eliminate multi-term symmetries. In more general situations, the idea
is that you can use young projectors to construct a basis of tensor
monomials, after which any monomial with the same tensors can be
written on that basis.
(shameless plug: see appendix A of http://arxiv.org/pdf/hep-th/0506161
for some more info).
Cheers,
Kasper
Leo: Thanks for the MakeRule tutorial! I never thought to use the
MapAt command. I'm currently trying to use xAct to perform
computations with the Vafa-Witten equations.
Cyril: This is a great idea for my purposes. I already know the
supposed answer for most of my computations, so I mainly need to
verify that LHS - RHS = 0. (I'm mainly concerned with sign errors.)
Zero-checking sounds possibly easier than canonicalizing, and it seems
like the Christoffel symbols do this nicely. I really appreciate your
suggestion for converting PD->CD, since I didn't understand that
error: "Detected metric-incompatible derivatives"
Guillaume: Those slides were very informative. I didn't realize that
Riemann curvature was irreducible as a representation of GL(N).
I'm most interested in representations of SO(4). Since SO(4) is a
quotient of SU(2)xSU(2), the large N theory doesn't apply well. Does
anyone have ideas for implementing projectors for these
representations?
Kasper: Thanks for sharing about the Garnir symmetries. That looks
like an incredibly useful technique!
Thomas: Thanks for your implementation. It's really useful to see how
you did that.
Thanks once again for all your help!
Sincerely,
Ben
I'm sorry to revive this old thread, but I wrote some code on this
subject that others might also find useful. Basically, it's Thomas'
idea but the code is a bit shorter. Here it is:
bianchi1Rule =
RiemannCD[a_, b_, c_, d_] /; (Ordering[{b, c, d}] === {2, 3, 1}) ->
RiemannCD[a, c, b, d] - RiemannCD[a, d, b, c]
bianchi2Rule =
CD[a_]@RiemannCD[b_, c_, d__] /; (Ordering[{a, b, c}] === {2, 3, 1}) -
>
CD[b]@RiemannCD[a, c, d] - CD[c]@RiemannCD[a, b, d]
You could put these two rules in a convenience function, like so:
ApplyBianchi[expr_] :=
ToCanonical[expr] //. bianchi1Rule //. bianchi2Rule // ToCanonical
I haven't tested it thoroughly, but it appears to work :).
Cheers,
Teake Nutma
ApplyBianchi[expr_] :=
ToCanonical[ [ToCanonical[ToCanonical[expr] /. bianchi1Rule] /. bianchi2Rule] /. bianchi1Rule]
Hopefully, this should work, though I haven't tested it thoroughly either.