# The compact symplectic group $Sp(n)$ **The compact symplectic group** $Sp(n)$ is the group of length-preserving linear transformations of $n$-dimensional quaternionic space. In one line, $$Sp(n)=\{A\in M_n(\mathbb H):A^*A=I\}.$$ This looks like the familiar definition $O(n)=\{A\in M_n(\mathbb R):A^TA=I\}$, except that the entries are quaternions and $A^*$ means **transpose and quaternionic conjugate**. Nothing in the definition is nonlinear: after replacing each quaternion by four real numbers, an element of $Sp(n)$ is an ordinary $4n\times4n$ real matrix satisfying ordinary polynomial equations. The notation has one trap. This article is about the **compact** group $Sp(n)$, sometimes written $USp(2n)$. A different group, the real symplectic group $Sp(2n,\mathbb R)$, preserves a skew-symmetric bilinear form and is noncompact. The two are related, but they are not the same group. \documentclass[border=6pt]{standalone} \usepackage{amssymb} \usepackage{tikz} \usetikzlibrary{arrows.meta,positioning} \begin{document} \begin{tikzpicture}[>=Latex,node distance=11mm and 17mm, box/.style={draw,rounded corners,align=center,inner sep=5pt}, arr/.style={->,thick}] \node[box] (r) {$O(n)$\\real matrices\\$A^TA=I$}; \node[box,right=of r] (c) {$U(n)$\\complex matrices\\$A^*A=I$}; \node[box,right=of c] (h) {$Sp(n)$\\quaternionic matrices\\$A^*A=I$}; \draw[arr] (r)--node[above,font=\scriptsize]{allow $i$}(c); \draw[arr] (c)--node[above,font=\scriptsize]{allow $j,k$}(h); \node[below=8mm of c,align=center,font=\small] {the same orthonormal-column idea over\\$\mathbb R$, $\mathbb C$, and $\mathbb H$}; \end{tikzpicture} \end{document} ## First meet the quaternions A quaternion is $$q=a+bi+cj+dk,\qquad a,b,c,d\in\mathbb R,$$ with multiplication determined by $$i^2=j^2=k^2=ijk=-1.$$ Thus $ij=k$ but $ji=-k$: multiplication is associative but not commutative. Conjugation and length are $$\bar q=a-bi-cj-dk,\qquad |q|^2=q\bar q=a^2+b^2+c^2+d^2.$$ So $mathbb H$ is just $mathbb R^4$ as a real vector space, equipped with extra multiplication. The identity $|pq|=|p||q|$ is why quaternionic matrices can have a useful notion of orthogonality. For a column $v=(q_1,\ldots,q_n)^T\in\mathbb H^n$, define $$\langle v,w\rangle_{\mathbb H}=v^*w=\sum_{r=1}^n\bar q_r w_r, \qquad \|v\|^2=\langle v,v\rangle_{\mathbb H}=\sum_r|q_r|^2.$$ The inner product is quaternion-valued. Its real part is the ordinary dot product on $mathbb R^{4n}$. Consequently $A^*A=I$ says exactly what it says for real orthogonal matrices: the columns of $A$ form an orthonormal basis, now over $mathbb H$. ## One quaternion as a real matrix Left multiplication by $q=a+bi+cj+dk$ is a real-linear map $mathbb H\to\mathbb H$. In the basis $(1,i,j,k)$ its matrix is $$L_q= \begin{pmatrix} a&-b&-c&-d\\ b&a&-d&c\\ c&d&a&-b\\ d&-c&b&a \end{pmatrix}.$$ Direct multiplication gives $L_q^TL_q=|q|^2I_4$. Therefore every unit quaternion gives a $4\times4$ orthogonal matrix. This is already the whole group $Sp(1)$: $$Sp(1)=\{q\in\mathbb H:|q|=1\}=S^3\cong SU(2).$$ There is a useful way to draw all four coordinates without pretending that $S^3$ fits in ordinary space. Write a unit quaternion as $$q=\cos\theta+\mathbf u\sin\theta,$$ where $\mathbf u=u_1i+u_2j+u_3k$ is a unit imaginary quaternion. The sphere below contains the imaginary vector $(b,c,d)=\mathbf u\sin\theta$; the circular gauge on top carries the missing angle $\theta$ and hence the real coordinate $a=\cos\theta$. Together they specify the full quaternion. The faint back half of the sphere and the dashed part of the vector indicate depth. Drag horizontally to choose $\theta$ and vertically to turn the imaginary direction. let quaternionGaugeAngle = 0.72; let quaternionAxisAzimuth = -0.65; let quaternionAxisElevation = 0.38; let quaternionGaugeDragging = false; function setup() { createCanvas(sketchWidth, sketchHeight); textFont('sans-serif'); } function projectQuaternionPoint(x, y, z) { const yaw = -0.62, pitch = 0.34; const x1 = x*cos(yaw) - z*sin(yaw); const z1 = x*sin(yaw) + z*cos(yaw); return [x1, y*cos(pitch)-z1*sin(pitch), y*sin(pitch)+z1*cos(pitch)]; } function drawQuaternionVectorArrow(x0, y0, x1, y1, colorValue) { stroke(colorValue); strokeWeight(3); line(x0,y0,x1,y1); const headingValue=atan2(y1-y0,x1-x0); noStroke(); fill(colorValue); push(); translate(x1,y1); rotate(headingValue); triangle(0,0,-10,-5,-10,5); pop(); } function draw() { background(18,21,28); const cx=200, cy=244, radiusValue=112; // soft spherical body noStroke(); for(let r=radiusValue;r>0;r-=3){ const shadeValue=map(r,0,radiusValue,47,20); fill(shadeValue,shadeValue+5,shadeValue+13); circle(cx-0.12*(radiusValue-r),cy-0.12*(radiusValue-r),2*r); } noFill(); stroke(105,125,150); strokeWeight(1.3); circle(cx,cy,2*radiusValue); stroke(70,88,108); ellipse(cx,cy,2*radiusValue,55); drawingContext.setLineDash([5,5]); arc(cx,cy,2*radiusValue,55,PI,TWO_PI); drawingContext.setLineDash([]); // q = cos(theta) + u sin(theta), with u moved by the vertical drag const s=sin(quaternionGaugeAngle), a=cos(quaternionGaugeAngle); const ux=cos(quaternionAxisElevation)*cos(quaternionAxisAzimuth); const uy=sin(quaternionAxisElevation); const uz=cos(quaternionAxisElevation)*sin(quaternionAxisAzimuth); const projected=projectQuaternionPoint(ux*s,uy*s,uz*s); const vx=cx+radiusValue*projected[0]; const vy=cy-radiusValue*projected[1]; if(projected[2]<0){ drawingContext.setLineDash([6,5]); drawQuaternionVectorArrow(cx,cy,vx,vy,'#f2bd57'); drawingContext.setLineDash([]); } else { drawQuaternionVectorArrow(cx,cy,vx,vy,'#f2bd57'); } noStroke(); fill(241,189,87); circle(vx,vy,7); // circular gauge for theta and the real coordinate a = cos(theta) const gx=200, gy=62, gr=38; noFill(); stroke(72,86,104); strokeWeight(8); circle(gx,gy,2*gr); stroke(91,203,222); strokeWeight(8); strokeCap(ROUND); arc(gx,gy,2*gr,2*gr,-HALF_PI,-HALF_PI+quaternionGaugeAngle); strokeCap(SQUARE); const needleAngle=-HALF_PI+quaternionGaugeAngle; stroke(230); strokeWeight(2); line(gx,gy,gx+27*cos(needleAngle),gy+27*sin(needleAngle)); noStroke(); fill(235); circle(gx,gy,5); textAlign(CENTER); textSize(12); fill(210); text('θ',gx,gy+4); text('a = cos θ = '+a.toFixed(2),gx,116); textAlign(LEFT); textSize(12); fill(160); text('imaginary vector (b, c, d)',16,382); fill(241,189,87); circle(177,378,6); } function mousePressed(){ if(mouseX>=0&&mouseX=0&&mouseY The sketch below shows the four real coordinate axes $1,i,j,k$ and their images under left multiplication by $q=\cos t+i\sin t$. What looks like one complex rotation is actually the same-angle rotation in two perpendicular planes: the $(1,i)$ plane and the $(j,k)$ plane. It runs automatically; drag horizontally to choose $t$ yourself. let quaternionAngle = 0; let angleDragging = false; function setup() { createCanvas(sketchWidth, sketchHeight); textFont('sans-serif'); } function drawQuaternionArrow(x0, y0, x1, y1, col, label) { stroke(col); strokeWeight(2.5); fill(col); line(x0, y0, x1, y1); const a = atan2(y1-y0, x1-x0); push(); translate(x1,y1); rotate(a); triangle(0,0,-9,-4,-9,4); pop(); noStroke(); textSize(13); text(label,x1+6,y1-5); } function drawRotationPlane(cx, cy, title, names, phase) { stroke(75); strokeWeight(1); line(cx-105,cy,cx+105,cy); line(cx,cy-88,cx,cy+88); noStroke(); fill(205); textAlign(CENTER); textSize(14); text(title,cx,cy-105); const r=72, a=quaternionAngle+phase; drawQuaternionArrow(cx,cy,cx+r*cos(a),cy-r*sin(a),'#ffb347',names[0]); drawQuaternionArrow(cx,cy,cx-r*sin(a),cy-r*cos(a),'#62c7df',names[1]); } function draw() { background(18,21,28); if (!angleDragging) quaternionAngle += 0.012; fill(230); noStroke(); textAlign(LEFT); textSize(13); text('q = cos t + i sin t t = '+(quaternionAngle%TWO_PI).toFixed(2),18,24); drawRotationPlane(160,182,'span{1, i}',['q·1','q·i'],0); drawRotationPlane(460,182,'span{j, k}',['q·j','q·k'],0); fill(155); textAlign(CENTER); text('orange and blue remain perpendicular and unit length',width/2,316); } function mousePressed(){ if(mouseX>=0&&mouseX=0&&mouseY ## From quaternionic matrices to real matrices Replace each entry $a_{rs}$ of a quaternionic matrix by its $4\times4$ block $L_{a_{rs}}$. This turns $A\in M_n(\mathbb H)$ into an ordinary real $4n\times4n$ matrix. Under this replacement, $$A^*A=I \quad\Longrightarrow\quad A_{\mathbb R}^TA_{\mathbb R}=I_{4n}.$$ Hence $Sp(n)$ is a subgroup of $O(4n)$. In fact its determinant is always $+1$, so $$Sp(n)\subset SO(4n).$$ But most rotations of $mathbb R^{4n}$ are not in $Sp(n)$. A quaternionic-linear map must also respect right multiplication by $i,j,k$. Regard these as three fixed real-linear maps $I,J,K$ on $mathbb R^{4n}$. They satisfy $$I^2=J^2=K^2=-I_{4n},\qquad IJ=K=-JI.$$ Then there is an entirely real definition: $$Sp(n)=\{A\in SO(4n):AI=IA,\ AJ=JA,\ AK=KA\}.$$ Because $K=IJ$, commuting with $I$ and $J$ already forces commuting with $K$. This characterization says: $Sp(n)$ consists of rotations that do not disturb the three linked quarter-turn structures carried by quaternionic space. In the next sketch, a point represents a vector in one quaternionic coordinate. The colored arrows represent $v$, $Iv$, $Jv$, and $Kv$ after a two-dimensional projection. Move the pointer to choose $v$. The visible lengths can change under projection, but the algebraic rules tying the four vectors together do not. function setup(){ createCanvas(sketchWidth,sketchHeight); textFont('sans-serif'); } function arr(x0,y0,x1,y1,c,s){ stroke(c); strokeWeight(3); line(x0,y0,x1,y1); const a=atan2(y1-y0,x1-x0); fill(c); noStroke(); push(); translate(x1,y1); rotate(a); triangle(0,0,-9,-4,-9,4); pop(); textSize(14); text(s,x1+5,y1-5); } function draw(){ background(19,22,29); const cx=width/2, cy=height/2+8; stroke(65); strokeWeight(1); line(25,cy,width-25,cy); line(cx,40,cx,height-25); const x=constrain(mouseX-cx,-115,115), y=constrain(mouseY-cy,-115,115); // A readable 2D shadow of four 4D vectors. Two independent planes are offset. arr(cx,cy,cx+x,cy+y,'#f1c75b','v'); arr(cx,cy,cx-y,cy+x,'#59c7df','Iv'); arr(cx,cy,cx+0.72*x-0.45*y,cy-0.45*x-0.72*y,'#ec7892','Jv'); arr(cx,cy,cx+0.45*x+0.72*y,cy+0.72*x-0.45*y,'#91d27b','Kv'); noStroke(); fill(225); textAlign(LEFT); textSize(14); text('move the pointer: one vector generates a quaternionic frame',18,24); fill(155); textSize(12); text('a 2D shadow of a 4D configuration',18,height-14); } The sketch is a projection, not a proof. The proof is matrix multiplication: $I,J,K$ are orthogonal, square to $-I$, anticommute, and send every nonzero $v$ to four mutually orthogonal real vectors $v,Iv,Jv,Kv$. Repeating this in $n$ quaternionic coordinate directions organizes $mathbb R^{4n}$ into $n$ such frames. ## A second definition inside complex matrices Every quaternion can be written uniquely as $q=z+w j$ with $z,w\in\mathbb C$. The rule $$z+w j\longmapsto \begin{pmatrix}z&w\\-\bar w&\bar z\end{pmatrix}$$ turns quaternion multiplication into ordinary complex matrix multiplication. Applying it entry by entry embeds an $n\times n$ quaternionic matrix into a $2n\times2n$ complex matrix. Let $$\Omega=\begin{pmatrix}0&I_n\\-I_n&0\end{pmatrix}.$$ Then the compact symplectic group can also be written $$Sp(n)=\{A\in U(2n):A^T\Omega A=\Omega\}=U(2n)\cap Sp(2n,\mathbb C).$$ This explains both words in “compact symplectic.” The equation $A^*A=I$ is unitary and makes the group compact; the equation $A^T\Omega A=\Omega$ preserves a complex skew form and makes it symplectic. It also explains the alternative notation $USp(2n)$. Be careful about the two transposes: $A^*$ includes complex conjugation and controls length, while $A^T$ does not and controls the skew form. \documentclass[border=6pt]{standalone} \usepackage{amssymb} \usepackage{tikz} \usetikzlibrary{arrows.meta,positioning} \begin{document} \begin{tikzpicture}[>=Latex,node distance=12mm, n/.style={draw,rounded corners,align=center,minimum width=34mm,minimum height=10mm}] \node[n] (h) {$A\in M_n(\mathbb H)$\\$A^*A=I$}; \node[n,right=20mm of h] (c) {$A\in M_{2n}(\mathbb C)$\\$A^*A=I$, $A^T\Omega A=\Omega$}; \node[n,below=of c] (r) {$A\in M_{4n}(\mathbb R)$\\$A^TA=I$, $[A,I]=[A,J]=0$}; \draw[->,thick] (h)--node[above,font=\scriptsize]{$q=z+wj$}(c); \draw[->,thick] (c)--node[right,font=\scriptsize]{split real/imaginary parts}(r); \draw[->,thick,bend right=25] (h) to node[left,font=\scriptsize]{four real coordinates}(r); \end{tikzpicture} \end{document} ## Why it is a Lie group A **Lie group** is simultaneously a group and a smooth space, with smooth multiplication and inversion. Here the entries of $A$ provide coordinates in a real Euclidean space, and $A^*A=I$ is a finite list of polynomial equations. The solution set is closed and bounded, hence compact. It is also a smooth manifold; its tangent space reveals the local shape. Take a smooth path $A(t)$ in $Sp(n)$ with $A(0)=I$ and velocity $X=A'(0)$. Differentiate $A(t)^*A(t)=I$ at $t=0$: $$X^*+X=0.$$ Thus the Lie algebra is $$\mathfrak{sp}(n)=\{X\in M_n(\mathbb H):X^*=-X\}.$$ These are the quaternionic skew-Hermitian matrices. Count real parameters: * each diagonal entry must be purely imaginary, giving $3n$ parameters; * each pair above/below the diagonal is determined by one arbitrary quaternion, giving $4\binom n2$ parameters. Therefore $$\dim Sp(n)=3n+4\binom n2=n(2n+1).$$ For comparison, $dim O(n)=n(n-1)/2$ and $dim U(n)=n^2$. The dimension is the number of independent infinitesimal motions near the identity—not the size of the matrices representing them. Exponentiating a tangent matrix produces a group element: $$X\in\mathfrak{sp}(n)\quad\Longrightarrow\quad e^X\in Sp(n).$$ Indeed $(e^X)^*=e^{X^*}=e^{-X}=(e^X)^{-1}$. This is the same matrix exponential familiar from linear differential equations. ## Building an orthonormal quaternionic basis $Sp(n)$ acts on the unit sphere $S^{4n-1}\subset\mathbb H^n$. It acts **transitively**: given unit vectors $v$ and $w$, quaternionic Gram–Schmidt extends each to an orthonormal basis, and the matrix sending one basis to the other lies in $Sp(n)$. Once the first column is chosen, the remaining columns form an element of $Sp(n-1)$ on its orthogonal complement. This gives a bundle $$Sp(n-1)\longrightarrow Sp(n)\longrightarrow S^{4n-1}$$ and the homogeneous-space identity $$S^{4n-1}\cong Sp(n)/Sp(n-1).$$ The dimension check is reassuring: $$\dim Sp(n)-\dim Sp(n-1)=4n-1=\dim S^{4n-1}.$$ The sketch visualizes the real analogue of this column-by-column construction. Drag the yellow first column; the blue column is forced to stay perpendicular. Quaternionic Gram–Schmidt uses the same projection-and-subtraction recipe, but one chosen quaternionic column accounts for four linked real directions. function setup(){ createCanvas(sketchWidth,sketchHeight); textFont('sans-serif'); } function arrow(cx,cy,x,y,c,label){ stroke(c); strokeWeight(4); line(cx,cy,x,y); const a=atan2(y-cy,x-cx); noStroke(); fill(c); push(); translate(x,y); rotate(a); triangle(0,0,-10,-5,-10,5); pop(); textSize(14); text(label,x+7,y-4); } function draw(){ background(19,22,29); const cx=205,cy=157; let x=constrain(mouseX-cx,-105,105), y=constrain(mouseY-cy,-105,105); let d=sqrt(x*x+y*y); if(d<12){x=82;y=-45;d=sqrt(x*x+y*y);} x=112*x/d; y=112*y/d; stroke(65); strokeWeight(1); noFill(); circle(cx,cy,224); arrow(cx,cy,cx+x,cy+y,'#f1c75b','first column v'); arrow(cx,cy,cx-y,cy+x,'#59c7df','forced perpendicular'); noStroke(); fill(230); textAlign(LEFT); textSize(15); text('orthonormal columns move together',18,25); fill(190); textSize(13); text('choose v on the unit circle',385,105); text('the remaining choice lives',385,137); text('in its orthogonal complement',385,158); fill('#f1c75b'); text('drag inside the sketch',385,205); } Iterating the bundle suggests—but does not by itself prove—that $Sp(n)$ is connected and simply connected. Both statements are true. Its Lie algebra belongs to the $C_n$ family, one of the four infinite classical families $A_n,B_n,C_n,D_n$. ## Small cases ### $Sp(1)$ As already seen, $$Sp(1)=S^3=\{a+bi+cj+dk:a^2+b^2+c^2+d^2=1\}\cong SU(2).$$ It double-covers $SO(3)$. A unit quaternion $q$ rotates an imaginary quaternion $x=xi+yj+zk$ by $$x\longmapsto qxq^{-1}.$$ The quaternions $q$ and $-q$ give the same rotation, which accounts for the two-to-one map. ### $Sp(2)$ $Sp(2)$ has dimension $2(5)=10$ and acts on $mathbb H^2\cong\mathbb R^8$. There is an exceptional isomorphism $$Sp(2)/\{\pm I\}\cong SO(5),$$ or, at the simply connected level, $Sp(2)\cong Spin(5)$. This is a low-dimensional coincidence, not a pattern continuing for all $n$. ## Quaternionic projective space Real projective space identifies nonzero real vectors that differ by a real scale. Complex projective space does the same with complex scales. Quaternionic projective space is $$\mathbb HP^{n-1}=(\mathbb H^n\setminus\{0\})/\mathbb H^\times.$$ After normalizing length, only unit-quaternion scalars remain, so there is a quaternionic Hopf fibration $$Sp(1)=S^3\longrightarrow S^{4n-1}\longrightarrow\mathbb HP^{n-1}.$$ The group $Sp(n)$ moves quaternionic lines transitively. The line through the first basis vector is fixed by $Sp(1)\times Sp(n-1)$, giving $$\mathbb HP^{n-1}\cong \frac{Sp(n)}{Sp(1)\times Sp(n-1)}.$$ For $n=2$, this says $\mathbb HP^1\cong S^4$. It is the quaternionic sibling of $\mathbb CP^1\cong S^2$ and connects $Sp(n)$ directly to the [[wiki:hopf-fibration|Hopf fibration]]. ## Rank, maximal torus, and roots Commutativity returns inside a useful subgroup. Choose the same complex plane $\{a+bi\}\subset\mathbb H$ in every diagonal entry. Then $$T=\left\{\operatorname{diag}(e^{i\theta_1},\ldots,e^{i\theta_n})\right\}\cong(S^1)^n$$ is a **maximal torus**, so $Sp(n)$ has rank $n$. Every element of $Sp(n)$ is conjugate to an element of this torus: after a suitable quaternionic change of orthonormal basis, its essential motion is described by $n$ angles. Relative to angle coordinates $e_1,\ldots,e_n$, the roots are $$\pm e_r\pm e_s\quad(r\ne s),\qquad \pm2e_r.$$ This is the root system $C_n$, which is why the Lie algebra is written $\mathfrak{sp}(n)$ and classified as type $C_n$. The short roots mix two quaternionic coordinate directions; the long roots act within one. Counting roots gives $2n^2$, and adding the $n$-dimensional torus recovers $$2n^2+n=n(2n+1)=\dim Sp(n).$$ ## What “preserved” means The definitions can now be read as different views of one object: ^ View of the vector space ^ Matrices ^ What is preserved ^ | $\mathbb H^n$ | $n\times n$ quaternionic | quaternionic inner product $v^*w$ | | $\mathbb C^{2n}$ | $2n\times2n$ complex | Hermitian length and $v^T\Omega w$ | | $\mathbb R^{4n}$ | $4n\times4n$ real | Euclidean length and the structures $I,J,K$ | The quaternionic row is the shortest definition. The complex row explains the word *symplectic*. The real row makes clear that the group is accessible using only real vectors and matrices: it is a specially constrained family of rotations in $4n$ dimensions. ## A practical recognition checklist Given a candidate transformation, any one of these routes is enough: - **Quaternionic form:** verify $A^*A=I$. - **Complex form:** verify both $A^*A=I$ and $A^T\Omega A=\Omega$. - **Real form:** verify $A^TA=I$ and that $A$ commutes with the fixed matrices $I$ and $J$. - **Infinitesimal form:** for a generator $X$, verify $X^*=-X$; then $e^{tX}\in Sp(n)$ for every real $t$. The mental model to keep is simple: $O(n)$ moves real orthonormal frames, $U(n)$ moves complex orthonormal frames, and $Sp(n)$ moves quaternionic orthonormal frames. Each extra number system adds structure that a transformation must respect—and creates a richer group of coordinated rotations when viewed over the real numbers.