% -*- mode: Noweb; noweb-code-mode: maple-mode -*- % % The HyperKähler Potential for an Exceptional Next-to-Minimal Orbit % % by % % Piotr Kobak and Andrew Swann % % This file provides Maple code for computations in G2 and the % documentation of that code. For details of how to extract both of these % see \subsection{About this Document} below. % % $Id: g2.nw,v 1.4 2000/01/05 14:10:18 swann Exp $ \documentclass[12pt,titlepage]{article} \newif\ifpdf \ifx\pdfoutput\undefined\pdffalse\else\pdfoutput=1\pdftrue\fi \usepackage[latin1]{inputenc} \ifpdf \pdfcompresslevel=9 \else \usepackage[T1]{fontenc} \fi \usepackage{noweb,multicol,rcs,url} \usepackage{amsmath,amssymb,harvard,verbatim} \numberwithin{equation}{section} \pagestyle{noweb} \def\nwendcode{\endtrivlist \endgroup} \let\nwdocspar=\par \newcommand{\abs}[1]{\lvert #1\rvert} \newcommand{\inp}[3][]{\left\langle #2,#3\right\rangle_{#1}} \newcommand{\norm}[2][]{\left\lVert #2\right\rVert_{#1}} \newcommand{\Liegroupfont}{\textsl} \newcommand{\Liealgebrafont}{\mathfrak} \newcommand{\Lie}[1]{\operatorname{\Liegroupfont{#1}}} \newcommand{\lie}[1]{\operatorname{\Liealgebrafont{#1}}} \newcommand{\GL}{\Lie{GL}} \newcommand{\hook}{\mathbin{\lrcorner}} \newcommand{\maple}{\texttt{Maple}} \newcommand{\SL}{\Lie{SL}} \newcommand{\Sl}{\lie{sl}} \newcommand{\SO}{\Lie{SO}} \newcommand{\so}{\lie{so}} \newcommand{\SU}{\Lie{SU}} \DeclareMathOperator{\Tr}{Tr} \DeclareMathOperator{\vol}{vol} \newenvironment{spmatrix}{\left(\smallmatrix}{\endsmallmatrix\right)} \RCS $Revision: 1.4 $ \RCS $Date: 2000/01/05 14:10:18 $ % The following is a hack to get round a bug in noweb.sty \makeatletter \renewcommand{\weblabel}[1]{% \nwblindhyperanchor{#1}% \@bsphack\if@filesw {\let\thepage\relax \def\protect{\noexpand\noexpand\noexpand}% \edef\@tempa{\write\@auxout{\string \newsublabel{#1}{{}{\number\nw@chunkcount}}}}% \expandafter}\@tempa \global\advance\nw@chunkcount by \@ne \if@nobreak \ifvmode\nobreak\fi\fi\fi\@esphack} \makeatother \noweboptions{webnumbering} \ifpdf \usepackage[pdftex,colorlinks,backref,bookmarks]{hyperref} %\else % \usepackage[dvips,backref]{hyperref} \fi \begin{document} \citationstyle{dcu} @ \title{The HyperKähler Potential for an Exceptional Next-to-Minimal Orbit} \author{Piotr Kobak\\ \small Instytut Matematyki\\ \small Uniwersytet Jagiello\'nski\\ \small ul.\ Rey\-mon\-ta~4\\ \small 30-059 Krakow\\ \small Poland\\ \small E-mail: \texttt{kobak@im.uj.edu.pl} \and Andrew Swann\\ \small Department of Mathematics and Computer Science\\ \small University of Southern Denmark\\ \small Odense University\\ \small Campusvej 55\\ \small DK-5230 Odense M\\ \small Denmark\\ \small E-mail: \texttt{swann@imada.sdu.dk} } \date{Revision: \RCSRevision \qquad Last Modified: \RCSDate} \maketitle \tableofcontents @ \newpage \section{Introduction} The purpose of this file is to present some calculations done with the computer algebra system \maple{} needed for the paper~\cite{Kobak-Swann:hk-c2}. However, in the process we developed some routines that may be of more general interest for working with the exceptional Lie algebra~$\lie g_2$. The classification of simple Lie algebras over~$\mathbb C$ gives four infinite families, known as the classical Lie algebras, and five exceptional examples. The smallest of these is the $14$-dimensional algebra~$\lie g_2$. One definition of $\Lie G_2$ is as the automorphism group of the octonians~$\mathbb O$ or Cayley numbers. The group acts preserving the $7$-dimensional space of imaginary octonians and so has a natural description as a group of $7\times 7$ matrices. It is this concrete description that we use here. In many situations $\lie g_2$ is very like a classical Lie algebra and not too hard to work with. However, in \cite{Kobak-Swann:hk-c2}, $\lie g_2$~arose as one of only two exceptional cases in the problem we were considering. Surprisingly the other exceptional case was that of the classical algebra $\Sl(3,\mathbb C)$, which we happened to have tackled first some years earlier in~\cite{Kobak-Swann:nilpotent}. The problem we were considering is the following. A complex Lie algebra contains some elements that are \emph{nilpotent}, i.e., elements which become zero when raised to a high enough power. For example any matrix which is strictly upper triangular has this property. We may classify such matrices up to similarity, i.e., by their Jordan form. In an arbitrary Lie algebra this corresponds to determining the orbits of the adjoint action on such elements. \citeasnoun{Kronheimer:nilpotent} showed that every such orbit admits a special Riemannian structure, known as a hyperKähler metric. \citeasnoun{Swann:MathAnn} showed that Kronheimer's metrics had the special property of being given by a potential function on the orbit, a so-called \emph{hyperKähler potential}. The problem now is to compute this function explicitly. In \cite{Kobak-Swann:Wolf} this was done for the simplest orbits and the next most simple were considered in \cite{Kobak-Swann:hk-c2}. Surprisingly in this latter paper there was a uniform expression for the potential across all simple Lie algebras apart from $\Sl(3,\mathbb C)$ and $\lie g_2^{\mathbb C}$. In the uniform case it was possible for us to do the computation by hand, but for $\lie g_2^{\mathbb C}$ we resorted to using \maple. This file provides specific routines to find the hyperKähler potential for the next-to-minimal nilpotent orbit in~$\lie g_2^{\mathbb C}$ and also general routines for working with $\lie g_2$ as $7\times 7$ matrices. The general routines are to be found in \S\ref{sec:embed}. The specific calculations, more supporting code and \maple{} output are in \S\ref{sec:pot}. Most of this work was carried at the University of Bath and we are grateful to the \textsc{Epsrc} of Great Britain and the \textsc{Kbn} in Poland for financial support. \subsection{About this Document} This document is a literate program in the sense of \citeasnoun{Knuth:literate}. One source file combines both \maple{} code and documentation which can be typeset using \LaTeX. The documented version divides the code up in to manageable chunks each numbered and with an accompanying description of its function. This file is written in \texttt{noweb} which is available from \url{http://www.cs.virginia.edu/~nr/noweb/}. To extract the \maple{} source, either enter \begin{verbatim} noweb -t g2.nw \end{verbatim} or for more control \begin{verbatim} notangle -Rg2-gen g2.nw > g2-gen notangle -Rg2nmin-direct g2.nw > g2nmin-direct notangle -Rg2direct-sample g2.nw > g2direct-sample \end{verbatim} This will produce maple files [[g2-gen]], [[g2nmin-direct]], [[g2direct-sample]]. [[g2-gen]] contains general routines for working with a presentation of $\lie g_2$ as $7\times 7$ matrices. The other two files are specific to the problem of determining the hyperKähler potential of the next-to-minimal nilpotent orbit in~$\lie g_2^{\mathbb C}$. To get the documentation, type \begin{verbatim} noweave -delay -index g2.nw > g2.tex \end{verbatim} and then process the resulting file with either \LaTeX\ or pdf\LaTeX. @ \newpage \section{An Embedding of the Exceptional Group} \label{sec:embed} This section describes the file [[g2-gen]] which contains general routines for dealing with the exceptional Lie group~$\Lie G_2$. The code is built around an embedding of $\lie g_2$ in the orthogonal algebra~$\so(7)$. The structure of [[g2-gen]] is as follows: <>= <> <> <> <> <> <> @ Each part is described in a separate section below. @ \subsection{Top Matter} We start with a header comment identifying this file. <>= # g2-gen # Maple code for calculating in the exceptional Lie algebra G2 # via the embedding in SO(7) # by # Piotr Kobak and Andrew Swann # # This code is generated from a noweb source file g2.nw # See that for further description and comments. # RCS info from g2.nw: # $Id: g2.nw,v 1.4 2000/01/05 14:10:18 swann Exp $ @ For the calculations, we use matrix operators from the package [[linalg]]. <>= with(linalg): @ \subsection{Orthogonal Matrices} We take $\so(7,\mathbb C)$ to be the set of $(7\times 7)$ matrices $X$ preserving a non-degenerate symmetric matrix $B$, i.e., \begin{equation*} X^tB+BX = 0. \end{equation*} The standard choice for $B$ is just the identity matrix, but for us a better choice is the antidiagonal matrix \begin{equation*} B = \begin{spmatrix} &&&&&&1\\ &0&&&&1&\\ &&&&1&&\\ &&&1&&&\\ &&1&&&&\\ &1&&&&0&\\ 1&&&&&& \end{spmatrix}. \end{equation*} Let us call this matrix [[AntiDiagonal]]. <>= AntiDiagonal := matrix(7,7,0): for i to 7 do AntiDiagonal[i,8-i] := 1; od: @ %def AntiDiagonal Elements of $\so(7,\mathbb C)$ now satisfy \begin{equation} \label{eq:orthogonality} x_{i,j} = - x_{8-j,8-i}. \end{equation} In \maple{} matrices of a special form may be specified by using an index function. We set up such a function [[`index/so7`]] for elements of~$\so(7,\mathbb C)$ in~\ref{sec:so7-index}. This may be used to create elements of $\so(7,\mathbb C)$ by beginning with the output of [[so7matrix()]] and modifying entries. We also provide sparse matrices by [[so7sparse()]] which have unassigned entries equal to zero. <>= <> so7matrix := proc() array(so7,1..7,1..7) end: so7sparse := proc() array(so7,sparse,1..7,1..7) end: @ %def so7sparse so7matrix \subsection{Lie Brackets} What makes $\so(7,\mathbb C)$ into a Lie algebra is the presence of a Lie bracket~$[X,Y]$. This is given in terms of matrix multiplication by \begin{equation*} [X,Y] = XY - YX. \end{equation*} However, for some of our purposes this can be slow to compute. If we are prepared to assume that our matrices are in $\so(7,\mathbb C)$, then a saving is to be had by knowing that the result is also an element of~$\so(7,\mathbb C)$. For elements of~$\so(7,\mathbb C)$, we have \begin{equation*} X = - BX^tB, \end{equation*} since $B^2=1$. Thus $YX=B(XY)^tB$ and we may now write the Lie bracket for such matrices as \begin{equation*} [X,Y] = XY - B(XY)^tB = XY - (XY)^\dag, \end{equation*} where we define $A^\dag=-BA^t X$. This has the advantage that it only involves one matrix multiplication of $X$ and~$Y$. If $A=(a_{ij})$, then \begin{equation*} (A^\dag)_{ij} = a_{8-j,8-i}. \end{equation*} Let us provide this operation as [[so7transpose]], thinking of this as analogue of the transpose operation adapted to our bilinear form. <>= so7transpose := proc(A) local a,i,j,out; a:=evalm(A); out:=matrix(7,7); for i from 1 to 7 do for j from 1 to 7 do out[i,j] := A[8-j,8-i]; od; od; evalm(out); end: @ %def so7transpose We provide the function [[LieBracket]] which when given two arguments uses the naïve definition, but which also accepts an optional third argument giving a way to compute $YX$ from $XY$. <>= LieBracket := proc (X, Y, trans) local Z; if (nargs = 3) then Z := evalm(X &* Y); RETURN(evalm(Z - trans(Z))); elif (nargs = 2) then RETURN(evalm(X &* Y - Y &* X)); else ERROR(`Wrong number of arguments to`, procname); fi; end: @ %def LieBracket We then define the Lie bracket in $\so(7,\mathbb C)$ by <>= so7Lb := proc(X,Y) LieBracket(X,Y,so7transpose); end: @ %def so7Lb \subsection{Inner Products} The natural inner product on a matrix Lie algebra is a multiple of~$-\Tr(XY)$, minus the trace of the product of matrices. We call that multiple [[MetricNormalisation]] and treat this as a global variable. Doing a matrix multiplication here is inefficient, instead we use \begin{equation*} \operatorname{Tr}(X Y) = \sum_{i,j} x_{ij} y_{ji}. \end{equation*} We let the user optionally tell the function the sizes of the matrices involved. When this argument is provided we assume the user knows what they are doing and do not make any error checks. <>= MetricForm := proc(X,Y,nn::integer) local boundsx,boundsy,i,j,n,total; global MetricNormalisation; if (nargs = 3) then n := nn; else boundsx := [op(2,evalm(X))]; boundsy := [op(2,evalm(Y))]; n := op([1,2],boundsx); if not(n=op([2,2],boundsx)) or not(n=op([1,2],boundsy)) or not(n=op([2,2],boundsy)) then ERROR(`Arguments of`, procname, `need to be square matrices of the same size`); fi; fi; total := 0; for i to n do for j to n do total := total + X[i,j]*Y[j,i]; od; od; - MetricNormalisation * total; end: @ %def MetricForm \subsection{Real Structures} Associated to the complex Lie algebra $\so(7,\mathbb C)$ is a real Lie algebra~$\so(7)$. In fact there are many different embeddings of $\so(7)$ in~$\so(7,\mathbb C)$; the way to pick one out is to specify a real structure $\sigma$. A real structure is like a conjugation operation: it is a conjugate linear function and squares to the identity. In the presence of our bilinear form~$B$, the standard definition for~$\sigma$ is \begin{equation*} \sigma(X) = B\overline{X} B. \end{equation*} However, for elements of~$\so(7,\mathbb C)$, the right-hand side is simply $-{\overline{X}}^t$. In our computations we will sometimes only want to apply this operation to matrices $X$ whose entries are real. We therefore divide this definition into two parts. <>= RConj := proc(X) evalm(- transpose(X)); end: Conj := proc(X) map(conjugate,evalm(RConj(X))); end: @ %def RConj Conj \subsection{The Embedding} The algebra~$\lie g^{\mathbb C}_2$ is the subalgebra of~$\so(7,\mathbb C)$ which preserves a particular three-form~$\varphi$. This three-form encodes Cayley multiplication on the octonians~$\mathbb O$. In fact a generic three-form will have the property that its stabiliser is isomorphic to~$\lie g_2$. However, we need to make a choice that is compatible with the bilinear form~$B$. This compatibility is expressed by \begin{equation*} (v^tB w) \vol = 6 (v\hook \varphi)\wedge (w\hook \varphi) \wedge \varphi, \end{equation*} where $\vol$ is the standard volume form. Labelling our standard basis of the dual of $\mathbb C^7$ by $e_1,\dots,e_7$, we may take \begin{equation*} \varphi = e_1e_4e_7 + e_2e_4e_6 + e_3e_4e_5 -\sqrt2(e_1e_2e_3+e_5e_6e_7), \end{equation*} where $abc:=a\wedge b\wedge c$. Writing $g(v,w)=v^tBw$, the complexification of Cayley multiplication is given by \begin{equation*} g(v.w,u) = \varphi(v,w,u). \end{equation*} A convenient way to understand~$\lie g_2$ is via one of its subalgebras. Consider the action of $\Lie G_2$ on~$\mathbb O$. For any unit vector $v\in \mathbb O$, we have a splitting $\mathbb O=\mathbb R\oplus W$, where $\mathbb R$ is spanned by~$v$ and $W$ is the orthogonal complement. Now $v$ acts on~$W$ via Cayley multiplication and has the property that $v^2$ acts as~$-1$. Thus $W$ may be thought of as a complex vector space, necessarily of dimension~$3$. The stabiliser of~$v$ in~$\Lie G_2$ is isomorphic to~$\SU(3)$. Passing to Lie algebras and complexifying, this means that $\lie g^{\mathbb C}_2$ has a subalgebra isomorphic to~$\Sl(3,\mathbb C)$, the algebra of $(3\times 3)$-matrices~$A$ such that $\Tr A=0$. Under the action of~$\Sl(3,\mathbb C)$, we have the decomposition \begin{equation} \label{eq:g2-sl3} \lie g^{\mathbb C}_2 = \Sl(3,\mathbb C) \oplus V^{1,0} \oplus V^{0,1}, \end{equation} where $V^{1,0}$ is the usual three-dimensional representation of~$\Sl(3,\mathbb C)$ on~$\mathbb C^3$ given by matrices multiplying column vectors and $V^{0,1}$ is the dual of~$V^{0,1}$. Our embedding of~$\lie g^{\mathbb C}_2$ is based on~\eqref{eq:g2-sl3}. For elements of~$\Sl(3,\mathbb C)$ itself, this is easy: we map \begin{equation*} A \mapsto \begin{spmatrix} A & 0 & 0 \\ 0 & 0 & 0 \\ 0 & 0 & -A^t \end{spmatrix} . \end{equation*} The following routine assumes that the matrix $A$ is trace-free. <>= sl3 := proc(A) local Am,i,j,out; Am := convert(eval(A),matrix); if (not([op(2,eval(Am))]=[1..3,1..3])) then ERROR(`Argument of`, procname, `must be convertible to a 3x3 matrix`); fi; if not(trace(Am)=0) then print(`Warning: matrix passed to sl3 is not trace-free`); fi; out := so7sparse(); for i from 1 to 3 do for j from 1 to 3 do out[i,j]:= Am[i,j]; od; od; evalm(out); end: @ %def sl3 The embeddings of $V^{1,0}$ and $V^{0,1}$ are determined by the three-form~$\varphi$, once one realises that $W\otimes\mathbb C\cong V^{1,0}\oplus V^{0,1}$. Alternatively, one may use the splitting $\mathbb C^7=\mathbb C\oplus W\otimes \mathbb C$ and the fact that $\so(7,\mathbb C)\cong\Lambda^2\mathbb C^7$. This implies \begin{align*} \so(7,\mathbb C) &\cong \Lambda^2(\mathbb C\oplus V^{1,0}\oplus V^{0,1})\\ &=V^{1,0}\oplus V^{0,1} \oplus \Lambda^2 V^{1,0} \oplus \Lambda^2 V^{0,1} \oplus V^{1,0}\otimes V^{0,1}\\ &=2V^{1,0}\oplus 2V^{0,1} \oplus \Sl(3,\mathbb C) \oplus \mathbb C, \end{align*} since $\Lambda^2V^{1,0}\cong V^{0,1}$. In matrix terms this implies that the two copies of $V^{1,0}$ are \begin{equation*} \begin{spmatrix} 0&0&0&x&0&0&0\\ 0&0&0&y&0&0&0\\ 0&0&0&z&0&0&0\\ 0&0&0&0&-z&-y&-x\\ 0&0&0&0&0&0&0\\ 0&0&0&0&0&0&0\\ 0&0&0&0&0&0&0 \end{spmatrix} \quad\text{and}\quad \begin{spmatrix} 0&0&0&0&0&0&0\\ 0&0&0&0&0&0&0\\ 0&0&0&0&0&0&0\\ 0&0&0&0&0&0&0\\ a&b&0&0&0&0&0\\ c&0&-b&0&0&0&0\\ 0&-c&-a&0&0&0&0 \end{spmatrix} . \end{equation*} Examining the action of~$\Sl(3,\mathbb C)$ on these matrices, we see that $a\leftrightarrow y$, $b\leftrightarrow x$ and $c\leftrightarrow z$. It is natural to take $a,b,c$ to be essentially the same multiplies of~$y,x,z$, but the condition that $[V^{1,0},V^{1,0}]=V^{0,1}$ gives $a=-ky$, $b=kx$ and $c=kz$, for some constant~$k$. If we require $V^{0,1}$ to consist of elements related also by the same factor~$k$, then one finds $k^2=2$. Thus For $V^{1,0}$ we have \begin{equation*} \begin{spmatrix} x\\y\\z \end{spmatrix} \mapsto \begin{spmatrix} 0&0&0&x&0&0&0\\ 0&0&0&y&0&0&0\\ 0&0&0&z&0&0&0\\ 0&0&0&0&-z&-y&-x\\ y/\sqrt2&-x/\sqrt2&0&0&0&0&0\\ -z/\sqrt2&0&x/\sqrt2&0&0&0&0\\ 0&z/\sqrt2&-y/\sqrt2&0&0&0&0 \end{spmatrix} . \end{equation*} <>= V10 := proc(L::list) local i,out; if not(nops(L)=3) then ERROR(`Argument to`, procname, `must have 3 elements`); fi; out := so7sparse(); out[6,3] := L[1]/sqrt(2); out[5,1] := L[2]/sqrt(2); out[7,2] := L[3]/sqrt(2); for i from 1 to 3 do out[i,4] := L[i]; od; evalm(out); end: @ %def V10 Dually for $V^{0,1}$, the embedding is \begin{equation*} \begin{spmatrix} x\\y\\z \end{spmatrix} \mapsto \begin{spmatrix} 0&0&0&0&y/\sqrt2&-x/\sqrt2&0\\ 0&0&0&0&-z/\sqrt2&0&x/\sqrt2\\ 0&0&0&0&0&z/\sqrt2&-y/\sqrt2\\ x&y&z&0&0&0&0\\ 0&0&0&-z&0&0&0\\ 0&0&0&-y&0&0&0\\ 0&0&0&-x&0&0&0 \end{spmatrix} . \end{equation*} <>= V01 := proc(L::list) local i,out; if not(nops(L)=3) then ERROR(`Argument to`, procname, `must have 3 elements`); fi; out := so7sparse(); out[3,6] := L[1]/sqrt(2); out[1,5] := L[2]/sqrt(2); out[2,7] := L[3]/sqrt(2); for i from 1 to 3 do out[4,i] := L[i]; od; evalm(out); end: @ %def V01 \subsection{An Index Function for Orthogonal Matrices} \label{sec:so7-index} The index function [[`index/so7`]] will be used by \maple{} in two ways depending on how many arguments it is given. For two arguments, the entry is simply being evaluated, and we just need to return the value. This will be $0$ for the values on the antidiagonal. For three arguments, the entry is being assigned. <>= `index/so7` := proc(inds,A,v) <> if (nargs = 2) then <> elif (nargs = 3) then <> else ERROR(`Invalid arguments passed to`, procname); fi; end: @ %def so7 We ensure that values are only given to entries above the antidiagonal. The antidiagonal is conveniently specified by those entries $x_{ij}$ of~$X$ such that $i+j=8$ and those above the antidiagonal are given by $i+j<8$. If $x_{ij}$ lies below the antidiagonal we get/put information from the corresponding position above the antidiagonal according to~\eqref{eq:orthogonality}. We set [[t]] to be $8-i-j$, so the sign of [[t]] tells us whether we are below, on or above the antidiagonal. <>= local ind,i,j,t,swap; ind := [op(inds)]; i := ind[1]; j := ind[2]; t := i+j-8; if t>0 then swap := i; i:=8-j; j:=8-swap; fi; @ <>= if t=0 then RETURN(0); elif t<0 then RETURN(A[i,j]); else RETURN(-A[i,j]); fi; @ <>= if t=0 then if op(v)=0 then RETURN(0); else ERROR(`Elements of SO(7) cannot have`, `non-zero entries on the antidiagonal`) fi; elif t<0 then A[i,j] := op(v); else A[i,j] := -op(v); fi; @ \newpage \section{Direct Computation of a HyperKähler Potential} \label{sec:pot} The exceptional Lie algebra $\lie g_2^{\mathbb C}$ has four orbits of nilpotent elements. The smallest of these is the associated bundle of the Wolf space $\Lie G_2/\SO(4)$ and so is generally fairly well understood. The next biggest orbit~$\mathcal O_{\text{nmin}}$ is of cohomogeneity two for the action of the compact group~$\Lie G_2$, so one can hope to calculate the invariant hyperKähler potentials for this orbit directly. In \cite{Kobak-Swann:hk-c2} we showed that this came done to showing that a certain endomorphism~$J$ is an almost complex structure, i.e., that it squares to~$-1$, on the tangent space of the orbit. We divide this material up in to a support file [[g2nmin-direct]] and the actual computation [[g2direct-sample]]. \subsection{Support File [[g2nmin-direct]]} <>= <> <> <> <> @ \subsubsection{Top Matter} First we identify this file. <>= # g2nmin-direct # Maple code for a direct computation of hyperKaehler potentials # for the next-to-minimal nilpotent orbit in G2 # by # Piotr Kobak and Andrew Swann # # This code is generated from a noweb source file g2.nw # See that for further description and comments. # RCS info from g2.nw: # $Id: g2.nw,v 1.4 2000/01/05 14:10:18 swann Exp $ @ We need the file [[g2-gen]]. <>= read `g2-gen`; @ \subsubsection{Base Point} Now define our base point~$X$ in~$\mathcal O_{\text{nmin}}$. As the orbit is of cohomogeneity two, there are two real parameters [[s]] and [[t]], which we can take to be strictly positive. If either of them is zero then $X$ becomes a point of the minimal orbit instead. <>= print(`Our base point is`); X := evalm( sl3([[0,s,0],[0,0,0],[0,0,0]]) + V10([t*sqrt(2),0,0]) ); @ %def X \subsubsection{The Almost Complex Structure} A typical tangent vector to the orbit at~$X$ has the form $\xi_A=[A,X]$, where $A\in\lie g_2^{\mathbb C}$. The formula for the candidate almost complex structure~$J$ as given in our paper is \begin{equation} \label{eq:J} \begin{split} J\xi_A & = -2 \rho_1 [X,\sigma \xi_A] \\ & \quad+ 4 \rho_2 (2 [X,[\sigma X,[X,\sigma \xi_A]]] - [X,[X,[\sigma X,\sigma \xi_A]]])\\ & \quad - 2\rho_{11} \inp{\sigma \xi_A}X [X,\sigma X]\\ & \quad + 4\rho_{12} \begin{aligned}[t] \bigl( & \inp{\sigma \xi_A}{[X,[\sigma X,X]]} [X,\sigma X] \\ &+ \inp{\sigma \xi_A}X [X,[\sigma X,[X,\sigma X]]] \bigr) \end{aligned} \\ & \quad - 8 \rho_{22} \inp{\sigma \xi_A}{[X,[\sigma X,X]]} [X,[\sigma X,[X,\sigma X]]]. \end{split} \end{equation} Here $\rho$ is the hyperKähler potential, and $\rho_i$ etc. are partial derivatives with respect to two natural local coordinates $\eta_1$ and $\eta_2$ defined by the Lie algebra, see \S\ref{sec:change} below. We need to optimise this formula for~$J$ for the implementation, otherwise [[Maple]] just seems to die in the computations. The important thing to do is to assign quantities only involving~$X$ to global variables. This means that they do not have to repeatedly calculated in the routine for~$J$. The quantities involving~$\xi_A$ however depend on~$A$ and should be local variables. <>= print(`Defining J`); <> <> @ It is also possible to optimise the formula~\eqref{eq:J} in another way. The coefficient of~$\rho_2$ was rewritten during our proof, and the original form \begin{equation*} 4\bigl( [X,[\sigma \xi_A,[X,\sigma X]]] + [X,[\sigma X,[X,\sigma \xi_A]]] \bigr) \end{equation*} is better here as it involves more global variables. <>= evalm(-2*rho1*XsXiA +4*rho2*so7Lb(X, evalm(so7Lb(sXiA,XsX)+so7Lb(sX,XsXiA))) -2*(rho11*IpsXiAX - 2*rho12*IpsXiAXsXX) * XsX +4*(rho12*IpsXiAX - 2*rho22*IpsXiAXsXX) * XsXXsX ); @ The global quantities are \begin{align*} [[sX]] &:= \sigma X\\ [[XsX]]&:= [X,\sigma X]\\ [[XsXX]] &:= [X,[\sigma X,X]]\\ [[XsXXsX]] &:= [X,[\sigma X,[X,\sigma X]]] \end{align*} Note that we may assume the entries of [[X]] are real and so use [[RConj]] here. <>= sX := RConj(X): XsX := so7Lb(X,sX): XsXX := evalm(-so7Lb(X,XsX)): XsXXsX := so7Lb(X,so7Lb(sX,XsX)): @ %def sX XsX XsXX XsXXsX The quantities we can split off locally are \begin{align*} [[sXiA]] &:= \sigma\xi_A\\ [[XsXiA]] &:= [X,\sigma\xi_A]\\ [[IpsXiAX]] &:= \inp{\sigma\xi_A}{X}\\ [[IpsXiAXsXX]] &:= \inp{\sigma\xi_A}{[X,[\sigma X,X]]}. \end{align*} If [[J]] is given a second argument, of any value, then the first argument is assumed to have real entries and we can use [[RConj]] instead of [[Conj]]. <>= J := proc(XiA,r) local sXiA, XsXiA, IpsXiAX, IpsXiAXsXX; global X, sX, XsX, XsXX, XsXXsX, rho1, rho2, rho11, rho12, rho22; <> <> end: @ %def J <>= if (nargs = 1) then sXiA := Conj(XiA); else sXiA := RConj(XiA); fi; XsXiA := so7Lb(X,sXiA); IpsXiAX := MetricForm(sXiA,X,7); IpsXiAXsXX := MetricForm(sXiA,XsXX,7); @ \subsubsection{Testing for an Almost Complex Structure} We provide various routines for finding when $J^2=-1$. Each has an optional second argument which if present indicates that the first is real. Firstly, we test via a simple computation of $J^2\xi_A+\xi_A$, which one would like to vanish. <>= J2P := proc(xA,r) if (nargs = 1) then evalm(J(J(xA))+xA); else evalm(J(J(xA,1),1)+xA); fi; end: @ %def J2P Secondly, one can change variables in the derivatives to those with respect to $s$ and $t$ instead of $\eta_1$ and~$\eta_2$. It is tempting to automatically simplify the expression $J^2\xi_A+\xi_A$, but as these are $7\times7$ matrices that would be very time consuming. We let the user do that when they want to. However, mapping [[expand]] on to the entries can help alot. <>= <> J2stP := proc(xA,r) local out; global dsdt; if (nargs = 1) then out := subs(dsdt,J2P(xA)); else out := subs(dsdt,J2P(xA,1)); fi; map(expand,out); end: @ %def J2stP \subsubsection{Change of Variables} \label{sec:change} The two main invariants are $\eta_1=\inp X{\sigma X}$ and $\eta_2=\inp Y{\sigma Y}$, with $Y=[X,\sigma X]$. We need to know how these are related to the variables $s$ and~$t$ in the definition of~$X$ and be able to convert corresponding partial derivatives. <>= print(`Computing change of variables`); eta1 := simplify(MetricForm(X,RConj(X),7)); eta2 := simplify(-MetricForm(XsX,XsX,7)); @ %def eta1 eta2 Let [[rhos]] and [[rhot]] be the partial derivatives of $\rho(s,t)$ with respect to $s$ and~$t$. Similarly, write [[rho1]] and [[rho2]] for the derivatives of~$\rho(\eta_1,\eta_2)$ with respect to $\eta_1$ and~$\eta_2$. [[D1rhost]] will hold the expressions for $\rho_1$ and $\rho_2$ in terms of $\rho_s$ and~$\rho_t$. Similarly [[D2rhost]] will contain the second derivatives. These two lots of rules are collected in [[dsdt]]. <>= <> <> dsdt := D1rhost union D2rhost: @ %def dsdt We use the chain rule. First we compute abstract partial derivatives of a function of two variables [[z1]] and [[z2]] each of which is itself a function of $s$ and~$t$. We try to ensure that the answers are written purely in terms of the partial derivatives $\rho_s$, $\rho_t$, $\rho_1$ and $\rho_2$. <>= D1rho := { rhos=diff( rho(z1(s,t),z2(s,t)),s), rhot=diff( rho(z1(s,t),z2(s,t)),t)}: D1rho := subs( { D[1](rho)(z1(s,t),z2(s,t))=rho1, D[2](rho)(z1(s,t),z2(s,t))=rho2 }, D1rho ): D1rho := simplify(subs({z1(s,t)=eta1,z2(s,t)=eta2}, D1rho)): D1rhost:=simplify(solve(D1rho,{rho1,rho2})): @ %def D1rhost The computation of the second derivatives is similar. <>= D2rho := { rhoss=diff(rho(z1(s,t),z2(s,t)),s,s), rhost=diff(rho(z1(s,t),z2(s,t)),s,t), rhott=diff(rho(z1(s,t),z2(s,t)),t,t) }: D2rho := subs({ D[1](rho)(z1(s,t),z2(s,t))=rho1, D[2](rho)(z1(s,t),z2(s,t))=rho2, D[1,2](rho)(z1(s,t),z2(s,t))=rho12, D[2,1](rho)(z1(s,t),z2(s,t))=rho12, D[1,1](rho)(z1(s,t),z2(s,t))=rho11, D[2,2](rho)(z1(s,t),z2(s,t))=rho22 }, D2rho): D2rho := simplify(subs({z1(s,t)=eta1,z2(s,t)=eta2}, D2rho)): D2rho := subs(D1rhost,D2rho): D2rhost:=simplify(solve(D2rho,{rho11,rho12,rho22})): @ %def D2rhost \subsection{Sample Computation} In this section we present the actual computation of the potential for the next-to-minimal nilpotent orbit of $\lie g_2^{\mathbb C}$. We include output from the \maple{} session in \S\ref{sec:output-direct}. <>= <> <> <> <> <> @ <>= # g2direct-sample # Maple code example of a direct computation of the hyperKaehler # potential for the next-to-minimal nilpotent orbit in G2 # by # Piotr Kobak and Andrew Swann # # This code is generated from a noweb source file g2.nw # See that for further description and comments. # RCS info from g2.nw: # $Id: g2.nw,v 1.4 2000/01/05 14:10:18 swann Exp $ @ \subsubsection{Initialisation} First we read in the support macros defined above, having made sure that \maple{} is its virgin state. We put [[MetricNormalisation]] to be [[k^2]] to save space in the output. <>= restart; MetricNormalisation:=k^2; read `g2nmin-direct`; @ \subsubsection{First Main Equation} We obtain equations for $\rho$ and its partial derivatives by enforcing the condition $J^2\xi_A=-\xi_A$ for good choices of $\xi_A$. The first equation comes by considering an element in~$\Sl(3,\mathbb C)$. <>= A := matrix(3,3,0): A[2,3] := 1/s: print(A); xA := so7Lb(X,sl3(A)); @ Now compute $J^2\xi_A+\xi_A$. <>= A1 := J2stP(xA,1); @ %def A1 We see that there is only one non-zero entry above the antidiagonal. This gives us our first equation. <>= print(`First equation`); e1 := -numer(A1[1,3]); @ %def e1 \begin{verbatim} 2 4 e1 := rhos s + t rhot rhos - 4 k s \end{verbatim} \subsubsection{Second Main Equations} Our second equation is obtained in the same way as the first, but we start with a different element of~$\Sl(3,\mathbb C)$. We reuse the variables [[A]] and [[xA]]. <>= A := matrix(3,3,0): A[1,1]:=1: A[3,3]:=-1: print(A); xA := so7Lb(X,sl3(A)); @ This time $J^2\xi_A+\xi_A$ is rather more complicated. <>= A2 := J2stP(xA,1); @ %def A2 We extract three equations from the numerators of the $(1,2)$, $(1,4)$ and $(2,7)$ entries. The second of these has a common factor of $t\sqrt2$ which we take out. <>= A2e := [numer(A2[1,2]), numer(A2[1,4]/t/sqrt(2)), numer(A2[2,7])]; @ %def A2e These three equations are linear in the second derivatives $\rho_{ss}$, $\rho_{st}$ and $\rho_{tt}$. We will try to eliminate as many of these terms as we can. First we rearrange [[A2e]] so that we can get to the coefficients of these elements. <>= A2c := map(collect,A2e,{rhoss,rhost,rhott},distribute,factor); @ %def A2c Now eliminate $\rho_{ss}$. <>= A2e2 := [ coeff(A2c[2],rhoss)*A2c[1] - coeff(A2c[1],rhoss)*A2c[2], coeff(A2c[3],rhoss)*A2c[1] - coeff(A2c[1],rhoss)*A2c[3] ]; @ %def A2e2 Collect second derivatives again and then eliminate $\rho_{st}$. <>= A2c2 := map(collect,A2e2,{rhoss,rhost,rhott},distribute,factor); @ %def A2c2 <>= A2e3 := expand(coeff(A2c2[2],rhost)*A2c2[1] - coeff(A2c2[1],rhost)*A2c2[2]); @ %def A2e3 The pleasant surprise now is that there is no $\rho_{tt}$ term left. Our second main equation is [[A2e3]] tidied up. <>= print(`Second equation`); e2 := factor(A2e3); @ %def e2 \begin{verbatim} 4 2 3 2 e2 := 24 k t s (2 rhos s + t rhot) (9 t rhos - rhot s) \end{verbatim} \subsubsection{Solutions} Equation [[e2]] is so simple that we can solve it directly. We get either $\rho_t=-2s\rho_s/t$ or $\rho_t=9t\rho_s/s$. <>= print(`Solutions to e2`); sollist := [ -2*s*rhos/t, 9*t*rhos/s ]; @ %def sollist Let us first verify that these are indeed solutions to~[[e2]]. <>= print(`These two expressions should give zero`); subs(rhot=sollist[1],e2); subs(rhot=sollist[2],e2); @ Which of these now give solutions to [[e1]]? <>= print(`Substitute first solution in e1`); factor(subs(rhot=op(1,sollist),e1)); @ This gives \begin{verbatim} 2 4 -s (rhos + 4 k ) \end{verbatim} which has no real solutions. However, we have more joy with the second element of~[[sollist]]. <>= print(`Substitute second solution in e1`); s2 := simplify(subs(rhot=op(2,sollist),e1)); @ %def s2 <>= s3 := collect(numer(s2),rhos); @ %def s3 \begin{verbatim} 2 2 2 4 2 s3 := (s + 9 t ) rhos - 4 k s \end{verbatim} Thus $\rho_s=2 k^2s/\sqrt{s^2+9t^2}$ and $\rho_t=18 k^2 t/\sqrt{s^2+9t^2}$. Let us verify this. <>= print(`Solutions for rhos and rhot are`); solrhos := 2*k^2*s/sqrt(s^2+9*t^2); solrhot := 18*k^2*t/sqrt(s^2+9*t^2); @ %def solrhos solrhot <>= print(`The following three expressions should be zero`); subs(rhos=solrhos,s3); simplify(subs([rhos=solrhos,rhot=solrhot],e1)); subs([rhos=solrhos,rhot=solrhot],e2); @ Integrating the equations for $\rho_s$ and $\rho_t$ gives <>= int(solrhos,s)+fun1(t); @ \begin{verbatim} 2 2 1/2 2 2 (s + 9 t ) k + fun1(t) \end{verbatim} <>= int(solrhot,t)+fun2(s); @ \begin{verbatim} 2 2 1/2 2 2 (s + 9 t ) k + fun2(s) \end{verbatim} Equating these two expressions shows that [[fun1]] and [[fun2]] are constant. But $\rho$ is only defined up to an additive constant, so <>= solrho := int(solrhos,s); @ %def solrho \begin{verbatim} 2 2 1/2 2 solrho := 2 (s + 9 t ) k \end{verbatim} The solution in terms of $\eta_1$ and $\eta_2$ is claimed to be \begin{equation*} k\sqrt2\sqrt{\eta_1+\sqrt6\sqrt{\eta_1^2-k^2\eta_2}}. \end{equation*} We can now check that this is indeed our solution. <>= print(`The following should be zero`); radsimp(k*sqrt(2*(eta1+sqrt(6*(eta1^2-k^2*eta2))))) -solrho; @ It now remains to verify that [[solrho]] satisfies all the equations from $J^2=-1$, even those we have not used. It seems simplest to work through a basis for $\lie g_2$. First set the derivatives to be those given by the solution. <>= rhos:=diff(solrho,s); rhot:=diff(solrho,t); rhoss:=diff(rhos,s); rhost:=diff(rhos,t); rhott:=diff(rhot,t); @ Now work through a basis of $\lie g_2$, starting with $\Sl(3,\mathbb C)$ and then each of the three dimensional spaces. Don't be particularly subtle! <>= print(`All the remaining matrices should be zero`); for i from 1 to 3 do for j from 1 to 3 do A := matrix(3,3,0); A[i,j]:=1; if i=j then A[3,3]:=-A[i,i] fi; xA := so7Lb(X,sl3(A)); print(map(simplify,J2stP(xA,1))); od; od; for i from 1 to 3 do v:=[0,0,0]; v[i]:=1; xA := so7Lb(X,V10(v)); print(map(simplify,J2stP(xA,1))); xA := so7Lb(X,V01(v)); print(map(simplify,J2stP(xA,1))); od; @ \newpage \subsubsection{Maple Output} \label{sec:output-direct} \begin{footnotesize} \verbatiminput{mapleoutput-g2direct-sample} \end{footnotesize} \newpage \section*{List of Code Chunks} \addcontentsline{toc}{section}{List of Code Chunks} \begin{multicols}{2} \nowebchunks \end{multicols} \newpage \section*{Index} \addcontentsline{toc}{section}{Index} \begin{multicols}{2} \nowebindex \end{multicols} \newpage \bibliographystyle{dcu} \addcontentsline{toc}{section}{References} %\bibliography{papers} \begin{thebibliography}{xx} \harvarditem{Knuth}{1992}{Knuth:literate} Knuth, D.~E. \harvardyearleft 1992\harvardyearright . \newblock {\em Literate Programming}, CSLI Lecture Notes Number 27, Stanford University Center for the Study of Language and Information, Stanford, CA, USA. \harvarditem{Kobak \harvardand\ Swann}{1993}{Kobak-Swann:nilpotent} Kobak, P.~Z. \harvardand\ Swann, A.~F. \harvardyearleft 1993\harvardyearright . \newblock Quaternionic geometry of a nilpotent variety, {\em Math. Ann.} {\bf 297}:~747--764. \harvarditem{Kobak \harvardand\ Swann}{1998}{Kobak-Swann:hk-c2} Kobak, P.~Z. \harvardand\ Swann, A.~F. \harvardyearleft 1998\harvardyearright . \newblock Hyper{K\"a}hler potentials in cohomogeneity two, {\em preprint 98/33}, Department of Mathematical Sciences, University of Bath. \harvarditem{Kobak \harvardand\ Swann}{1999}{Kobak-Swann:Wolf} Kobak, P.~Z. \harvardand\ Swann, A.~F. \harvardyearleft 1999\harvardyearright . \newblock The hyper{K\"a}hler geometry associated to {W}olf spaces, {\em preprint 99/14}, Department of Mathematical Sciences, University of Bath. \harvarditem{Kronheimer}{1990}{Kronheimer:nilpotent} Kronheimer, P.~B. \harvardyearleft 1990\harvardyearright . \newblock Instantons and the geometry of the nilpotent variety, {\em J.~Differential Geom.} {\bf 32}:~473--490. \harvarditem{Swann}{1991}{Swann:MathAnn} Swann, A.~F. \harvardyearleft 1991\harvardyearright . \newblock Hyper{K\"a}hler and quaternionic {K\"a}hler geometry, {\em Math. Ann.} {\bf 289}:~421--450. \end{thebibliography} \nwenddocs{} \end{document} % LocalWords: antidiagonal noweave notangle noweb