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.