{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Principal null directions in Kerr spacetime\n", "\n", "This notebook demonstrates a few capabilities of SageMath in computations regarding Kerr spacetime. More precisely, it focuses on the principal null directions. This notebook makes use of SageMath tools developed through the [SageManifolds](https://sagemanifolds.obspm.fr) project." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "*NB:* a version of SageMath at least equal to 8.2 is required to run this notebook:" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "'SageMath version 8.8, Release Date: 2019-06-26'" ] }, "execution_count": 1, "metadata": {}, "output_type": "execute_result" } ], "source": [ "version()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "First we set up the notebook to display mathematical objects using LaTeX rendering:" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "%display latex" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "To speed up the computations, we ask for running them in parallel on 8 cores:" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [], "source": [ "Parallelism().set(nproc=8)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Spacetime manifold\n", "\n", "We declare the Kerr spacetime (or more precisely the Boyer-Lindquist domain of Kerr spacetime) as a 4-dimensional Lorentzian manifold:" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "4-dimensional Lorentzian manifold M\n" ] } ], "source": [ "M = Manifold(4, 'M', latex_name=r'\\mathcal{M}', structure='Lorentzian')\n", "print(M)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let us declare the **Boyer-Lindquist coordinates** via the method chart(), the argument of which is a string expressing the coordinates names, their ranges (the default is $(-\\infty,+\\infty)$) and their LaTeX symbols:" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Chart (M, (t, r, th, ph))\n" ] }, { "data": { "text/html": [ "" ], "text/plain": [ "Chart (M, (t, r, th, ph))" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "BL. = M.chart(r't r:(0,+oo) th:(0,pi):\\theta ph:(0,2*pi):\\phi') \n", "print(BL) ; BL" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "(t, r)" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "BL[0], BL[1]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "

## Metric tensor

\n", "\n", "

The 2 parameters $m$ and $a$ of the Kerr spacetime are declared as symbolic variables:

" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "(m, a)" ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "var('m, a', domain='real')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We get the (yet undefined) spacetime metric by " ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [], "source": [ "g = M.metric()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "

The metric is set by its components in the coordinate frame associated with Boyer-Lindquist coordinates, which is the current manifold's default frame:

" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "g = (2*m*r/(a^2*cos(th)^2 + r^2) - 1) dt*dt - 2*a*m*r*sin(th)^2/(a^2*cos(th)^2 + r^2) dt*dph + (a^2*cos(th)^2 + r^2)/(a^2 - 2*m*r + r^2) dr*dr + (a^2*cos(th)^2 + r^2) dth*dth - 2*a*m*r*sin(th)^2/(a^2*cos(th)^2 + r^2) dph*dt + (2*a^2*m*r*sin(th)^2/(a^2*cos(th)^2 + r^2) + a^2 + r^2)*sin(th)^2 dph*dph" ] }, "execution_count": 9, "metadata": {}, "output_type": "execute_result" } ], "source": [ "rho2 = r^2 + (a*cos(th))^2\n", "Delta = r^2 -2*m*r + a^2\n", "g[0,0] = -(1-2*m*r/rho2)\n", "g[0,3] = -2*a*m*r*sin(th)^2/rho2\n", "g[1,1], g[2,2] = rho2/Delta, rho2\n", "g[3,3] = (r^2+a^2+2*m*r*(a*sin(th))^2/rho2)*sin(th)^2\n", "g.display()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "

A matrix view of the components with respect to the manifold's default vector frame:

" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "[ 2*m*r/(a^2*cos(th)^2 + r^2) - 1 0 0 -2*a*m*r*sin(th)^2/(a^2*cos(th)^2 + r^2)]\n", "[ 0 (a^2*cos(th)^2 + r^2)/(a^2 - 2*m*r + r^2) 0 0]\n", "[ 0 0 a^2*cos(th)^2 + r^2 0]\n", "[ -2*a*m*r*sin(th)^2/(a^2*cos(th)^2 + r^2) 0 0 (2*a^2*m*r*sin(th)^2/(a^2*cos(th)^2 + r^2) + a^2 + r^2)*sin(th)^2]" ] }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" } ], "source": [ "g[:]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "

The list of the non-vanishing components:

" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "g_t,t = 2*m*r/(a^2*cos(th)^2 + r^2) - 1 \n", "g_t,ph = -2*a*m*r*sin(th)^2/(a^2*cos(th)^2 + r^2) \n", "g_r,r = (a^2*cos(th)^2 + r^2)/(a^2 - 2*m*r + r^2) \n", "g_th,th = a^2*cos(th)^2 + r^2 \n", "g_ph,t = -2*a*m*r*sin(th)^2/(a^2*cos(th)^2 + r^2) \n", "g_ph,ph = (2*a^2*m*r*sin(th)^2/(a^2*cos(th)^2 + r^2) + a^2 + r^2)*sin(th)^2 " ] }, "execution_count": 11, "metadata": {}, "output_type": "execute_result" } ], "source": [ "g.display_comp()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "

## Levi-Civita Connection

\n", "\n", "

The Levi-Civita connection $\\nabla$ associated with $g$:

" ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Levi-Civita connection nabla_g associated with the Lorentzian metric g on the 4-dimensional Lorentzian manifold M\n" ] } ], "source": [ "nabla = g.connection() ; print(nabla)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "

Let us verify that the covariant derivative of $g$ with respect to $\\nabla$ vanishes identically:

" ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "nabla_g(g) = 0" ] }, "execution_count": 13, "metadata": {}, "output_type": "execute_result" } ], "source": [ "nabla(g).display()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "

## Killing vectors

\n", "

The default vector frame on the spacetime manifold is the coordinate basis associated with Boyer-Lindquist coordinates:

" ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "True" ] }, "execution_count": 14, "metadata": {}, "output_type": "execute_result" } ], "source": [ "M.default_frame() is BL.frame()" ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "Coordinate frame (M, (d/dt,d/dr,d/dth,d/dph))" ] }, "execution_count": 15, "metadata": {}, "output_type": "execute_result" } ], "source": [ "BL.frame()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "

Let us consider the first vector field of this frame:

" ] }, { "cell_type": "code", "execution_count": 16, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "Vector field d/dt on the 4-dimensional Lorentzian manifold M" ] }, "execution_count": 16, "metadata": {}, "output_type": "execute_result" } ], "source": [ "xi = BL.frame()[0] ; xi" ] }, { "cell_type": "code", "execution_count": 17, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Vector field d/dt on the 4-dimensional Lorentzian manifold M\n" ] } ], "source": [ "print(xi)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "

The 1-form associated to it by metric duality is

" ] }, { "cell_type": "code", "execution_count": 18, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "-(a^2*cos(th)^2 - 2*m*r + r^2)/(a^2*cos(th)^2 + r^2) dt - 2*a*m*r*sin(th)^2/(a^2*cos(th)^2 + r^2) dph" ] }, "execution_count": 18, "metadata": {}, "output_type": "execute_result" } ], "source": [ "xi_form = xi.down(g) ; xi_form.display()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "

Its covariant derivative is

" ] }, { "cell_type": "code", "execution_count": 19, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Tensor field of type (0,2) on the 4-dimensional Lorentzian manifold M\n" ] }, { "data": { "text/html": [ "" ], "text/plain": [ "(a^2*m*cos(th)^2 - m*r^2)/(a^4*cos(th)^4 + 2*a^2*r^2*cos(th)^2 + r^4) dt*dr + 2*a^2*m*r*cos(th)*sin(th)/(a^4*cos(th)^4 + 2*a^2*r^2*cos(th)^2 + r^4) dt*dth - (a^2*m*cos(th)^2 - m*r^2)/(a^4*cos(th)^4 + 2*a^2*r^2*cos(th)^2 + r^4) dr*dt + (a^3*m*cos(th)^2 - a*m*r^2)*sin(th)^2/(a^4*cos(th)^4 + 2*a^2*r^2*cos(th)^2 + r^4) dr*dph - 2*a^2*m*r*cos(th)*sin(th)/(a^4*cos(th)^4 + 2*a^2*r^2*cos(th)^2 + r^4) dth*dt + 2*(a^3*m*r + a*m*r^3)*cos(th)*sin(th)/(a^4*cos(th)^4 + 2*a^2*r^2*cos(th)^2 + r^4) dth*dph - (a^3*m*cos(th)^2 - a*m*r^2)*sin(th)^2/(a^4*cos(th)^4 + 2*a^2*r^2*cos(th)^2 + r^4) dph*dr - 2*(a^3*m*r + a*m*r^3)*cos(th)*sin(th)/(a^4*cos(th)^4 + 2*a^2*r^2*cos(th)^2 + r^4) dph*dth" ] }, "execution_count": 19, "metadata": {}, "output_type": "execute_result" } ], "source": [ "nab_xi = nabla(xi_form) ; print(nab_xi) ; nab_xi.display()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "

Let us check that the Killing equation is satisfied:

" ] }, { "cell_type": "code", "execution_count": 20, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "True" ] }, "execution_count": 20, "metadata": {}, "output_type": "execute_result" } ], "source": [ "nab_xi.symmetrize() == 0" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "

Similarly, let us check that $\\frac{\\partial}{\\partial\\phi}$ is a Killing vector:

" ] }, { "cell_type": "code", "execution_count": 21, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "Vector field d/dph on the 4-dimensional Lorentzian manifold M" ] }, "execution_count": 21, "metadata": {}, "output_type": "execute_result" } ], "source": [ "chi = BL.frame()[3] ; chi" ] }, { "cell_type": "code", "execution_count": 22, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "True" ] }, "execution_count": 22, "metadata": {}, "output_type": "execute_result" } ], "source": [ "nabla(chi.down(g)).symmetrize() == 0" ] }, { "cell_type": "markdown", "metadata": { "collapsed": true }, "source": [ "## Principal null vectors\n", "\n", "Let us consider the following vector fields $k$ and $\\ell$, defined from their components with respect to Boyer-Lindquist coordinates:" ] }, { "cell_type": "code", "execution_count": 23, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "k = 1/2*(a^2 + r^2)/(a^2*cos(th)^2 + r^2) d/dt - 1/2*(a^2 - 2*m*r + r^2)/(a^2*cos(th)^2 + r^2) d/dr + 1/2*a/(a^2*cos(th)^2 + r^2) d/dph" ] }, "execution_count": 23, "metadata": {}, "output_type": "execute_result" } ], "source": [ "k = M.vector_field(name='k')\n", "k[:] = [(r^2+a^2)/(2*rho2), -Delta/(2*rho2), 0, a/(2*rho2)]\n", "k.display()" ] }, { "cell_type": "code", "execution_count": 24, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "el = (a^2 + r^2)/(a^2 - 2*m*r + r^2) d/dt + d/dr + a/(a^2 - 2*m*r + r^2) d/dph" ] }, "execution_count": 24, "metadata": {}, "output_type": "execute_result" } ], "source": [ "el = M.vector_field(name='el', latex_name=r'\\ell')\n", "el[:] = [(r^2+a^2)/Delta, 1, 0, a/Delta]\n", "el.display()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let us check that $k$ and $\\ell$ are null vectors:" ] }, { "cell_type": "code", "execution_count": 25, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "0" ] }, "execution_count": 25, "metadata": {}, "output_type": "execute_result" } ], "source": [ "g(k,k).expr()" ] }, { "cell_type": "code", "execution_count": 26, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "0" ] }, "execution_count": 26, "metadata": {}, "output_type": "execute_result" } ], "source": [ "g(el,el).expr()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Their scalar product is $-1$:" ] }, { "cell_type": "code", "execution_count": 27, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "-1" ] }, "execution_count": 27, "metadata": {}, "output_type": "execute_result" } ], "source": [ "g(k,el).expr()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Note that the scalar product (with respect to metric $g$) can also be computed by means of the method dot:" ] }, { "cell_type": "code", "execution_count": 28, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "-1" ] }, "execution_count": 28, "metadata": {}, "output_type": "execute_result" } ], "source": [ "k.dot(el).expr()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let us evaluate the \"acceleration\" of $k$, i.e. $\\nabla_k k$:" ] }, { "cell_type": "code", "execution_count": 29, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "1/2*(a^4*m - m*r^4 - (a^4*m - a^4*r + a^2*m*r^2 - a^2*r^3)*sin(th)^2)/(a^6*cos(th)^6 + 3*a^4*r^2*cos(th)^4 + 3*a^2*r^4*cos(th)^2 + r^6) d/dt - 1/2*(a^4*m - 2*a^2*m^2*r + 2*m^2*r^3 - m*r^4 - (a^4*m + 3*a^2*m*r^2 - a^2*r^3 - (a^4 + 2*a^2*m^2)*r)*sin(th)^2)/(a^6*cos(th)^6 + 3*a^4*r^2*cos(th)^4 + 3*a^2*r^4*cos(th)^2 + r^6) d/dr + 1/2*(a^3*r - a*m*r^2 + (a^3*m - a^3*r)*cos(th)^2)/(a^6*cos(th)^6 + 3*a^4*r^2*cos(th)^4 + 3*a^2*r^4*cos(th)^2 + r^6) d/dph" ] }, "execution_count": 29, "metadata": {}, "output_type": "execute_result" } ], "source": [ "acc_k = nabla(k).contract(k)\n", "acc_k.display()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We check that $k$ is a pregeodesic vector, i.e. that $\\nabla_k k = \\kappa_k k$ for some scalar field $\\kappa_k$:" ] }, { "cell_type": "code", "execution_count": 30, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "(a^2*m - m*r^2 - (a^2*m - a^2*r)*sin(th)^2)/(a^4*cos(th)^4 + 2*a^2*r^2*cos(th)^2 + r^4)" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "" ], "text/plain": [ "(a^2*m - m*r^2 - (a^2*m - a^2*r)*sin(th)^2)/(a^4*cos(th)^4 + 2*a^2*r^2*cos(th)^2 + r^4)" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "" ], "text/plain": [ "(a^2*r - m*r^2 + (a^2*m - a^2*r)*cos(th)^2)/(a^4*cos(th)^4 + 2*a^2*r^2*cos(th)^2 + r^4)" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "for i in [0,1,3]:\n", " show(acc_k[i] / k[i])" ] }, { "cell_type": "code", "execution_count": 31, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "M --> R\n", "(t, r, th, ph) |--> (a^2*m - m*r^2 - (a^2*m - a^2*r)*sin(th)^2)/(a^4*cos(th)^4 + 2*a^2*r^2*cos(th)^2 + r^4)" ] }, "execution_count": 31, "metadata": {}, "output_type": "execute_result" } ], "source": [ "kappa_k = acc_k[[0]] / k[[0]]\n", "kappa_k.display()" ] }, { "cell_type": "code", "execution_count": 32, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "True" ] }, "execution_count": 32, "metadata": {}, "output_type": "execute_result" } ], "source": [ "acc_k == kappa_k * k" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Similarly let us evaluate the \"acceleration\" of $\\ell$:" ] }, { "cell_type": "code", "execution_count": 33, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "0" ] }, "execution_count": 33, "metadata": {}, "output_type": "execute_result" } ], "source": [ "acc_l = nabla(el).contract(el)\n", "acc_l.display()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Hence $\\ell$ obeys $\\nabla_\\ell\\, \\ell=0$, i.e. it is a geodesic vector." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Check that $k$ and $\\ell$ are doubly degenerate principal null vectors" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "$k$ defines a **repeated null direction** (one says that $k$ is a **doubly degenerate principal null vector**) iff it obeys the following identity:\n", "$$C^a_{\\ \\, mn[b} k_{c]} k^m k^n = 0 \\qquad \\mbox{(1)},$$\n", "where $C$ is the Weyl tensor of the metric $g$." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The Weyl tensor is computed via" ] }, { "cell_type": "code", "execution_count": 34, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Tensor field C(g) of type (1,3) on the 4-dimensional Lorentzian manifold M\n" ] } ], "source": [ "C = g.weyl()\n", "print(C)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "For instance, the component $C^0_{\\ \\, 010} = C^t_{\\ \\, trt}$ is" ] }, { "cell_type": "code", "execution_count": 35, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "(3*a^4*m*r*cos(th)^4 + 3*a^2*m*r^3 + 2*m*r^5 - (9*a^4*m*r + 7*a^2*m*r^3)*cos(th)^2)/(a^2*r^6 - 2*m*r^7 + r^8 + (a^8 - 2*a^6*m*r + a^6*r^2)*cos(th)^6 + 3*(a^6*r^2 - 2*a^4*m*r^3 + a^4*r^4)*cos(th)^4 + 3*(a^4*r^4 - 2*a^2*m*r^5 + a^2*r^6)*cos(th)^2)" ] }, "execution_count": 35, "metadata": {}, "output_type": "execute_result" } ], "source": [ "C[0, 1, 0, 1]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We can check the identity (1) in a single line as follows:" ] }, { "cell_type": "code", "execution_count": 36, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "0" ] }, "execution_count": 36, "metadata": {}, "output_type": "execute_result" } ], "source": [ "(C.contract(1, 2, k*k, 0, 1) * k.down(g)).antisymmetrize(1, 2).display()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Alternatively, we may check (1) by using index notations.\n", "First, we introduce the tensor $A^a_{\\ \\, b} = C^a_{\\ \\, mnb} k^m k^n$:" ] }, { "cell_type": "code", "execution_count": 37, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Tensor field of type (1,1) on the 4-dimensional Lorentzian manifold M\n" ] } ], "source": [ "A = C['^a_{mnb}'] * (k*k)['^{mn}']\n", "print(A)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "and the 1-form $k_a = g_{am} k^m$:" ] }, { "cell_type": "code", "execution_count": 38, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "1-form on the 4-dimensional Lorentzian manifold M\n" ] } ], "source": [ "kf = g['_{am}'] * k['^m']\n", "print(kf)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Then (1) is equivalent to $A^a_{\\ \\, [b} k_{c]} = 0$, which is readily checked as" ] }, { "cell_type": "code", "execution_count": 39, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "0" ] }, "execution_count": 39, "metadata": {}, "output_type": "execute_result" } ], "source": [ "(A*kf)['^a_{[bc]}'].display()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Similarly, let us check that $\\ell$ obeys (1) as well:" ] }, { "cell_type": "code", "execution_count": 40, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "0" ] }, "execution_count": 40, "metadata": {}, "output_type": "execute_result" } ], "source": [ "(C.contract(1, 2, el*el, 0, 1) * el.down(g)).antisymmetrize(1, 2).display()" ] } ], "metadata": { "kernelspec": { "display_name": "SageMath 8.8", "language": "sage", "name": "sagemath" }, "language": "python", "language_info": { "codemirror_mode": { "name": "ipython", "version": 2 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython2", "version": "2.7.15" } }, "nbformat": 4, "nbformat_minor": 1 }