# Revision history [back]

The vectors $\ell$ and $k$ introduced in this notebook correspond to Eqs. (12.3.5) and (12.3.6) of Wald's textbook General Relativity (1984).

You can check that they do define repeated principal null directions, i.e. that they obey the following identity (where $C^a_{\ \ bcd}$ stands for the Weyl tensor) $$C^a_{\ \ mn[b} k_{c]} k^m k^n = 0,\qquad\qquad\mbox{(1)}$$ with SageMath itself (no need of Mathematica!). It suffices to run (same notations as in the original notebook)

C = g.weyl()
(C.contract(1, 2, k*k, 0, 1) * k.down(g)).antisymmetrize(1, 2).display()


which yields 0.

If you prefer to use index notations (passed as strings in LaTeX format) instead of contract() and antisymmetrize(), SageMath allows for it as well. The check of (1) is then equivalent to

A = C['^a_{mnb}'] * (k*k)['^{mn}']
kf = g['_{am}'] * k['^m']
(A*kf)['^a_{[bc]}'].display()


the outcome of which is 0.

A Jupyter notebook implementing the check of (1) by both methods is posted here.

The vectors $\ell$ and $k$ introduced in this notebook correspond to Eqs. (12.3.5) and (12.3.6) of Wald's textbook General Relativity (1984).

You can check that they do define repeated principal null directions, i.e. that they obey the following identity (where $C^a_{\ \ bcd}$ stands for the Weyl tensor) $$C^a_{\ \ mn[b} k_{c]} k^m k^n = 0,\qquad\qquad\mbox{(1)}$$ with SageMath itself (no need of Mathematica!). Mathematica ;-)). It suffices to run (same notations as in the original notebook)

C = g.weyl()
(C.contract(1, 2, k*k, 0, 1) * k.down(g)).antisymmetrize(1, 2).display()


which yields 0.

If you prefer to use index notations (passed as strings in LaTeX format) instead of contract() and antisymmetrize(), SageMath allows for it as well. The check of (1) is then equivalent to

A = C['^a_{mnb}'] * (k*k)['^{mn}']
kf = g['_{am}'] * k['^m']
(A*kf)['^a_{[bc]}'].display()


the outcome of which is 0.

A Jupyter notebook implementing the check of (1) by both methods is posted here.

.