{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# 3-sphere: vector fields and left-invariant parallelization\n", "\n", "This notebook demonstrates some differential geometry capabilities of SageMath on the example of the 3-dimensional sphere, $\\mathbb{S}^3$. The corresponding tools have been developed within the [SageManifolds](https://sagemanifolds.obspm.fr) project.\n", "\n", "Click [here](https://raw.githubusercontent.com/sagemanifolds/SageManifolds/master/Notebooks/SM_sphere_S3_vectors.ipynb) to download the notebook file (ipynb format). To run it, you must start SageMath with the Jupyter notebook, via the command `sage -n jupyter`" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "*NB:* a version of SageMath at least equal to 7.5 is required to run this notebook:" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "'SageMath version 9.0.beta1, Release Date: 2019-10-12'" ] }, "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 formatting:" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "%display latex" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We also define a viewer for 3D plots (use `'threejs'` or `'jmol'` for interactive 3D graphics):" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [], "source": [ "viewer3D = 'threejs' # must be 'threejs', jmol', 'tachyon' or None (default)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "To increase the computational speed, we ask for demanding computations to be parallelly performed on 8 cores:" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [], "source": [ "Parallelism().set(nproc=8)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## $\\mathbb{S}^3$ as a 3-dimensional differentiable manifold\n", "\n", "We start by declaring $\\mathbb{S}^3$ as a differentiable manifold of dimension 3 over $\\mathbb{R}$:" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [], "source": [ "S3 = Manifold(3, 'S^3', latex_name=r'\\mathbb{S}^3', start_index=1)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The first argument, `3`, is the dimension of the manifold, while the second argument is the symbol used to label the manifold, with the LaTeX output specified by the argument `latex_name`. The argument `start_index` sets the index range to be used on the manifold for labelling components w.r.t. a basis or a frame: `start_index=1` corresponds to $\\{1,2,3\\}$; the default value is `start_index=0`, yielding to $\\{0,1,2\\}$." ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "3-dimensional differentiable manifold S^3\n" ] } ], "source": [ "print(S3)" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "3-dimensional differentiable manifold S^3" ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "S3" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Coordinate charts on $\\mathbb{S}^3$\n", "\n", "The 3-sphere cannot be covered by a single chart. At least two charts are necessary, for instance the charts associated with the stereographic projections from two distinct points, $N$ and $S$ say,\n", "which we may call the *North pole* and the *South pole* respectively. Let us introduce the open subsets covered by these two charts: \n", "$$ U := \\mathbb{S}^3\\setminus\\{N\\} $$ \n", "$$ V := \\mathbb{S}^3\\setminus\\{S\\} $$" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Open subset U of the 3-dimensional differentiable manifold S^3\n" ] } ], "source": [ "U = S3.open_subset('U') ; print(U)" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Open subset V of the 3-dimensional differentiable manifold S^3\n" ] } ], "source": [ "V = S3.open_subset('V') ; print(V)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We declare that $\\mathbb{S}^3 = U \\cup V$:" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [], "source": [ "S3.declare_union(U, V)" ] }, { "cell_type": "markdown", "metadata": { "collapsed": true }, "source": [ "Then we introduce the stereographic chart on $U$, denoting by $(x,y,z)$ the coordinates resulting from the stereographic projection from the North pole onto the equatorial plane:" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "Chart (U, (x, y, z))" ] }, "execution_count": 11, "metadata": {}, "output_type": "execute_result" } ], "source": [ "stereoN. = U.chart()\n", "stereoN" ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "x: (-oo, +oo); y: (-oo, +oo); z: (-oo, +oo)" ] }, "execution_count": 12, "metadata": {}, "output_type": "execute_result" } ], "source": [ "stereoN.coord_range()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Similarly, we introduce on $V$ the coordinates $(x',y',z')$ corresponding to the stereographic projection from the South pole onto the equatorial plane:" ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "Chart (V, (xp, yp, zp))" ] }, "execution_count": 13, "metadata": {}, "output_type": "execute_result" } ], "source": [ "stereoS. = V.chart(\"xp:x' yp:y' zp:z'\")\n", "stereoS" ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "xp: (-oo, +oo); yp: (-oo, +oo); zp: (-oo, +oo)" ] }, "execution_count": 14, "metadata": {}, "output_type": "execute_result" } ], "source": [ "stereoS.coord_range()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We have to specify the **transition map** between the charts `stereoN` = $(U,(x,y,z))$ and `stereoS` = $(V,(x',y',z'))$; it is given by the standard inversion formulas:" ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "xp = x/(x^2 + y^2 + z^2)\n", "yp = y/(x^2 + y^2 + z^2)\n", "zp = z/(x^2 + y^2 + z^2)" ] }, "execution_count": 15, "metadata": {}, "output_type": "execute_result" } ], "source": [ "r2 = x^2+y^2+z^2\n", "stereoN_to_S = stereoN.transition_map(stereoS, \n", " (x/r2, y/r2, z/r2), \n", " intersection_name='W',\n", " restrictions1= x^2+y^2+z^2!=0, \n", " restrictions2= xp^2+yp^2+zp^2!=0)\n", "stereoN_to_S.display()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "In the above declaration, `'W'` is the name given to the open subset where the two charts overlap: $W := U\\cap V$, the condition $x^2+y^2+z^2\\not=0$ defines $W$ as a subset of $U$, and the condition $x'^2+y'^2+z'^2\\not=0$ defines $W$ as a subset of $V$.\n", "\n", "The inverse coordinate transformation is computed by means of the method `inverse()`:" ] }, { "cell_type": "code", "execution_count": 16, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "x = xp/(xp^2 + yp^2 + zp^2)\n", "y = yp/(xp^2 + yp^2 + zp^2)\n", "z = zp/(xp^2 + yp^2 + zp^2)" ] }, "execution_count": 16, "metadata": {}, "output_type": "execute_result" } ], "source": [ "stereoS_to_N = stereoN_to_S.inverse()\n", "stereoS_to_N.display()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Note that the situation is of course perfectly symmetric regarding the coordinates $(x,y,z)$ and $(x',y',z')$.\n", "\n", "At this stage, the user's atlas has four charts:" ] }, { "cell_type": "code", "execution_count": 17, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "[Chart (U, (x, y, z)),\n", " Chart (V, (xp, yp, zp)),\n", " Chart (W, (x, y, z)),\n", " Chart (W, (xp, yp, zp))]" ] }, "execution_count": 17, "metadata": {}, "output_type": "execute_result" } ], "source": [ "S3.atlas()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "For future reference, we store $W=U\\cap V$ into a Python variable:" ] }, { "cell_type": "code", "execution_count": 18, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Open subset W of the 3-dimensional differentiable manifold S^3\n" ] } ], "source": [ "W = U.intersection(V)\n", "print(W)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### The North and South poles\n", "\n", "$N$ is the point of $V$ of stereographic coordinates $(x',y',z')=(0,0,0)$:" ] }, { "cell_type": "code", "execution_count": 19, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Point N on the 3-dimensional differentiable manifold S^3\n" ] } ], "source": [ "N = V((0,0,0), chart=stereoS, name='N')\n", "print(N)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "while $S$ is the point of $U$ of stereographic coordinates $(x,y,z)=(0,0,0)$:" ] }, { "cell_type": "code", "execution_count": 20, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Point S on the 3-dimensional differentiable manifold S^3\n" ] } ], "source": [ "S = U((0,0,0), chart=stereoN, name='S')\n", "print(S)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We have of course" ] }, { "cell_type": "code", "execution_count": 21, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "True" ] }, "execution_count": 21, "metadata": {}, "output_type": "execute_result" } ], "source": [ "all([N not in U, N in V, S in U, S not in V])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Embedding of $\\mathbb{S}^3$ into $\\mathbb{R}^4$\n", "\n", "Let us first declare $\\mathbb{R}^4$ as a 4-dimensional manifold covered by a single chart (the so-called **Cartesian coordinates**):" ] }, { "cell_type": "code", "execution_count": 22, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "Chart (R^4, (T, X, Y, Z))" ] }, "execution_count": 22, "metadata": {}, "output_type": "execute_result" } ], "source": [ "R4 = Manifold(4, 'R^4', r'\\mathbb{R}^4')\n", "X4. = R4.chart()\n", "X4" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The embedding of $\\mathbb{S}^3$ into $\\mathbb{R}^4$ is then defined by the standard formulas relating the stereographic coordinates to the ambient Cartesian ones when considering a **stereographic projection** from the point $(-1,0,0,0)$ to the equatorial plane $T=0$:" ] }, { "cell_type": "code", "execution_count": 23, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "Phi: S^3 --> R^4\n", "on U: (x, y, z) |--> (T, X, Y, Z) = (-(x^2 + y^2 + z^2 - 1)/(x^2 + y^2 + z^2 + 1), 2*x/(x^2 + y^2 + z^2 + 1), 2*y/(x^2 + y^2 + z^2 + 1), 2*z/(x^2 + y^2 + z^2 + 1))\n", "on V: (xp, yp, zp) |--> (T, X, Y, Z) = ((xp^2 + yp^2 + zp^2 - 1)/(xp^2 + yp^2 + zp^2 + 1), 2*xp/(xp^2 + yp^2 + zp^2 + 1), 2*yp/(xp^2 + yp^2 + zp^2 + 1), 2*zp/(xp^2 + yp^2 + zp^2 + 1))" ] }, "execution_count": 23, "metadata": {}, "output_type": "execute_result" } ], "source": [ "rp2 = xp^2 + yp^2 + zp^2\n", "Phi = S3.diff_map(R4, {(stereoN, X4): \n", " [(1-r2)/(r2+1), 2*x/(r2+1), \n", " 2*y/(r2+1), 2*z/(r2+1)],\n", " (stereoS, X4):\n", " [(rp2-1)/(rp2+1), 2*xp/(rp2+1), \n", " 2*yp/(rp2+1), 2*zp/(rp2+1)]},\n", " name='Phi', latex_name=r'\\Phi')\n", "Phi.display()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "With this choice of stereographic projection, the \"North\" pole is actually the point of coordinates $(-1,0,0,0)$ in $\\mathbb{R}^4$:" ] }, { "cell_type": "code", "execution_count": 24, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "(-1, 0, 0, 0)" ] }, "execution_count": 24, "metadata": {}, "output_type": "execute_result" } ], "source": [ "X4(Phi(N))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "while the \"South\" pole is the point of coordinates $(1,0,0,0)$:" ] }, { "cell_type": "code", "execution_count": 25, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "(1, 0, 0, 0)" ] }, "execution_count": 25, "metadata": {}, "output_type": "execute_result" } ], "source": [ "X4(Phi(S))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Hyperspherical coordinates\n", "\n", "The hyperspherical coordinates $(\\chi, \\theta, \\phi)$ generalize the standard spherical coordinates $(\\theta, \\phi)$ on $\\mathbb{S}^2$. They are defined on the open domain $A\\subset W \\subset \\mathbb{S}^3$ that is the complement of the \"origin meridian\"; since the latter is defined by $y=0$ and $x\\geq 0$, we declare:" ] }, { "cell_type": "code", "execution_count": 26, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Open subset A of the 3-dimensional differentiable manifold S^3\n" ] } ], "source": [ "A = W.open_subset('A', coord_def={stereoN.restrict(W): (y!=0, x<0), \n", " stereoS.restrict(W): (yp!=0, xp<0)})\n", "print(A)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We then declare the chart $(A,(\\chi,\\theta,\\phi))$ by specifying the intervals spanned by the various coordinates:" ] }, { "cell_type": "code", "execution_count": 27, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "Chart (A, (ch, th, ph))" ] }, "execution_count": 27, "metadata": {}, "output_type": "execute_result" } ], "source": [ "spher. = A.chart(r'ch:(0,pi):\\chi th:(0,pi):\\theta ph:(0,2*pi):\\phi')\n", "spher" ] }, { "cell_type": "code", "execution_count": 28, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "ch: (0, pi); th: (0, pi); ph: (0, 2*pi)" ] }, "execution_count": 28, "metadata": {}, "output_type": "execute_result" } ], "source": [ "spher.coord_range()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The specification of the hyperspherical coordinates is completed by providing the transition map to the stereographic chart $(A,(x,y,z))$:" ] }, { "cell_type": "code", "execution_count": 29, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "x = cos(ph)*sin(ch)*sin(th)/(cos(ch) + 1)\n", "y = sin(ch)*sin(ph)*sin(th)/(cos(ch) + 1)\n", "z = cos(th)*sin(ch)/(cos(ch) + 1)" ] }, "execution_count": 29, "metadata": {}, "output_type": "execute_result" } ], "source": [ "den = 1 + cos(ch)\n", "spher_to_stereoN = spher.transition_map(stereoN.restrict(A), \n", " (sin(ch)*sin(th)*cos(ph)/den,\n", " sin(ch)*sin(th)*sin(ph)/den,\n", " sin(ch)*cos(th)/den))\n", "spher_to_stereoN.display()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We also provide the inverse transition map by means of the method `set_inverse`, which (by default) performs a check that the provided formulas are indeed correct:" ] }, { "cell_type": "code", "execution_count": 30, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Check of the inverse coordinate transformation:\n", " ch == 2*arctan(sqrt(-cos(ch) + 1)/sqrt(cos(ch) + 1)) **failed**\n", " th == arctan2(sqrt(-cos(ch) + 1)*sin(th)/sqrt(cos(ch) + 1), cos(th)*sin(ch)/(cos(ch) + 1)) **failed**\n", " ph == pi - arctan2(sin(ch)*sin(ph)*sin(th)/(cos(ch) + 1), -cos(ph)*sin(ch)*sin(th)/(cos(ch) + 1)) **failed**\n", " x == x *passed*\n", " y == y *passed*\n", " z == z *passed*\n", "NB: a failed report can reflect a mere lack of simplification.\n" ] } ], "source": [ "spher_to_stereoN.set_inverse(2*atan(sqrt(x^2+y^2+z^2)),\n", " atan2(sqrt(x^2+y^2), z),\n", " atan2(-y, -x) + pi)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The check is passed, modulo some lack of trigonometric simplifications in the first three lines." ] }, { "cell_type": "code", "execution_count": 31, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "ch = 2*arctan(sqrt(x^2 + y^2 + z^2))\n", "th = arctan2(sqrt(x^2 + y^2), z)\n", "ph = pi + arctan2(-y, -x)" ] }, "execution_count": 31, "metadata": {}, "output_type": "execute_result" } ], "source": [ "spher_to_stereoN.inverse().display()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The transition map $(A,(\\chi,\\theta,\\phi))\\rightarrow (A,(x',y',z'))$ is obtained by combining the transition maps $(A,(\\chi,\\theta,\\phi))\\rightarrow (A,(x,y,z))$ and $(A,(x,y,z))\\rightarrow (A,(x',y',z'))$:" ] }, { "cell_type": "code", "execution_count": 32, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "xp = (cos(ch) + 1)*cos(ph)*sin(th)/sin(ch)\n", "yp = (cos(ch) + 1)*sin(ph)*sin(th)/sin(ch)\n", "zp = (cos(ch) + 1)*cos(th)/sin(ch)" ] }, "execution_count": 32, "metadata": {}, "output_type": "execute_result" } ], "source": [ "spher_to_stereoS = stereoN_to_S.restrict(A) * spher_to_stereoN\n", "spher_to_stereoS.display()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Similarly, the transition map $(A,(x',y',z'))\\rightarrow (A,(\\chi,\\theta,\\phi))$ is obtained by combining the transition maps $(A,(x',y',z'))\\rightarrow (A,(x,y,z))$ and $(A,(x,y,z))\\rightarrow (A,(\\chi,\\theta,\\phi))$:" ] }, { "cell_type": "code", "execution_count": 33, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "ch = 2*arctan(1/sqrt(xp^2 + yp^2 + zp^2))\n", "th = arctan2(sqrt(xp^2 + yp^2)/(xp^2 + yp^2 + zp^2), zp/(xp^2 + yp^2 + zp^2))\n", "ph = pi - arctan2(yp/(xp^2 + yp^2 + zp^2), -xp/(xp^2 + yp^2 + zp^2))" ] }, "execution_count": 33, "metadata": {}, "output_type": "execute_result" } ], "source": [ "stereoS_to_spher = spher_to_stereoN.inverse() * stereoS_to_N.restrict(A)\n", "stereoS_to_spher.display()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "At this stage, the user atlas of $\\mathbb{S}^3$ is" ] }, { "cell_type": "code", "execution_count": 34, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "[Chart (U, (x, y, z)),\n", " Chart (V, (xp, yp, zp)),\n", " Chart (W, (x, y, z)),\n", " Chart (W, (xp, yp, zp)),\n", " Chart (A, (x, y, z)),\n", " Chart (A, (xp, yp, zp)),\n", " Chart (A, (ch, th, ph))]" ] }, "execution_count": 34, "metadata": {}, "output_type": "execute_result" } ], "source": [ "S3.atlas()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let us get the coordinate expression of the restriction of the embedding $\\Phi$ to $A$:" ] }, { "cell_type": "code", "execution_count": 35, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "Phi: S^3 --> R^4\n", "on A: (x, y, z) |--> (T, X, Y, Z) = (-(x^2 + y^2 + z^2 - 1)/(x^2 + y^2 + z^2 + 1), 2*x/(x^2 + y^2 + z^2 + 1), 2*y/(x^2 + y^2 + z^2 + 1), 2*z/(x^2 + y^2 + z^2 + 1))" ] }, "execution_count": 35, "metadata": {}, "output_type": "execute_result" } ], "source": [ "Phi.display(stereoN.restrict(A), X4)" ] }, { "cell_type": "code", "execution_count": 36, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "Phi: S^3 --> R^4\n", "on A: (ch, th, ph) |--> (T, X, Y, Z) = (cos(ch), cos(ph)*sin(ch)*sin(th), sin(ch)*sin(ph)*sin(th), cos(th)*sin(ch))" ] }, "execution_count": 36, "metadata": {}, "output_type": "execute_result" } ], "source": [ "Phi.display(spher, X4)" ] }, { "cell_type": "code", "execution_count": 37, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "Phi: S^3 --> R^4\n", "on U: (x, y, z) |--> (T, X, Y, Z) = (-(x^2 + y^2 + z^2 - 1)/(x^2 + y^2 + z^2 + 1), 2*x/(x^2 + y^2 + z^2 + 1), 2*y/(x^2 + y^2 + z^2 + 1), 2*z/(x^2 + y^2 + z^2 + 1))\n", "on V: (xp, yp, zp) |--> (T, X, Y, Z) = ((xp^2 + yp^2 + zp^2 - 1)/(xp^2 + yp^2 + zp^2 + 1), 2*xp/(xp^2 + yp^2 + zp^2 + 1), 2*yp/(xp^2 + yp^2 + zp^2 + 1), 2*zp/(xp^2 + yp^2 + zp^2 + 1))\n", "on A: (ch, th, ph) |--> (T, X, Y, Z) = (cos(ch), cos(ph)*sin(ch)*sin(th), sin(ch)*sin(ph)*sin(th), cos(th)*sin(ch))" ] }, "execution_count": 37, "metadata": {}, "output_type": "execute_result" } ], "source": [ "Phi.display()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Projections from $\\mathbb{R}^4$ to $\\mathbb{S}^3$\n", "\n", "We will need some projection operators from (a subset of) $\\mathbb{R}^4$ to $\\mathbb{S}^3$.\n", "\n", "First, let $\\mathbb{R}^4_N$ be $\\mathbb{R}^4$ minus the hyperplane $T=-1$:" ] }, { "cell_type": "code", "execution_count": 38, "metadata": {}, "outputs": [], "source": [ "R4N = R4.open_subset('R4N', latex_name=r'\\mathbb{R}^4_N', \n", " coord_def={X4: T!=-1})\n", "X4N = X4.restrict(R4N)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "and let us consider the following projection $\\Pi_N: \\mathbb{R}^4_N \\to U\\subset\\mathbb{S}^3$:" ] }, { "cell_type": "code", "execution_count": 39, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "P_N: R4N --> U\n", " (T, X, Y, Z) |--> (x, y, z) = (X/(T + 1), Y/(T + 1), Z/(T + 1))" ] }, "execution_count": 39, "metadata": {}, "output_type": "execute_result" } ], "source": [ "ProjN = R4N.diff_map(U, {(X4N, stereoN): \n", " [X/(1+T), Y/(1+T), Z/(1+T)]},\n", " name='P_N', latex_name=r'\\Pi_N')\n", "ProjN.display()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Similarly, let $\\mathbb{R}^4_S$ be $\\mathbb{R}^4$ minus the hyperplane $T=1$ and $\\Pi_S$ the \n", "following projection $\\mathbb{R}_S\\to V\\subset \\mathbb{S}^3$:" ] }, { "cell_type": "code", "execution_count": 40, "metadata": {}, "outputs": [], "source": [ "R4S = R4.open_subset('R4S', latex_name=r'\\mathbb{R}^4_S', \n", " coord_def={X4: T!=1})\n", "X4S = X4.restrict(R4S)" ] }, { "cell_type": "code", "execution_count": 41, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "P_S: R4S --> V\n", " (T, X, Y, Z) |--> (xp, yp, zp) = (-X/(T - 1), -Y/(T - 1), -Z/(T - 1))" ] }, "execution_count": 41, "metadata": {}, "output_type": "execute_result" } ], "source": [ "ProjS = R4S.diff_map(V, {(X4S, stereoS): \n", " [X/(1-T), Y/(1-T), Z/(1-T)]},\n", " name='P_S', latex_name=r'\\Pi_S')\n", "ProjS.display()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let us check that once applied to an embedded point of $U\\cap V\\subset \\mathbb{S}^3$, this projection reduces to the identity:" ] }, { "cell_type": "code", "execution_count": 42, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "(a^2 + 1, b, c)" ] }, "execution_count": 42, "metadata": {}, "output_type": "execute_result" } ], "source": [ "var('a b c', domain='real')\n", "p = S3((1+a^2,b,c), chart=stereoN)\n", "stereoN(p)" ] }, { "cell_type": "code", "execution_count": 43, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "True" ] }, "execution_count": 43, "metadata": {}, "output_type": "execute_result" } ], "source": [ "all([p in U, p in V])" ] }, { "cell_type": "code", "execution_count": 44, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "True" ] }, "execution_count": 44, "metadata": {}, "output_type": "execute_result" } ], "source": [ "all([ProjN(Phi(p)) == p, ProjS(Phi(p)) == p])" ] }, { "cell_type": "code", "execution_count": 45, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "True" ] }, "execution_count": 45, "metadata": {}, "output_type": "execute_result" } ], "source": [ "p = S3((1+a^2,b,c), chart=stereoS)\n", "all([ProjN(Phi(p)) == p, ProjS(Phi(p)) == p])" ] }, { "cell_type": "code", "execution_count": 46, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "(1/2*sqrt(3), 1/2*cos(b)*sin(a), 1/2*sin(a)*sin(b), 1/2*cos(a))" ] }, "execution_count": 46, "metadata": {}, "output_type": "execute_result" } ], "source": [ "q = R4((sqrt(3)/2, sin(a)*cos(b)/2, sin(a)*sin(b)/2, cos(a)/2))\n", "X4(q)" ] }, { "cell_type": "code", "execution_count": 47, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "True" ] }, "execution_count": 47, "metadata": {}, "output_type": "execute_result" } ], "source": [ "all([q in R4N, q in R4S])" ] }, { "cell_type": "code", "execution_count": 48, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "False" ] }, "execution_count": 48, "metadata": {}, "output_type": "execute_result" } ], "source": [ "all([Phi(ProjN(q)) == q, Phi(ProjS(q)) == q])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Quaternions" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We consider the (division) algebra of quaternions $\\mathbb{H}$ as $\\mathbb{R}^4$ endowed with the following (non-commutative) product:" ] }, { "cell_type": "code", "execution_count": 49, "metadata": {}, "outputs": [], "source": [ "def qprod(p,q):\n", " if p in R4 and q in R4:\n", " T1, X1, Y1, Z1 = X4(p)\n", " T2, X2, Y2, Z2 = X4(q)\n", " return R4(((T1*T2-X1*X2-Y1*Y2-Z1*Z2).simplify_full(),\n", " (T1*X2+X1*T2+Y1*Z2-Z1*Y2).simplify_full(),\n", " (T1*Y2-X1*Z2+Y1*T2+Z1*X2).simplify_full(),\n", " (T1*Z2+X1*Y2-Y1*X2+Z1*T2).simplify_full()))\n", " if p in S3 and q in S3:\n", " a = qprod(Phi(p),Phi(q))\n", " if X4(a) == (-1,0,0,0):\n", " return N\n", " return ProjN(R4N(a))\n", " raise ValueError(\"Cannot evaluate qprod of {} and {}\".format(p,q))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Note that we have extended the definition of the quaternionic product to $\\mathbb{S}^3$ via the embedding $\\Phi$. \n", "\n", "### Distinguished quaternions on $\\mathbb{S}^3$\n", "\n", "Let us introduce two special points on $\\mathbb{S}^3$: $\\mathbf{1}$ and $-\\mathbf{1}$." ] }, { "cell_type": "code", "execution_count": 50, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "(1, 0, 0, 0)" ] }, "execution_count": 50, "metadata": {}, "output_type": "execute_result" } ], "source": [ "One = S3((0,0,0), chart=stereoN, name='1', latex_name=r'\\mathbf{1}')\n", "X4(Phi(One))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "As we can see from the Cartesian coordinates of $\\Phi(\\mathbf{1})$, the point $\\mathbf{1}$ is actually nothing but the \"South\" pole used to define the stereographic chart $(V,(x',y',z'))$:" ] }, { "cell_type": "code", "execution_count": 51, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "True" ] }, "execution_count": 51, "metadata": {}, "output_type": "execute_result" } ], "source": [ "One == S" ] }, { "cell_type": "code", "execution_count": 52, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "(-1, 0, 0, 0)" ] }, "execution_count": 52, "metadata": {}, "output_type": "execute_result" } ], "source": [ "minusOne = S3((0,0,0), chart=stereoS, name='-1', latex_name=r'-\\mathbf{1}')\n", "X4(Phi(minusOne))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The point $\\mathbf{-1}$ is thus nothing but the \"North\" pole used to define the stereographic chart $(U,(x,y,z))$:" ] }, { "cell_type": "code", "execution_count": 53, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "True" ] }, "execution_count": 53, "metadata": {}, "output_type": "execute_result" } ], "source": [ "minusOne == N" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Next we introduce the points $\\mathbf{i}$, $\\mathbf{j}$ and $\\mathbf{k}$ on $\\mathbb{S}^3$:" ] }, { "cell_type": "code", "execution_count": 54, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "(0, 1, 0, 0)" ] }, "execution_count": 54, "metadata": {}, "output_type": "execute_result" } ], "source": [ "I = S3((1,0,0), chart=stereoN, name='i', latex_name=r'\\mathbf{i}')\n", "X4(Phi(I))" ] }, { "cell_type": "code", "execution_count": 55, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "(1, 0, 0)" ] }, "execution_count": 55, "metadata": {}, "output_type": "execute_result" } ], "source": [ "stereoS(I)" ] }, { "cell_type": "code", "execution_count": 56, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "(0, 0, 1, 0)" ] }, "execution_count": 56, "metadata": {}, "output_type": "execute_result" } ], "source": [ "J = S3((0,1,0), chart=stereoN, name='j', latex_name=r'\\mathbf{j}')\n", "X4(Phi(J))" ] }, { "cell_type": "code", "execution_count": 57, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "(0, 1, 0)" ] }, "execution_count": 57, "metadata": {}, "output_type": "execute_result" } ], "source": [ "stereoS(J)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Since $\\mathbf{j}$ lies in $A$, contrary to $\\mathbf{i}$, we may ask for its hyperspherical coordinates:" ] }, { "cell_type": "code", "execution_count": 58, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "(1/2*pi, 1/2*pi, 1/2*pi)" ] }, "execution_count": 58, "metadata": {}, "output_type": "execute_result" } ], "source": [ "spher(J)" ] }, { "cell_type": "code", "execution_count": 59, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "(0, 0, 0, 1)" ] }, "execution_count": 59, "metadata": {}, "output_type": "execute_result" } ], "source": [ "K = S3((0,0,1), chart=stereoN, name='k', latex_name=r'\\mathbf{k}')\n", "X4(Phi(K))" ] }, { "cell_type": "code", "execution_count": 60, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "(0, 0, 1)" ] }, "execution_count": 60, "metadata": {}, "output_type": "execute_result" } ], "source": [ "stereoS(K)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Hamilton's fundamental relations\n", "$$ \\mathbf{i} \\mathbf{j} \\mathbf{k} = \\mathbf{-1} $$\n", "$$ \\mathbf{i} \\mathbf{j} = \\mathbf{k},\\quad \\mathbf{j} \\mathbf{k} = \\mathbf{i}, \\quad \\mathbf{k} \\mathbf{i} = \\mathbf{j}$$\n", "are satisfied:" ] }, { "cell_type": "code", "execution_count": 61, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "True" ] }, "execution_count": 61, "metadata": {}, "output_type": "execute_result" } ], "source": [ "qprod(I, qprod(J,K)) == minusOne" ] }, { "cell_type": "code", "execution_count": 62, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "True" ] }, "execution_count": 62, "metadata": {}, "output_type": "execute_result" } ], "source": [ "all([qprod(I,J) == K, qprod(J,K) == I,\n", " qprod(K,I) == J])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "These relations imply $\\mathbf{i}^2 = \\mathbf{-1}$, $\\mathbf{j}^2 = \\mathbf{-1}$ and $\\mathbf{k}^2 = \\mathbf{-1}$:" ] }, { "cell_type": "code", "execution_count": 63, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "True" ] }, "execution_count": 63, "metadata": {}, "output_type": "execute_result" } ], "source": [ "all([qprod(One,One) == One, qprod(I,I) == minusOne,\n", " qprod(J,J) == minusOne, qprod(K,K) == minusOne])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let us introduce $\\mathbf{-i}$, $\\mathbf{-j}$ and $\\mathbf{-k}$, as points of $\\mathbb{S}^3$:" ] }, { "cell_type": "code", "execution_count": 64, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "(0, -1, 0, 0)" ] }, "execution_count": 64, "metadata": {}, "output_type": "execute_result" } ], "source": [ "minusI = qprod(minusOne, I)\n", "X4(Phi(minusI))" ] }, { "cell_type": "code", "execution_count": 65, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "(0, 0, -1, 0)" ] }, "execution_count": 65, "metadata": {}, "output_type": "execute_result" } ], "source": [ "minusJ = qprod(minusOne, J)\n", "X4(Phi(minusJ))" ] }, { "cell_type": "code", "execution_count": 66, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "(0, 0, 0, -1)" ] }, "execution_count": 66, "metadata": {}, "output_type": "execute_result" } ], "source": [ "minusK = qprod(minusOne, K)\n", "X4(Phi(minusK))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Quaternionic conjugation" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "In the comments below (but not in the SageMath code), we shall identify $\\mathbf{1}\\in \\mathbb{S}^3$ with $\\Phi(\\mathbf{1})\\in \\mathbb{R}^4$, $\\mathbf{i}\\in \\mathbb{S}^3$ with $\\Phi(\\mathbf{i})\\in \\mathbb{R}^4$, etc. In particular, we consider $(\\mathbf{1}, \\mathbf{i}, \\mathbf{j},\\mathbf{k})$ as a basis of the quaternion algebra $\\mathbb{H}$. \n", "\n", "The *conjugate* of a quaternion $q = T + X\\mathbf{i} + Y\\mathbf{j} + Z\\mathbf{k}$ is $\\bar{q} = T - X\\mathbf{i} - Y\\mathbf{j} - Z\\mathbf{k}$; hence we define:\n" ] }, { "cell_type": "code", "execution_count": 67, "metadata": {}, "outputs": [], "source": [ "def qconj(p):\n", " if p in R4:\n", " T, X, Y, Z = X4(p)\n", " return R4((T, -X, -Y, -Z))\n", " if p in S3:\n", " a = qconj(Phi(p))\n", " if X4(a) == (-1,0,0,0):\n", " return N\n", " return ProjN(a)\n", " raise ValueError(\"Cannot evaluate qconf of {}\".format(p)) " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "In particular, we have $\\bar{\\mathbf{1}} = \\mathbf{1}$, $\\bar{\\mathbf{i}} = -\\mathbf{i}$, $\\bar{\\mathbf{j}} = -\\mathbf{j}$ and $\\bar{\\mathbf{k}} = -\\mathbf{k}$:" ] }, { "cell_type": "code", "execution_count": 68, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "True" ] }, "execution_count": 68, "metadata": {}, "output_type": "execute_result" } ], "source": [ "all([qconj(One) == One, \n", " qconj(I) == minusI,\n", " qconj(J) == minusJ, \n", " qconj(K) == minusK])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The conjugate of an element of $\\mathbb{S}^3$" ] }, { "cell_type": "code", "execution_count": 69, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "(-a, -b, -c)" ] }, "execution_count": 69, "metadata": {}, "output_type": "execute_result" } ], "source": [ "assume(a != 0) # to ensure that qconj(p) is not N\n", "p = S3((a,b,c), chart=stereoN)\n", "stereoN(qconj(p))" ] }, { "cell_type": "code", "execution_count": 70, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "(-a, -b, -c)" ] }, "execution_count": 70, "metadata": {}, "output_type": "execute_result" } ], "source": [ "p = S3((a,b,c), chart=stereoS)\n", "stereoS(qconj(p))" ] }, { "cell_type": "code", "execution_count": 71, "metadata": {}, "outputs": [], "source": [ "forget(a!=0)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Norm of a quaternion\n", "\n", "The quaternionic norm $\\| q\\| = \\sqrt{q\\bar{q}}$ coincide with the Euclidean norm in $\\mathbb{R}^4$, so that $\\mathbb{S}^3$ can be viewed as the set of unit quaternions; hence we define:" ] }, { "cell_type": "code", "execution_count": 72, "metadata": {}, "outputs": [], "source": [ "def qnorm(p):\n", " if p in R4:\n", " T, X, Y, Z = X4(p)\n", " return (sqrt(T^2 + X^2 + Y^2 + Z^2)).simplify_full()\n", " if p in S3:\n", " return 1\n", " raise ValueError(\"Cannot evaluate qnorm of {}\".format(p)) " ] }, { "cell_type": "code", "execution_count": 73, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "sqrt(a^2 + b^2 + c^2 + d^2)" ] }, "execution_count": 73, "metadata": {}, "output_type": "execute_result" } ], "source": [ "var('d', domain='real')\n", "q = R4((a,b,c,d))\n", "qnorm(q)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let us check that $\\| q\\|^2 = q\\bar{q}$:" ] }, { "cell_type": "code", "execution_count": 74, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "True" ] }, "execution_count": 74, "metadata": {}, "output_type": "execute_result" } ], "source": [ "R4((qnorm(q)^2,0,0,0)) == qprod(q, qconj(q))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "As elements of $\\mathbb{S}^3$, $\\mathbf{1}$, $\\mathbf{i}$, $\\mathbf{j}$ and $\\mathbf{k}$ have all unit norm:" ] }, { "cell_type": "code", "execution_count": 75, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "True" ] }, "execution_count": 75, "metadata": {}, "output_type": "execute_result" } ], "source": [ "(qnorm(One), qnorm(I), qnorm(J), qnorm(K)) == (1, 1, 1, 1)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Lie group structure" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Right translation by $\\mathbf{i}$\n", "\n", "The right translation by $\\mathbf{i}$ is the map $\\bar{R}_{\\mathbf{i}}: p \\mapsto p \\mathbf{i}$. We define it first at the level of $\\mathbb{R}^4$:" ] }, { "cell_type": "code", "execution_count": 76, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "R^4 --> R^4\n", " (T, X, Y, Z) |--> (-X, T, Z, -Y)" ] }, "execution_count": 76, "metadata": {}, "output_type": "execute_result" } ], "source": [ "p = R4((T,X,Y,Z))\n", "RI_R4 = R4.diff_map(R4, X4(qprod(p, Phi(I))))\n", "RI_R4.display()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Focusing on its action on $\\mathbb{S}^3$, we consider then the map ${\\bar R}_{\\mathbf{i}}\\circ\\Phi$:" ] }, { "cell_type": "code", "execution_count": 77, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "S^3 --> R^4\n", "on U: (x, y, z) |--> (T, X, Y, Z) = (-2*x/(x^2 + y^2 + z^2 + 1), -(x^2 + y^2 + z^2 - 1)/(x^2 + y^2 + z^2 + 1), 2*z/(x^2 + y^2 + z^2 + 1), -2*y/(x^2 + y^2 + z^2 + 1))\n", "on V: (xp, yp, zp) |--> (T, X, Y, Z) = (-2*xp/(xp^2 + yp^2 + zp^2 + 1), (xp^2 + yp^2 + zp^2 - 1)/(xp^2 + yp^2 + zp^2 + 1), 2*zp/(xp^2 + yp^2 + zp^2 + 1), -2*yp/(xp^2 + yp^2 + zp^2 + 1))\n", "on A: (ch, th, ph) |--> (T, X, Y, Z) = (-cos(ph)*sin(ch)*sin(th), cos(ch), cos(th)*sin(ch), -sin(ch)*sin(ph)*sin(th))" ] }, "execution_count": 77, "metadata": {}, "output_type": "execute_result" } ], "source": [ "RI_S3_R4 = RI_R4 * Phi\n", "RI_S3_R4.display()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let $U_{\\mathbf{i}} := U \\setminus \\{\\mathbf{i}\\}$; since the coordinates of $\\mathbf{i}$ in the chart $(U,(x,y,z))$ are $(1,0,0)$, we declare $U_{\\mathbf{i}}$ as" ] }, { "cell_type": "code", "execution_count": 78, "metadata": {}, "outputs": [], "source": [ "UI = U.open_subset('U_I', latex_name=r'U_{\\mathbf{i}}',\n", " coord_def={stereoN: (x!=1, y!=0, z!=0)})" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "If we restrict $R_{\\mathbf{i}}\\circ\\Phi$ to $U_{\\mathbf{i}}$ the codomain can be taken to be $\\mathbb{R}^4_N$ since $\\mathbf{i}$ is the only point of $\\mathbb{S}^3$ for which $T(R_{\\mathbf{i}}(p)) = -1$. Hence we may apply the operator $\\Pi_N$ to define the right translation by $\\mathbf{i}$ as a map $U_{\\mathbf{i}}\\to U$:" ] }, { "cell_type": "code", "execution_count": 79, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "U_I --> U\n", " (x, y, z) |--> (x, y, z) = (-(x^2 + y^2 + z^2 - 1)/(x^2 + y^2 + z^2 - 2*x + 1), 2*z/(x^2 + y^2 + z^2 - 2*x + 1), -2*y/(x^2 + y^2 + z^2 - 2*x + 1))" ] }, "execution_count": 79, "metadata": {}, "output_type": "execute_result" } ], "source": [ "RI_UI = ProjN * RI_S3_R4.restrict(UI, subcodomain=R4N)\n", "RI_UI.display()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Similarly, if we restrict $R_{\\mathbf{i}}\\circ\\Phi$ to $V_{-\\mathbf{i}} := V \\setminus\\{-\\mathbf{i}\\}$, we get a map $V_{-\\mathbf{i}} \\to \\mathbb{R}^4_{S}$, so that composing by $\\Pi_S$, the right translation by $\\mathbf{i}$ becomes a map $V_{-\\mathbf{i}}\\to V$:" ] }, { "cell_type": "code", "execution_count": 80, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "V_mI --> V\n", " (xp, yp, zp) |--> (xp, yp, zp) = ((xp^2 + yp^2 + zp^2 - 1)/(xp^2 + yp^2 + zp^2 + 2*xp + 1), 2*zp/(xp^2 + yp^2 + zp^2 + 2*xp + 1), -2*yp/(xp^2 + yp^2 + zp^2 + 2*xp + 1))" ] }, "execution_count": 80, "metadata": {}, "output_type": "execute_result" } ], "source": [ "VmI = V.open_subset('V_mI', latex_name=r'V_{-\\mathbf{i}}',\n", " coord_def={stereoS: (xp!=-1, yp!=0, zp!=0)})\n", "RI_VmI = ProjS * RI_S3_R4.restrict(VmI, subcodomain=R4S)\n", "RI_VmI.display()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We note that $\\mathbb{S}^3 = U_{\\mathbf{i}} \\cup V_{-\\mathbf{i}}$:" ] }, { "cell_type": "code", "execution_count": 81, "metadata": {}, "outputs": [], "source": [ "S3.declare_union(UI, VmI)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Consequently, we can define the right translation by $\\mathbf{i}$ as a map \n", "$R_{\\mathbf{i}}: \\mathbb{S}^3\\to \\mathbb{S}^3$ by providing the coordinate expressions obtained above on $U_{\\mathbf{i}}$ and $V_{-\\mathbf{i}}$: " ] }, { "cell_type": "code", "execution_count": 82, "metadata": {}, "outputs": [], "source": [ "RI = S3.diff_map(S3, name='R_I', latex_name=r'{R_{\\mathbf{i}}}')\n", "RI.add_expression(stereoN.restrict(UI), stereoN, \n", " RI_UI.expr(stereoN.restrict(UI), stereoN))\n", "RI.add_expression(stereoS.restrict(VmI), stereoS, \n", " RI_VmI.expr(stereoS.restrict(VmI), stereoS))" ] }, { "cell_type": "code", "execution_count": 83, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "R_I: S^3 --> S^3\n", "on U_I: (x, y, z) |--> (x, y, z) = (-(x^2 + y^2 + z^2 - 1)/(x^2 + y^2 + z^2 - 2*x + 1), 2*z/(x^2 + y^2 + z^2 - 2*x + 1), -2*y/(x^2 + y^2 + z^2 - 2*x + 1))" ] }, "execution_count": 83, "metadata": {}, "output_type": "execute_result" } ], "source": [ "RI.display(stereoN.restrict(UI), stereoN)" ] }, { "cell_type": "code", "execution_count": 84, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "R_I: S^3 --> S^3\n", "on V_mI: (xp, yp, zp) |--> (xp, yp, zp) = ((xp^2 + yp^2 + zp^2 - 1)/(xp^2 + yp^2 + zp^2 + 2*xp + 1), 2*zp/(xp^2 + yp^2 + zp^2 + 2*xp + 1), -2*yp/(xp^2 + yp^2 + zp^2 + 2*xp + 1))" ] }, "execution_count": 84, "metadata": {}, "output_type": "execute_result" } ], "source": [ "RI.display(stereoS.restrict(VmI), stereoS)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let us check the formulas $R_{\\mathbf{i}}(\\mathbf{1})=\\mathbf{i}$, $R_{\\mathbf{i}}(-\\mathbf{1})=-\\mathbf{i}$, $R_{\\mathbf{i}}(\\mathbf{i})=-\\mathbf{1}$, $R_{\\mathbf{i}}(-\\mathbf{i})=\\mathbf{1}$, $R_{\\mathbf{i}}(\\mathbf{j})=-\\mathbf{k}$, $R_{\\mathbf{i}}(-\\mathbf{j})=\\mathbf{k}$, $R_{\\mathbf{i}}(\\mathbf{k})=\\mathbf{j}$ and $R_{\\mathbf{i}}(-\\mathbf{k})=-\\mathbf{j}$:" ] }, { "cell_type": "code", "execution_count": 85, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "True" ] }, "execution_count": 85, "metadata": {}, "output_type": "execute_result" } ], "source": [ "all([RI(One)==I, RI(minusOne)==minusI, \n", " RI(I)==minusOne, RI(minusI)==One,\n", " RI(J)==minusK, RI(minusJ)==K,\n", " RI(K)==J, RI(minusK)==minusJ])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Left-invariant vector field induced by the right translation by $\\mathbf{i}$\n", "\n", "Let us recall the expression of the right translation by $\\mathbf{i}$ on $\\mathbb{R}^4$:" ] }, { "cell_type": "code", "execution_count": 86, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "R^4 --> R^4\n", " (T, X, Y, Z) |--> (-X, T, Z, -Y)" ] }, "execution_count": 86, "metadata": {}, "output_type": "execute_result" } ], "source": [ "RI_R4.display()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We turn it into a vector field $E_{\\mathbf{i}}$ on $\\mathbb{R}^4$ by identifying $T_p\\mathbb{R}^4$ and $\\mathbb{R}^4$ at each point $p\\in\\mathbb{R}^4$:" ] }, { "cell_type": "code", "execution_count": 87, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "E_I = -X d/dT + T d/dX + Z d/dY - Y d/dZ" ] }, "execution_count": 87, "metadata": {}, "output_type": "execute_result" } ], "source": [ "EI = R4.vector_field(name='E_I', latex_name=r'E_{\\mathbf{i}}')\n", "EI[:] = RI_R4.expression()\n", "EI.display()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The \"radial\" vector field on $\\mathbb{R}^4$ is" ] }, { "cell_type": "code", "execution_count": 88, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "r = T d/dT + X d/dX + Y d/dY + Z d/dZ" ] }, "execution_count": 88, "metadata": {}, "output_type": "execute_result" } ], "source": [ "r = R4.vector_field(T, X ,Y, Z, name='r')\n", "r.display()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "It is clear that $r\\cdot E_{\\mathbf{i}}=0$, where $\\cdot$ denotes the standard Euclidean scalar product in $\\mathbb{R}^4$. We can check this property explicitely by introducing the Euclidean metric:" ] }, { "cell_type": "code", "execution_count": 89, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "h = dT*dT + dX*dX + dY*dY + dZ*dZ" ] }, "execution_count": 89, "metadata": {}, "output_type": "execute_result" } ], "source": [ "h = R4.metric('h')\n", "h[0,0], h[1,1], h[2,2], h[3, 3] = 1, 1, 1, 1\n", "h.display()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "so that $r\\cdot E_{\\mathbf{i}} = h(r, E_{\\mathbf{i}})$:" ] }, { "cell_type": "code", "execution_count": 90, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "True" ] }, "execution_count": 90, "metadata": {}, "output_type": "execute_result" } ], "source": [ "h(r, EI) == 0" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "This proves that the vector field $E_{\\mathbf{i}}$ is tangent to $\\mathbb{S}^3$, or more precisely to the embedded submanifold $\\Phi(\\mathbb{S}^3)$. Consequently, there exists a vector field $\\varepsilon_{\\mathbf{i}}$ on $\\mathbb{S}^3$, the pushforward of which by $\\Phi$ is \n", "$E_{\\mathbf{i}}$:\n", "$$\n", " E_{\\mathbf{i}} = \\Phi^* \\varepsilon_{\\mathbf{i}}\n", "$$\n", "Let us determine the components of $\\varepsilon_{\\mathbf{i}}$ in the vector frame \n", "$\\left(\\frac{\\partial}{\\partial x}, \\frac{\\partial}{\\partial y}, \\frac{\\partial}{\\partial z}\\right)$ associated with the stereographic coordinates on $U$:" ] }, { "cell_type": "code", "execution_count": 91, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "Coordinate frame (U, (d/dx,d/dy,d/dz))" ] }, "execution_count": 91, "metadata": {}, "output_type": "execute_result" } ], "source": [ "frameN = stereoN.frame()\n", "frameN" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The pushforwards by $\\Phi$ of the stereographic frame vectors are:" ] }, { "cell_type": "code", "execution_count": 92, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "[Vector field Phi^*(d/dx) along the Open subset U of the 3-dimensional differentiable manifold S^3 with values on the 4-dimensional differentiable manifold R^4,\n", " Vector field Phi^*(d/dy) along the Open subset U of the 3-dimensional differentiable manifold S^3 with values on the 4-dimensional differentiable manifold R^4,\n", " Vector field Phi^*(d/dz) along the Open subset U of the 3-dimensional differentiable manifold S^3 with values on the 4-dimensional differentiable manifold R^4]" ] }, "execution_count": 92, "metadata": {}, "output_type": "execute_result" } ], "source": [ "frameN_R4 = [Phi.pushforward(frameN[i]) for i in S3.irange()]\n", "frameN_R4" ] }, { "cell_type": "code", "execution_count": 93, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Vector field Phi^*(d/dx) along the Open subset U of the 3-dimensional differentiable manifold S^3 with values on the 4-dimensional differentiable manifold R^4\n" ] } ], "source": [ "print(frameN_R4[0])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The expressions of $\\Phi^* \\frac{\\partial}{\\partial x}$, $\\Phi^* \\frac{\\partial}{\\partial y}$\n", "and $\\Phi^* \\frac{\\partial}{\\partial z}$ in terms of the canonical vector frame $\\left(\\frac{\\partial}{\\partial T}, \\frac{\\partial}{\\partial X},\\frac{\\partial}{\\partial Y},\\frac{\\partial}{\\partial Z}\\right)$ of $\\mathbb{R}^4$ are" ] }, { "cell_type": "code", "execution_count": 94, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "Phi^*(d/dx) = -4*x/(x^4 + y^4 + z^4 + 2*(x^2 + 1)*y^2 + 2*(x^2 + y^2 + 1)*z^2 + 2*x^2 + 1) d/dT - 2*(x^2 - y^2 - z^2 - 1)/(x^4 + y^4 + z^4 + 2*(x^2 + 1)*y^2 + 2*(x^2 + y^2 + 1)*z^2 + 2*x^2 + 1) d/dX - 4*x*y/(x^4 + y^4 + z^4 + 2*(x^2 + 1)*y^2 + 2*(x^2 + y^2 + 1)*z^2 + 2*x^2 + 1) d/dY - 4*x*z/(x^4 + y^4 + z^4 + 2*(x^2 + 1)*y^2 + 2*(x^2 + y^2 + 1)*z^2 + 2*x^2 + 1) d/dZ" ] }, "execution_count": 94, "metadata": {}, "output_type": "execute_result" } ], "source": [ "frameN_R4[0].display()" ] }, { "cell_type": "code", "execution_count": 95, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "Phi^*(d/dy) = -4*y/(x^4 + y^4 + z^4 + 2*(x^2 + 1)*y^2 + 2*(x^2 + y^2 + 1)*z^2 + 2*x^2 + 1) d/dT - 4*x*y/(x^4 + y^4 + z^4 + 2*(x^2 + 1)*y^2 + 2*(x^2 + y^2 + 1)*z^2 + 2*x^2 + 1) d/dX + 2*(x^2 - y^2 + z^2 + 1)/(x^4 + y^4 + z^4 + 2*(x^2 + 1)*y^2 + 2*(x^2 + y^2 + 1)*z^2 + 2*x^2 + 1) d/dY - 4*y*z/(x^4 + y^4 + z^4 + 2*(x^2 + 1)*y^2 + 2*(x^2 + y^2 + 1)*z^2 + 2*x^2 + 1) d/dZ" ] }, "execution_count": 95, "metadata": {}, "output_type": "execute_result" } ], "source": [ "frameN_R4[1].display()" ] }, { "cell_type": "code", "execution_count": 96, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "Phi^*(d/dz) = -4*z/(x^4 + y^4 + z^4 + 2*(x^2 + 1)*y^2 + 2*(x^2 + y^2 + 1)*z^2 + 2*x^2 + 1) d/dT - 4*x*z/(x^4 + y^4 + z^4 + 2*(x^2 + 1)*y^2 + 2*(x^2 + y^2 + 1)*z^2 + 2*x^2 + 1) d/dX - 4*y*z/(x^4 + y^4 + z^4 + 2*(x^2 + 1)*y^2 + 2*(x^2 + y^2 + 1)*z^2 + 2*x^2 + 1) d/dY + 2*(x^2 + y^2 - z^2 + 1)/(x^4 + y^4 + z^4 + 2*(x^2 + 1)*y^2 + 2*(x^2 + y^2 + 1)*z^2 + 2*x^2 + 1) d/dZ" ] }, "execution_count": 96, "metadata": {}, "output_type": "execute_result" } ], "source": [ "frameN_R4[2].display()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let us denote by $(a,b,c)$ the components of $\\left. \\varepsilon_{\\mathbf{i}} \\right|_{U}$ in the stereographic frame:\n", "$$ \\left. \\varepsilon_{\\mathbf{i}} \\right|_{U} = a \\frac{\\partial}{\\partial x}\n", " + b \\frac{\\partial}{\\partial y}\n", " + c \\frac{\\partial}{\\partial z} $$\n", "Since $\\Phi^*\\varepsilon_{\\mathbf{i}}=\\left. E_{\\mathbf{i}} \\right| _{\\Phi(\\mathbb{S}^3)}$, \n", "we get the linear system\n", "$$ a\\, \\Phi^* \\frac{\\partial}{\\partial x} + b \\, \\Phi^* \\frac{\\partial}{\\partial y} \n", " + c\\, \\Phi^* \\frac{\\partial}{\\partial z} =\n", " \\left. E_{\\mathbf{i}} \\right| _{\\Phi(U)} $$\n", "to be solved in $(a,b,c)$. The right-hand side is" ] }, { "cell_type": "code", "execution_count": 97, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "[-2*x/(x^2 + y^2 + z^2 + 1),\n", " -(x^2 + y^2 + z^2 - 1)/(x^2 + y^2 + z^2 + 1),\n", " 2*z/(x^2 + y^2 + z^2 + 1),\n", " -2*y/(x^2 + y^2 + z^2 + 1)]" ] }, "execution_count": 97, "metadata": {}, "output_type": "execute_result" } ], "source": [ "p = U((x,y,z), chart=stereoN, name='p')\n", "EIp = EI.at(Phi(p))\n", "EIp[:]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Hence the system:" ] }, { "cell_type": "code", "execution_count": 98, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "[-4*(a*x + b*y + c*z)/(x^4 + y^4 + z^4 + 2*(x^2 + 1)*y^2 + 2*(x^2 + y^2 + 1)*z^2 + 2*x^2 + 1) == -2*x/(x^2 + y^2 + z^2 + 1),\n", " -2*(a*x^2 + 2*b*x*y - a*y^2 + 2*c*x*z - a*z^2 - a)/(x^4 + y^4 + z^4 + 2*(x^2 + 1)*y^2 + 2*(x^2 + y^2 + 1)*z^2 + 2*x^2 + 1) == -(x^2 + y^2 + z^2 - 1)/(x^2 + y^2 + z^2 + 1),\n", " 2*(b*x^2 - 2*a*x*y - b*y^2 - 2*c*y*z + b*z^2 + b)/(x^4 + y^4 + z^4 + 2*(x^2 + 1)*y^2 + 2*(x^2 + y^2 + 1)*z^2 + 2*x^2 + 1) == 2*z/(x^2 + y^2 + z^2 + 1),\n", " 2*(c*x^2 + c*y^2 - c*z^2 - 2*(a*x + b*y)*z + c)/(x^4 + y^4 + z^4 + 2*(x^2 + 1)*y^2 + 2*(x^2 + y^2 + 1)*z^2 + 2*x^2 + 1) == -2*y/(x^2 + y^2 + z^2 + 1)]" ] }, "execution_count": 98, "metadata": {}, "output_type": "execute_result" } ], "source": [ "eqs = [(a*frameN_R4[0][i] + b*frameN_R4[1][i] + c*frameN_R4[2][i]).expr() == EIp[i]\n", " for i in R4.irange()]\n", "eqs" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The unique solution is" ] }, { "cell_type": "code", "execution_count": 99, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "[{a: 1/2*x^2 - 1/2*y^2 - 1/2*z^2 + 1/2, b: x*y + z, c: x*z - y}]" ] }, "execution_count": 99, "metadata": {}, "output_type": "execute_result" } ], "source": [ "sol = solve(eqs, (a,b,c), solution_dict=True)\n", "sol" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The expression of $\\varepsilon_{\\mathbf{i}}$ in terms of the frame associated with the stereographic coordinates on $U$ is thus" ] }, { "cell_type": "code", "execution_count": 100, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "(1/2*x^2 - 1/2*y^2 - 1/2*z^2 + 1/2) d/dx + (x*y + z) d/dy + (x*z - y) d/dz" ] }, "execution_count": 100, "metadata": {}, "output_type": "execute_result" } ], "source": [ "epsI = sol[0][a] * frameN[1] + sol[0][b] * frameN[2] + sol[0][c] * frameN[3]\n", "epsI.display()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Global vector frame on $\\mathbb{S}^3$" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The vector field $E_{\\mathbf{i}}$ never vanishes on $\\Phi(\\mathbb{S}^3)$, since it vanishes only at $(T,X,Y,Z)=(0,0,0,0)$. It follows that $\\varepsilon_{\\mathbf{i}}$ never vanishes on $\\mathbb{S}^3$. \n", "Similarly, starting from the right translation by $\\mathbf{j}$ and the right translation by $\\mathbf{k}$, we can construct global vector fields $\\varepsilon_{\\mathbf{j}}$ and $\\varepsilon_{\\mathbf{k}}$ that are always nonzero on $\\mathbb{S}^3$. \n", "Moreover, the vector fields\n", "$\\varepsilon_{\\mathbf{i}}$, $\\varepsilon_{\\mathbf{j}}$ and $\\varepsilon_{\\mathbf{k}}$ are linearly independent at any point of $\\mathbb{S}^3$. They thus form a global vector frame of $\\mathbb{S}^3$. This means that, as any Lie group, $\\mathbb{S}^3$ is a **parallelizable manifold**. This contrasts with $\\mathbb{S}^2$. Actually the only parallelizable spheres are $\\mathbb{S}^1$, $\\mathbb{S}^3$ and $\\mathbb{S}^7$.\n", "\n", "Let us declare the global vector frame $(\\varepsilon_{\\mathbf{i}}, \\varepsilon_{\\mathbf{j}}, \\varepsilon_{\\mathbf{k}})$, using the notations $\\varepsilon_1 := \\varepsilon_{\\mathbf{i}}$, $\\varepsilon_2 := \\varepsilon_{\\mathbf{j}}$ and $\\varepsilon_3 := \\varepsilon_{\\mathbf{k}}$:" ] }, { "cell_type": "code", "execution_count": 101, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "Vector frame (S^3, (E_1,E_2,E_3))" ] }, "execution_count": 101, "metadata": {}, "output_type": "execute_result" } ], "source": [ "E = S3.vector_frame('E', latex_symbol=r'\\varepsilon')\n", "E" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Stereographic components of the vector field $\\varepsilon_1$" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "On $U$, we can set the components of $\\varepsilon_1$ in the stereographic frame $\\left(\\frac{\\partial}{\\partial x}, \\frac{\\partial}{\\partial y}, \\frac{\\partial}{\\partial z}\\right)$ to those obtained above:" ] }, { "cell_type": "code", "execution_count": 102, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "E_1 = (1/2*x^2 - 1/2*y^2 - 1/2*z^2 + 1/2) d/dx + (x*y + z) d/dy + (x*z - y) d/dz" ] }, "execution_count": 102, "metadata": {}, "output_type": "execute_result" } ], "source": [ "E[1].restrict(U)[stereoN.frame(),:,stereoN] = (sol[0][a], sol[0][b], sol[0][c])\n", "E[1].display(stereoN.frame())" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let us check that the pushforward of $\\varepsilon_1$ by $\\Phi$ coincides with $E_{\\mathbf{i}}$:" ] }, { "cell_type": "code", "execution_count": 103, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "Phi^*(E_1) = -2*x/(x^2 + y^2 + z^2 + 1) d/dT - (x^2 + y^2 + z^2 - 1)/(x^2 + y^2 + z^2 + 1) d/dX + 2*z/(x^2 + y^2 + z^2 + 1) d/dY - 2*y/(x^2 + y^2 + z^2 + 1) d/dZ" ] }, "execution_count": 103, "metadata": {}, "output_type": "execute_result" } ], "source": [ "E1U_R4 = Phi.pushforward(E[1].restrict(U))\n", "E1U_R4.display()" ] }, { "cell_type": "code", "execution_count": 104, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "True" ] }, "execution_count": 104, "metadata": {}, "output_type": "execute_result" } ], "source": [ "all([E1U_R4[i] == EIp[i] for i in R4.irange()])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let us now determine the components of $\\varepsilon_1$ in the vector frame $\\left(\\frac{\\partial}{\\partial x'}, \\frac{\\partial}{\\partial y'}, \\frac{\\partial}{\\partial z'}\\right)$ associated with the stereographic chart from the South pole:" ] }, { "cell_type": "code", "execution_count": 105, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "Coordinate frame (V, (d/dxp,d/dyp,d/dzp))" ] }, "execution_count": 105, "metadata": {}, "output_type": "execute_result" } ], "source": [ "frameS = stereoS.frame()\n", "frameS" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We use the same procedure as for the stereographic frame from the North pole:" ] }, { "cell_type": "code", "execution_count": 106, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "[Vector field Phi^*(d/dxp) along the Open subset V of the 3-dimensional differentiable manifold S^3 with values on the 4-dimensional differentiable manifold R^4,\n", " Vector field Phi^*(d/dyp) along the Open subset V of the 3-dimensional differentiable manifold S^3 with values on the 4-dimensional differentiable manifold R^4,\n", " Vector field Phi^*(d/dzp) along the Open subset V of the 3-dimensional differentiable manifold S^3 with values on the 4-dimensional differentiable manifold R^4]" ] }, "execution_count": 106, "metadata": {}, "output_type": "execute_result" } ], "source": [ "frameS_R4 = [Phi.pushforward(frameS[i]) for i in S3.irange()]\n", "frameS_R4" ] }, { "cell_type": "code", "execution_count": 107, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "[-2*xp/(xp^2 + yp^2 + zp^2 + 1),\n", " (xp^2 + yp^2 + zp^2 - 1)/(xp^2 + yp^2 + zp^2 + 1),\n", " 2*zp/(xp^2 + yp^2 + zp^2 + 1),\n", " -2*yp/(xp^2 + yp^2 + zp^2 + 1)]" ] }, "execution_count": 107, "metadata": {}, "output_type": "execute_result" } ], "source": [ "p = V((xp,yp,zp), chart=stereoS, name='p')\n", "EIp = EI.at(Phi(p))\n", "EIp[:]" ] }, { "cell_type": "code", "execution_count": 108, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "[4*(a*xp + b*yp + c*zp)/(xp^4 + yp^4 + zp^4 + 2*(xp^2 + 1)*yp^2 + 2*(xp^2 + yp^2 + 1)*zp^2 + 2*xp^2 + 1) == -2*xp/(xp^2 + yp^2 + zp^2 + 1),\n", " -2*(a*xp^2 + 2*b*xp*yp - a*yp^2 + 2*c*xp*zp - a*zp^2 - a)/(xp^4 + yp^4 + zp^4 + 2*(xp^2 + 1)*yp^2 + 2*(xp^2 + yp^2 + 1)*zp^2 + 2*xp^2 + 1) == (xp^2 + yp^2 + zp^2 - 1)/(xp^2 + yp^2 + zp^2 + 1),\n", " 2*(b*xp^2 - 2*a*xp*yp - b*yp^2 - 2*c*yp*zp + b*zp^2 + b)/(xp^4 + yp^4 + zp^4 + 2*(xp^2 + 1)*yp^2 + 2*(xp^2 + yp^2 + 1)*zp^2 + 2*xp^2 + 1) == 2*zp/(xp^2 + yp^2 + zp^2 + 1),\n", " 2*(c*xp^2 + c*yp^2 - c*zp^2 - 2*(a*xp + b*yp)*zp + c)/(xp^4 + yp^4 + zp^4 + 2*(xp^2 + 1)*yp^2 + 2*(xp^2 + yp^2 + 1)*zp^2 + 2*xp^2 + 1) == -2*yp/(xp^2 + yp^2 + zp^2 + 1)]" ] }, "execution_count": 108, "metadata": {}, "output_type": "execute_result" } ], "source": [ "eqs = [(a*frameS_R4[0][i] + b*frameS_R4[1][i] + c*frameS_R4[2][i]).expr() == EIp[i] \n", " for i in R4.irange()]\n", "eqs" ] }, { "cell_type": "code", "execution_count": 109, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "[{a: -1/2*xp^2 + 1/2*yp^2 + 1/2*zp^2 - 1/2, b: -xp*yp + zp, c: -xp*zp - yp}]" ] }, "execution_count": 109, "metadata": {}, "output_type": "execute_result" } ], "source": [ "sol = solve(eqs, (a,b,c), solution_dict=True)\n", "sol" ] }, { "cell_type": "code", "execution_count": 110, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "E_1 = (-1/2*xp^2 + 1/2*yp^2 + 1/2*zp^2 - 1/2) d/dxp + (-xp*yp + zp) d/dyp + (-xp*zp - yp) d/dzp" ] }, "execution_count": 110, "metadata": {}, "output_type": "execute_result" } ], "source": [ "E[1].restrict(V)[stereoS.frame(),:, stereoS] = (sol[0][a], sol[0][b], sol[0][c])\n", "E[1].display(stereoS.frame())" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Again, we check the correctness by" ] }, { "cell_type": "code", "execution_count": 111, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "True" ] }, "execution_count": 111, "metadata": {}, "output_type": "execute_result" } ], "source": [ "E1V_R4 = Phi.pushforward(E[1].restrict(V))\n", "all([E1V_R4[i] == EIp[i] for i in R4.irange()])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Stereographic components of the vector field $\\varepsilon_2$\n", "\n", "The vector field $\\varepsilon_2 = \\varepsilon_{\\mathbf{j}}$ is induced by the right translation by $\\mathbf{j}$:" ] }, { "cell_type": "code", "execution_count": 112, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "R^4 --> R^4\n", " (T, X, Y, Z) |--> (-Y, -Z, T, X)" ] }, "execution_count": 112, "metadata": {}, "output_type": "execute_result" } ], "source": [ "p = R4((T,X,Y,Z))\n", "RJ_R4 = R4.diff_map(R4, X4(qprod(p, Phi(J))))\n", "RJ_R4.display()" ] }, { "cell_type": "code", "execution_count": 113, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "E_J = -Y d/dT - Z d/dX + T d/dY + X d/dZ" ] }, "execution_count": 113, "metadata": {}, "output_type": "execute_result" } ], "source": [ "EJ = R4.vector_field(name='E_J', latex_name=r'E_{\\mathbf{j}}')\n", "EJ[:] = RJ_R4.expression()\n", "EJ.display()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We determine the components of $\\varepsilon_2$ in the stereographic frame from the North pole as we did for $\\varepsilon_1$:" ] }, { "cell_type": "code", "execution_count": 114, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "[-2*y/(x^2 + y^2 + z^2 + 1),\n", " -2*z/(x^2 + y^2 + z^2 + 1),\n", " -(x^2 + y^2 + z^2 - 1)/(x^2 + y^2 + z^2 + 1),\n", " 2*x/(x^2 + y^2 + z^2 + 1)]" ] }, "execution_count": 114, "metadata": {}, "output_type": "execute_result" } ], "source": [ "p = U((x,y,z), chart=stereoN)\n", "EJp = EJ.at(Phi(p))\n", "EJp[:]" ] }, { "cell_type": "code", "execution_count": 115, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "E_2 = (x*y - z) d/dx + (-1/2*x^2 + 1/2*y^2 - 1/2*z^2 + 1/2) d/dy + (y*z + x) d/dz" ] }, "execution_count": 115, "metadata": {}, "output_type": "execute_result" } ], "source": [ "eqs = [(a*frameN_R4[0][i] + b*frameN_R4[1][i] + c*frameN_R4[2][i]).expr() == EJp[i]\n", " for i in R4.irange()]\n", "sol = solve(eqs, (a,b,c), solution_dict=True)\n", "E[2].restrict(U)[stereoN.frame(),:,stereoN] = (sol[0][a], sol[0][b], sol[0][c])\n", "E[2].display(stereoN.frame())" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Check:" ] }, { "cell_type": "code", "execution_count": 116, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "True" ] }, "execution_count": 116, "metadata": {}, "output_type": "execute_result" } ], "source": [ "E2U_R4 = Phi.pushforward(E[2].restrict(U))\n", "all([E2U_R4[i] == EJp[i] for i in R4.irange()])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We turn now to the stereographic components from the South pole:" ] }, { "cell_type": "code", "execution_count": 117, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "[-2*yp/(xp^2 + yp^2 + zp^2 + 1),\n", " -2*zp/(xp^2 + yp^2 + zp^2 + 1),\n", " (xp^2 + yp^2 + zp^2 - 1)/(xp^2 + yp^2 + zp^2 + 1),\n", " 2*xp/(xp^2 + yp^2 + zp^2 + 1)]" ] }, "execution_count": 117, "metadata": {}, "output_type": "execute_result" } ], "source": [ "p = V((xp,yp,zp), chart=stereoS)\n", "EJp = EJ.at(Phi(p))\n", "EJp[:]" ] }, { "cell_type": "code", "execution_count": 118, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "E_2 = (-xp*yp - zp) d/dxp + (1/2*xp^2 - 1/2*yp^2 + 1/2*zp^2 - 1/2) d/dyp + (-yp*zp + xp) d/dzp" ] }, "execution_count": 118, "metadata": {}, "output_type": "execute_result" } ], "source": [ "eqs = [(a*frameS_R4[0][i] + b*frameS_R4[1][i] + c*frameS_R4[2][i]).expr() == EJp[i] \n", " for i in R4.irange()]\n", "sol = solve(eqs, (a,b,c), solution_dict=True)\n", "E[2].restrict(V)[stereoS.frame(),:, stereoS] = (sol[0][a], sol[0][b], sol[0][c])\n", "E[2].display(stereoS.frame())" ] }, { "cell_type": "code", "execution_count": 119, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "True" ] }, "execution_count": 119, "metadata": {}, "output_type": "execute_result" } ], "source": [ "E2V_R4 = Phi.pushforward(E[2].restrict(V))\n", "all([E2V_R4[i] == EJp[i] for i in R4.irange()])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Stereographic components of the vector field $\\varepsilon_3$\n", "\n", "The vector field $\\varepsilon_3 = \\varepsilon_{\\mathbf{k}}$ is induced by the right translation by $\\mathbf{k}$:" ] }, { "cell_type": "code", "execution_count": 120, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "R^4 --> R^4\n", " (T, X, Y, Z) |--> (-Z, Y, -X, T)" ] }, "execution_count": 120, "metadata": {}, "output_type": "execute_result" } ], "source": [ "p = R4((T,X,Y,Z))\n", "RK_R4 = R4.diff_map(R4, X4(qprod(p, Phi(K))))\n", "RK_R4.display()" ] }, { "cell_type": "code", "execution_count": 121, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "E_K = -Z d/dT + Y d/dX - X d/dY + T d/dZ" ] }, "execution_count": 121, "metadata": {}, "output_type": "execute_result" } ], "source": [ "EK = R4.vector_field(name='E_K', latex_name=r'E_{\\mathbf{k}}')\n", "EK[:] = RK_R4.expression()\n", "EK.display()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The components of $\\varepsilon_3$ in the two stereographic frames are obtained in the same manner as for $\\varepsilon_1$ and $\\varepsilon_2$" ] }, { "cell_type": "code", "execution_count": 122, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "E_3 = (x*z + y) d/dx + (y*z - x) d/dy + (-1/2*x^2 - 1/2*y^2 + 1/2*z^2 + 1/2) d/dz" ] }, "execution_count": 122, "metadata": {}, "output_type": "execute_result" } ], "source": [ "p = U((x,y,z), chart=stereoN)\n", "EKp = EK.at(Phi(p))\n", "eqs = [(a*frameN_R4[0][i] + b*frameN_R4[1][i] + c*frameN_R4[2][i]).expr() == EKp[i]\n", " for i in R4.irange()]\n", "sol = solve(eqs, (a,b,c), solution_dict=True)\n", "E[3].restrict(U)[stereoN.frame(),:,stereoN] = (sol[0][a], sol[0][b], sol[0][c])\n", "E[3].display(stereoN.frame())" ] }, { "cell_type": "code", "execution_count": 123, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "True" ] }, "execution_count": 123, "metadata": {}, "output_type": "execute_result" } ], "source": [ "E3U_R4 = Phi.pushforward(E[3].restrict(U))\n", "all([E3U_R4[i] == EKp[i] for i in R4.irange()])" ] }, { "cell_type": "code", "execution_count": 124, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "E_3 = (-xp*zp + yp) d/dxp + (-yp*zp - xp) d/dyp + (1/2*xp^2 + 1/2*yp^2 - 1/2*zp^2 - 1/2) d/dzp" ] }, "execution_count": 124, "metadata": {}, "output_type": "execute_result" } ], "source": [ "p = V((xp,yp,zp), chart=stereoS)\n", "EKp = EK.at(Phi(p))\n", "eqs = [(a*frameS_R4[0][i] + b*frameS_R4[1][i] + c*frameS_R4[2][i]).expr() == EKp[i] \n", " for i in R4.irange()]\n", "sol = solve(eqs, (a,b,c), solution_dict=True)\n", "E[3].restrict(V)[stereoS.frame(),:, stereoS] = (sol[0][a], sol[0][b], sol[0][c])\n", "E[3].display(stereoS.frame())" ] }, { "cell_type": "code", "execution_count": 125, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "True" ] }, "execution_count": 125, "metadata": {}, "output_type": "execute_result" } ], "source": [ "E3V_R4 = Phi.pushforward(E[3].restrict(V))\n", "all([E3V_R4[i] == EKp[i] for i in R4.irange()])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Summary\n", "\n", "The vector fields on $\\mathbb{R}^4$ induced by the right translations by respectively $\\mathbf{i}$, $\\mathbf{j}$ and $\\mathbf{k}$ are" ] }, { "cell_type": "code", "execution_count": 126, "metadata": { "scrolled": true }, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "E_I = -X d/dT + T d/dX + Z d/dY - Y d/dZ" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "" ], "text/plain": [ "E_J = -Y d/dT - Z d/dX + T d/dY + X d/dZ" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "" ], "text/plain": [ "E_K = -Z d/dT + Y d/dX - X d/dY + T d/dZ" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "show(EI.display())\n", "show(EJ.display())\n", "show(EK.display())" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "As a check, we note that the above formulas coincide with those given in Problem 8-6 of Lee's textbook [*Introduction to Smooth Manifolds*](https://dx.doi.org/10.1007/978-1-4419-9982-5), 2nd ed., Springer (New York) (2013).\n", "\n", "The vector fields $E_{\\mathbf{i}}$, $E_{\\mathbf{j}}$ and $E_{\\mathbf{k}}$ are tangent to $\\Phi(\\mathbb{S}^3)\\subset\\mathbb{R}^4$ and therefore induce three vectors fields on $\\mathbb{S}^3$, $\\varepsilon_1$, $\\varepsilon_2$ and $\\varepsilon_3$, which form a global vector frame of $\\mathbb{S}^3$. The components of these vector fields with respect to the (local) stereographic frames are " ] }, { "cell_type": "code", "execution_count": 127, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "E_1 = (1/2*x^2 - 1/2*y^2 - 1/2*z^2 + 1/2) d/dx + (x*y + z) d/dy + (x*z - y) d/dz" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "" ], "text/plain": [ "E_2 = (x*y - z) d/dx + (-1/2*x^2 + 1/2*y^2 - 1/2*z^2 + 1/2) d/dy + (y*z + x) d/dz" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "" ], "text/plain": [ "E_3 = (x*z + y) d/dx + (y*z - x) d/dy + (-1/2*x^2 - 1/2*y^2 + 1/2*z^2 + 1/2) d/dz" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ " \n" ] }, { "data": { "text/html": [ "" ], "text/plain": [ "E_1 = (-1/2*xp^2 + 1/2*yp^2 + 1/2*zp^2 - 1/2) d/dxp + (-xp*yp + zp) d/dyp + (-xp*zp - yp) d/dzp" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "" ], "text/plain": [ "E_2 = (-xp*yp - zp) d/dxp + (1/2*xp^2 - 1/2*yp^2 + 1/2*zp^2 - 1/2) d/dyp + (-yp*zp + xp) d/dzp" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "" ], "text/plain": [ "E_3 = (-xp*zp + yp) d/dxp + (-yp*zp - xp) d/dyp + (1/2*xp^2 + 1/2*yp^2 - 1/2*zp^2 - 1/2) d/dzp" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "for i in S3.irange():\n", " show(E[i].display(stereoN.frame()))\n", "print(\" \")\n", "for i in S3.irange():\n", " show(E[i].display(stereoS.frame()))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "To complete the connection between the global frame $(\\varepsilon_i)$ and the stereographic frames in $U$ and $V$, we shall declare the change-of-basis formulas related the two frames, so that they can be used automatically by SageMath when necessary. Starting with $U$, we first consider the restriction of the global frame to $U$:" ] }, { "cell_type": "code", "execution_count": 128, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "Vector frame (U, (E_1,E_2,E_3))" ] }, "execution_count": 128, "metadata": {}, "output_type": "execute_result" } ], "source": [ "E_U = E.restrict(U); E_U" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The automorphism $P$ such that on $U$, $\\varepsilon_i = P\\left(\\frac{\\partial}{\\partial x^i}\\right)$ is read directely on the components of $\\varepsilon_i$ with respect to the\n", "frame $\\left(\\frac{\\partial}{\\partial x^i}\\right) = \\left(\\frac{\\partial}{\\partial x}, \\frac{\\partial}{\\partial y}, \\frac{\\partial}{\\partial z} \\right)$:" ] }, { "cell_type": "code", "execution_count": 129, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "[ 1/2*x^2 - 1/2*y^2 - 1/2*z^2 + 1/2 x*y - z x*z + y]\n", "[ x*y + z -1/2*x^2 + 1/2*y^2 - 1/2*z^2 + 1/2 y*z - x]\n", "[ x*z - y y*z + x -1/2*x^2 - 1/2*y^2 + 1/2*z^2 + 1/2]" ] }, "execution_count": 129, "metadata": {}, "output_type": "execute_result" } ], "source": [ "P = U.automorphism_field()\n", "for i in S3.irange():\n", " for j in S3.irange():\n", " P[j,i] = E_U[i][j]\n", "P[:]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Check of the formula $\\varepsilon_i = P\\left(\\frac{\\partial}{\\partial x^i}\\right)$:" ] }, { "cell_type": "code", "execution_count": 130, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "True" ] }, "execution_count": 130, "metadata": {}, "output_type": "execute_result" } ], "source": [ "all([E_U[i] == P(frameN[i]) for i in S3.irange()])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We declare the change of frame by the method `set_change_of_frame`:" ] }, { "cell_type": "code", "execution_count": 131, "metadata": {}, "outputs": [], "source": [ "U.set_change_of_frame(frameN, E_U, P)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The inverse is automatically computed:" ] }, { "cell_type": "code", "execution_count": 132, "metadata": { "scrolled": true }, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "[ 2*(x^2 - y^2 - z^2 + 1)/(x^4 + y^4 + z^4 + 2*(x^2 + 1)*y^2 + 2*(x^2 + y^2 + 1)*z^2 + 2*x^2 + 1) 4*(x*y + z)/(x^4 + y^4 + z^4 + 2*(x^2 + 1)*y^2 + 2*(x^2 + y^2 + 1)*z^2 + 2*x^2 + 1) 4*(x*z - y)/(x^4 + y^4 + z^4 + 2*(x^2 + 1)*y^2 + 2*(x^2 + y^2 + 1)*z^2 + 2*x^2 + 1)]\n", "[ 4*(x*y - z)/(x^4 + y^4 + z^4 + 2*(x^2 + 1)*y^2 + 2*(x^2 + y^2 + 1)*z^2 + 2*x^2 + 1) -2*(x^2 - y^2 + z^2 - 1)/(x^4 + y^4 + z^4 + 2*(x^2 + 1)*y^2 + 2*(x^2 + y^2 + 1)*z^2 + 2*x^2 + 1) 4*(y*z + x)/(x^4 + y^4 + z^4 + 2*(x^2 + 1)*y^2 + 2*(x^2 + y^2 + 1)*z^2 + 2*x^2 + 1)]\n", "[ 4*(x*z + y)/(x^4 + y^4 + z^4 + 2*(x^2 + 1)*y^2 + 2*(x^2 + y^2 + 1)*z^2 + 2*x^2 + 1) 4*(y*z - x)/(x^4 + y^4 + z^4 + 2*(x^2 + 1)*y^2 + 2*(x^2 + y^2 + 1)*z^2 + 2*x^2 + 1) -2*(x^2 + y^2 - z^2 - 1)/(x^4 + y^4 + z^4 + 2*(x^2 + 1)*y^2 + 2*(x^2 + y^2 + 1)*z^2 + 2*x^2 + 1)]" ] }, "execution_count": 132, "metadata": {}, "output_type": "execute_result" } ], "source": [ "U.change_of_frame(E_U, frameN)[:]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We do the same thing on $V$:" ] }, { "cell_type": "code", "execution_count": 133, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "Vector frame (V, (E_1,E_2,E_3))" ] }, "execution_count": 133, "metadata": {}, "output_type": "execute_result" } ], "source": [ "E_V = E.restrict(V); E_V" ] }, { "cell_type": "code", "execution_count": 134, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "[-1/2*xp^2 + 1/2*yp^2 + 1/2*zp^2 - 1/2 -xp*yp - zp -xp*zp + yp]\n", "[ -xp*yp + zp 1/2*xp^2 - 1/2*yp^2 + 1/2*zp^2 - 1/2 -yp*zp - xp]\n", "[ -xp*zp - yp -yp*zp + xp 1/2*xp^2 + 1/2*yp^2 - 1/2*zp^2 - 1/2]" ] }, "execution_count": 134, "metadata": {}, "output_type": "execute_result" } ], "source": [ "P = V.automorphism_field()\n", "for i in S3.irange():\n", " for j in S3.irange():\n", " P[j,i] = E_V[i][j]\n", "P[:]" ] }, { "cell_type": "code", "execution_count": 135, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "True" ] }, "execution_count": 135, "metadata": {}, "output_type": "execute_result" } ], "source": [ "all([E_V[i] == P(frameS[i]) for i in S3.irange()])" ] }, { "cell_type": "code", "execution_count": 136, "metadata": {}, "outputs": [], "source": [ "V.set_change_of_frame(frameS, E_V, P)" ] }, { "cell_type": "code", "execution_count": 137, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "[-2*(xp^2 - yp^2 - zp^2 + 1)/(xp^4 + yp^4 + zp^4 + 2*(xp^2 + 1)*yp^2 + 2*(xp^2 + yp^2 + 1)*zp^2 + 2*xp^2 + 1) -4*(xp*yp - zp)/(xp^4 + yp^4 + zp^4 + 2*(xp^2 + 1)*yp^2 + 2*(xp^2 + yp^2 + 1)*zp^2 + 2*xp^2 + 1) -4*(xp*zp + yp)/(xp^4 + yp^4 + zp^4 + 2*(xp^2 + 1)*yp^2 + 2*(xp^2 + yp^2 + 1)*zp^2 + 2*xp^2 + 1)]\n", "[ -4*(xp*yp + zp)/(xp^4 + yp^4 + zp^4 + 2*(xp^2 + 1)*yp^2 + 2*(xp^2 + yp^2 + 1)*zp^2 + 2*xp^2 + 1) 2*(xp^2 - yp^2 + zp^2 - 1)/(xp^4 + yp^4 + zp^4 + 2*(xp^2 + 1)*yp^2 + 2*(xp^2 + yp^2 + 1)*zp^2 + 2*xp^2 + 1) -4*(yp*zp - xp)/(xp^4 + yp^4 + zp^4 + 2*(xp^2 + 1)*yp^2 + 2*(xp^2 + yp^2 + 1)*zp^2 + 2*xp^2 + 1)]\n", "[ -4*(xp*zp - yp)/(xp^4 + yp^4 + zp^4 + 2*(xp^2 + 1)*yp^2 + 2*(xp^2 + yp^2 + 1)*zp^2 + 2*xp^2 + 1) -4*(yp*zp + xp)/(xp^4 + yp^4 + zp^4 + 2*(xp^2 + 1)*yp^2 + 2*(xp^2 + yp^2 + 1)*zp^2 + 2*xp^2 + 1) 2*(xp^2 + yp^2 - zp^2 - 1)/(xp^4 + yp^4 + zp^4 + 2*(xp^2 + 1)*yp^2 + 2*(xp^2 + yp^2 + 1)*zp^2 + 2*xp^2 + 1)]" ] }, "execution_count": 137, "metadata": {}, "output_type": "execute_result" } ], "source": [ "V.change_of_frame(E_V, frameS)[:]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### $\\mathbb{S}^3$ as a parallelizable manifold\n", "\n", "Because it admits a global vector frame, $\\mathbb{S}^3$ is a parallelizable manifold:" ] }, { "cell_type": "code", "execution_count": 138, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "True" ] }, "execution_count": 138, "metadata": {}, "output_type": "execute_result" } ], "source": [ "S3.is_manifestly_parallelizable()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Equivalently, the set $\\mathfrak{X}(\\mathbb{S}^3)$ of vector fields on $\\mathbb{S}^3$ is a **free module of finite rank** over the algebra $C^\\infty(\\mathbb{S}^3)$ (the algebra of smooth scalar fields on $\\mathbb{S}^3$:" ] }, { "cell_type": "code", "execution_count": 139, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "Free module X(S^3) of vector fields on the 3-dimensional differentiable manifold S^3" ] }, "execution_count": 139, "metadata": {}, "output_type": "execute_result" } ], "source": [ "XS3 = S3.vector_field_module()\n", "XS3" ] }, { "cell_type": "code", "execution_count": 140, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "True" ] }, "execution_count": 140, "metadata": {}, "output_type": "execute_result" } ], "source": [ "isinstance(XS3, FiniteRankFreeModule)" ] }, { "cell_type": "code", "execution_count": 141, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Category of finite dimensional modules over Algebra of differentiable scalar fields on the 3-dimensional differentiable manifold S^3\n" ] } ], "source": [ "print(XS3.category())" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "As a free module, $\\mathfrak{X}(\\mathbb{S}^3)$ admits a basis, which is nothing but the global vector frame constructed above:" ] }, { "cell_type": "code", "execution_count": 142, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "Vector frame (S^3, (E_1,E_2,E_3))" ] }, "execution_count": 142, "metadata": {}, "output_type": "execute_result" } ], "source": [ "XS3.default_basis()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Structure coefficients of the global frame\n", "\n", "On $U$, we may compute the **Lie brackets** $[\\varepsilon_i, \\varepsilon_j]$ of two vectors of the global frame:" ] }, { "cell_type": "code", "execution_count": 143, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "[E_1,E_2] = 2 E_3" ] }, "execution_count": 143, "metadata": {}, "output_type": "execute_result" } ], "source": [ "E_U[1].bracket(E_U[2]).display(E_U)" ] }, { "cell_type": "code", "execution_count": 144, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "[E_1,E_3] = -2 E_2" ] }, "execution_count": 144, "metadata": {}, "output_type": "execute_result" } ], "source": [ "E_U[1].bracket(E_U[3]).display(E_U)" ] }, { "cell_type": "code", "execution_count": 145, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "[E_2,E_3] = 2 E_1" ] }, "execution_count": 145, "metadata": {}, "output_type": "execute_result" } ], "source": [ "E_U[2].bracket(E_U[3]).display(E_U)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Equivalently, the structure coefficients of the frame $\\varepsilon$ are" ] }, { "cell_type": "code", "execution_count": 146, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "3-indices components w.r.t. Vector frame (U, (E_1,E_2,E_3)), with antisymmetry on the index positions (1, 2)" ] }, "execution_count": 146, "metadata": {}, "output_type": "execute_result" } ], "source": [ "C = E_U.structure_coeff(); C" ] }, { "cell_type": "code", "execution_count": 147, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "C_123 = 2 \n", "C_132 = -2 \n", "C_213 = -2 \n", "C_231 = 2 \n", "C_312 = 2 \n", "C_321 = -2 " ] }, "execution_count": 147, "metadata": {}, "output_type": "execute_result" } ], "source": [ "C.display('C')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "By definition, the structure coefficients $C_{kij}$ obey the relation\n", "$[\\varepsilon_i, \\varepsilon_j] = C_{kij} \\, \\varepsilon_k$, as we can check:" ] }, { "cell_type": "code", "execution_count": 148, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "True" ] }, "execution_count": 148, "metadata": {}, "output_type": "execute_result" } ], "source": [ "E_U[1].bracket(E_U[2]) == sum(C[[k,1,2]]*E_U[k] for k in S3.irange())" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Tangent space at the unit element\n", "\n", "The Lie algebra of $\\mathbb{S}^3$ can be identified with the tangent space at the unit element $\\mathbf{1}$:" ] }, { "cell_type": "code", "execution_count": 149, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "Tangent space at Point 1 on the 3-dimensional differentiable manifold S^3" ] }, "execution_count": 149, "metadata": {}, "output_type": "execute_result" } ], "source": [ "T1 = S3.tangent_space(One)\n", "T1" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The values taken by the global frame vectors at $\\mathbf{1}$ are" ] }, { "cell_type": "code", "execution_count": 150, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "E_1 = 1/2 d/dx" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "" ], "text/plain": [ "E_2 = 1/2 d/dy" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "" ], "text/plain": [ "E_3 = 1/2 d/dz" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "for i in S3.irange():\n", " show(E[i].at(One).display())" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Each of these vectors belongs to $T_{\\mathbf{1}}\\mathbb{S}^3$:" ] }, { "cell_type": "code", "execution_count": 151, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "Tangent space at Point 1 on the 3-dimensional differentiable manifold S^3" ] }, "execution_count": 151, "metadata": {}, "output_type": "execute_result" } ], "source": [ "E[1].at(One).parent()" ] }, { "cell_type": "code", "execution_count": 152, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "True" ] }, "execution_count": 152, "metadata": {}, "output_type": "execute_result" } ], "source": [ "all([E[i].at(One).parent() is T1 for i in S3.irange()])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The simple expressions of $(\\varepsilon_1, \\varepsilon_2, \\varepsilon_3)$ in terms of the basis $\\left(\\frac{\\partial}{\\partial x}, \\frac{\\partial}{\\partial y}, \\frac{\\partial}{\\partial z}\\right)$ of $T_{\\mathbf{1}}\\mathbb{S}^3$ induced by the stereographic coordinates stems from the fact that\n", "the $\\mathbb{R}^4$ vectors $(E_{\\mathbf{i}}, E_{\\mathbf{j}}, E_{\\mathbf{k}})$ coincide with \n", "the vectors $\\left(\\frac{\\partial}{\\partial X}, \\frac{\\partial}{\\partial Y}, \\frac{\\partial}{\\partial Z}\\right)$ at $\\Phi(\\mathbf{1})$:" ] }, { "cell_type": "code", "execution_count": 153, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "E_I = d/dX" ] }, "execution_count": 153, "metadata": {}, "output_type": "execute_result" } ], "source": [ "EI.at(Phi(One)).display()" ] }, { "cell_type": "code", "execution_count": 154, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "E_J = d/dY" ] }, "execution_count": 154, "metadata": {}, "output_type": "execute_result" } ], "source": [ "EJ.at(Phi(One)).display()" ] }, { "cell_type": "code", "execution_count": 155, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "E_K = d/dZ" ] }, "execution_count": 155, "metadata": {}, "output_type": "execute_result" } ], "source": [ "EK.at(Phi(One)).display()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The extra factor $1/2$, which appears in the above expressions of $(\\varepsilon_1, \\varepsilon_2, \\varepsilon_3)$, arises from the fact that the stereographic coordinates $(x,y,z)$ have been defined with respect to the hyperplane $T=0$ and not to the hyperplane $T=1$ (to which $\\Phi(\\mathbf{1})$ belongs). " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Link with the Hopf coordinates\n", "\n", "The Hopf coordinates have been introduced in the notebook [3-sphere: charts, quaternions and the Hopf fribration](http://nbviewer.jupyter.org/github/sagemanifolds/SageManifolds/blob/master/Notebooks/SM_sphere_S3_Hopf.ipynb)." ] }, { "cell_type": "code", "execution_count": 156, "metadata": {}, "outputs": [], "source": [ "B = U.open_subset('B', coord_def={stereoN.restrict(U): \n", " [x^2+y^2!=0, x^2+y^2+z^2!=1, \n", " (1-x^2-y^2-z^2)*x-2*y*z!=0]})" ] }, { "cell_type": "code", "execution_count": 157, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "Chart (B, (eta, alpha, beta))" ] }, "execution_count": 157, "metadata": {}, "output_type": "execute_result" } ], "source": [ "Hcoord. = B.chart(r\"eta:(0,pi/2):\\eta alpha:(0,2*pi):\\alpha beta:(0,2*pi):\\beta\")\n", "Hcoord" ] }, { "cell_type": "code", "execution_count": 158, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "x = cos(alpha + beta)*sin(eta)/(cos(eta)*sin(alpha) + 1)\n", "y = sin(alpha + beta)*sin(eta)/(cos(eta)*sin(alpha) + 1)\n", "z = cos(alpha)*cos(eta)/(cos(eta)*sin(alpha) + 1)" ] }, "execution_count": 158, "metadata": {}, "output_type": "execute_result" } ], "source": [ "Hcoord_to_stereoN = Hcoord.transition_map(\n", " stereoN.restrict(U),\n", " (sin(eta)*cos(alp+bet)/(1+cos(eta)*sin(alp)),\n", " sin(eta)*sin(alp+bet)/(1+cos(eta)*sin(alp)),\n", " cos(eta)*cos(alp)/(1+cos(eta)*sin(alp))))\n", "Hcoord_to_stereoN.display()" ] }, { "cell_type": "code", "execution_count": 159, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Check of the inverse coordinate transformation:\n", " eta == arcsin((cos(eta)*sin(alpha) + 1)*sqrt(cos(eta) + 1)*sqrt(-cos(eta) + 1)/abs(cos(eta)*sin(alpha) + 1)) **failed**\n", " alpha == pi - arctan2(2*cos(eta)*sin(alpha)/(cos(eta)*sin(alpha) + 1), -2*cos(alpha)*cos(eta)/(cos(eta)*sin(alpha) + 1)) **failed**\n", " beta == arctan2(2*cos(eta)*sin(alpha)/(cos(eta)*sin(alpha) + 1), -2*cos(alpha)*cos(eta)/(cos(eta)*sin(alpha) + 1)) - arctan2((cos(beta)*sin(alpha) + cos(alpha)*sin(beta))*sin(eta)/(cos(eta)*sin(alpha) + 1), -(cos(alpha)*cos(beta) - sin(alpha)*sin(beta))*sin(eta)/(cos(eta)*sin(alpha) + 1)) **failed**\n", " x == x *passed*\n", " y == y *passed*\n", " z == z *passed*\n", "NB: a failed report can reflect a mere lack of simplification.\n" ] }, { "data": { "text/html": [ "" ], "text/plain": [ "eta = arcsin(2*sqrt(x^2 + y^2)/(x^2 + y^2 + z^2 + 1))\n", "alpha = pi + arctan2(x^2 + y^2 + z^2 - 1, -2*z)\n", "beta = -arctan2(x^2 + y^2 + z^2 - 1, -2*z) + arctan2(-y, -x)" ] }, "execution_count": 159, "metadata": {}, "output_type": "execute_result" } ], "source": [ "Hcoord_to_stereoN.set_inverse(asin(2*sqrt(x^2+y^2)/(1+x^2+y^2+z^2)),\n", " atan2(x^2+y^2+z^2-1, -2*z) + pi,\n", " atan2(-y,-x) - atan2(x^2+y^2+z^2-1, -2*z))\n", "Hcoord_to_stereoN.inverse().display()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let us express the vectors of the global frame $\\varepsilon$ in terms of the vector frame $\\left(\\frac{\\partial}{\\partial\\eta}, \\frac{\\partial}{\\partial\\alpha}, \\frac{\\partial}{\\partial\\beta}\\right)$ associated with the Hopf coordinates:" ] }, { "cell_type": "code", "execution_count": 160, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "E_1 = (2*cos(alpha)*cos(beta)*sin(alpha) + (2*cos(alpha)^2 - 1)*sin(beta))*sin(eta)/(sqrt(cos(eta) + 1)*sqrt(-cos(eta) + 1)) d/deta + (2*cos(alpha)*sin(alpha)*sin(beta) + (2*sin(alpha)^2 - 1)*cos(beta))*sin(eta)/cos(eta) d/dalpha - (2*cos(alpha)*sin(alpha)*sin(beta) - (2*cos(alpha)^2 - 1)*cos(beta))/(cos(eta)*sin(eta)) d/dbeta" ] }, "execution_count": 160, "metadata": {}, "output_type": "execute_result" } ], "source": [ "E_U[1].display(Hcoord.frame(), Hcoord)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We notice that the components can be simplified to $\\varepsilon_1^{\\ \\, \\eta}=\\sin(2\\alpha+\\beta)$, $\\varepsilon_1^{\\ \\, \\alpha}=-\\cos(2\\alpha+\\beta)\\tan\\eta$ and \n", "$\\varepsilon_1^{\\ \\, \\beta}=\\cos(2\\alpha+\\beta)/(\\cos\\eta\\sin\\eta)$. Hence, we substitute these values via the method `add_comp` (NB: the method `set_comp` would erase the other sets of components):" ] }, { "cell_type": "code", "execution_count": 161, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "E_1 = sin(2*alpha + beta) d/deta - cos(2*alpha + beta)*tan(eta) d/dalpha + cos(2*alpha + beta)/(cos(eta)*sin(eta)) d/dbeta" ] }, "execution_count": 161, "metadata": {}, "output_type": "execute_result" } ], "source": [ "E_U[1].add_comp(Hcoord.frame())[1, Hcoord] = sin(2*alp+bet)\n", "E_U[1].add_comp(Hcoord.frame())[2, Hcoord] = -cos(2*alp+bet) * tan(eta)\n", "E_U[1].add_comp(Hcoord.frame())[3, Hcoord] = cos(2*alp+bet) / (cos(eta)*sin(eta))\n", "E_U[1].display(Hcoord.frame(), Hcoord)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Similarly, the components of $\\varepsilon_2$ require some simplification \"by hand\":" ] }, { "cell_type": "code", "execution_count": 162, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "E_2 = (2*cos(alpha)*sin(alpha)*sin(beta) + (2*sin(alpha)^2 - 1)*cos(beta))*sin(eta)/(sqrt(cos(eta) + 1)*sqrt(-cos(eta) + 1)) d/deta - (2*cos(alpha)*cos(beta)*sin(alpha) - (2*sin(alpha)^2 - 1)*sin(beta))*sin(eta)/cos(eta) d/dalpha + (2*cos(alpha)*cos(beta)*sin(alpha) + (2*cos(alpha)^2 - 1)*sin(beta))/(cos(eta)*sin(eta)) d/dbeta" ] }, "execution_count": 162, "metadata": {}, "output_type": "execute_result" } ], "source": [ "E_U[2].display(Hcoord.frame(), Hcoord)" ] }, { "cell_type": "code", "execution_count": 163, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "E_2 = -cos(2*alpha + beta) d/deta - sin(2*alpha + beta)*tan(eta) d/dalpha + sin(2*alpha + beta)/(cos(eta)*sin(eta)) d/dbeta" ] }, "execution_count": 163, "metadata": {}, "output_type": "execute_result" } ], "source": [ "E_U[2].add_comp(Hcoord.frame())[1, Hcoord] = -cos(2*alp+bet)\n", "E_U[2].add_comp(Hcoord.frame())[2, Hcoord] = -sin(2*alp+bet) * tan(eta)\n", "E_U[2].add_comp(Hcoord.frame())[3, Hcoord] = sin(2*alp+bet) / (cos(eta)*sin(eta))\n", "E_U[2].display(Hcoord.frame(), Hcoord)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The expression of $\\varepsilon_3$ in terms of the vector frame $\\left(\\frac{\\partial}{\\partial\\eta}, \\frac{\\partial}{\\partial\\alpha}, \\frac{\\partial}{\\partial\\beta}\\right)$ is particularly simple:" ] }, { "cell_type": "code", "execution_count": 164, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "E_3 = -d/dalpha" ] }, "execution_count": 164, "metadata": {}, "output_type": "execute_result" } ], "source": [ "E_U[3].display(Hcoord.frame(), Hcoord)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "This is not surprising since $\\varepsilon_3$ has been defined as the vector field induced by the right translation by $\\mathbf{k}$ and the **Hopf fibration** considered the notebook [3-sphere: charts, quaternions and the Hopf fribration](http://nbviewer.jupyter.org/github/sagemanifolds/SageManifolds/blob/master/Notebooks/SM_sphere_S3_Hopf.ipynb) has been defined with respect to $\\mathbf{k}$ as \n", "$$ \n", " \\begin{array}{cccc}\n", " h:& \\mathbb{S}^3 & \\to & \\mathbb{S}^2\\\\\n", " & q & \\mapsto & q \\mathbf{k} \\bar{q}\n", " \\end{array}\n", "$$ \n", "More precisely, we have shown in the above notebook that $\\frac{\\partial}{\\partial\\alpha}$ is tangent to the $\\mathbb{S}^1$ fibers of $h$ and it is easy to see that the field lines of $\\varepsilon_3$ coincide with these fibers: let $q\\in\\mathbb{S}^3$ and $q'\\in\\mathbb{S}^3$ be a point infinitely close to $q$ on a field line of $\\varepsilon_3$: \n", "$$\n", " q' = q + \\lambda \\left. \\varepsilon_3 \\right| _q = q + \\lambda q \\, \\mathbf{k}, \n", "$$\n", "where $\\lambda = o(1)$ is an infinitesimal real number and the second equality stems from the very definition of $\\varepsilon_3 = \\varepsilon_{\\mathbf{k}}$ as the vector field associated with the right translation by $\\mathbf{k}$. We have then\n", "$$\n", " \\overline{q'} = \\overline{q + \\lambda q \\, \\mathbf{k}} \n", " = \\bar{q} + \\lambda \\bar{\\mathbf{k}} \\bar{q}\n", " = \\bar{q} - \\lambda \\mathbf{k} \\bar{q}\n", "$$\n", "so that\n", "$$\n", " h(q') = (q + \\lambda q \\, \\mathbf{k})\\mathbf{k}(\\bar{q} - \\lambda \\mathbf{k} \\bar{q}) . \n", "$$\n", "Expanding and using $\\mathbf{k}^2 = -1$ and $q\\bar{q} = 1$, we find \n", "$h(q') = h(q)$ at first order in $\\lambda$, which shows that $q$ and $q'$ belong to the same fiber of $h$. \n", "\n", "Accordingly the field lines of $\\varepsilon_3$ are circles, as we can check on a (projection) plot in the plane $z=0$:" ] }, { "cell_type": "code", "execution_count": 165, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAc4AAAHWCAYAAAD+Y2lGAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAPYQAAD2EBqD+naQAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMi40LCBodHRwOi8vbWF0cGxvdGxpYi5vcmcv7US4rQAAIABJREFUeJzsnXmcTfX/x1/XLNaZibKN7FJIskYpazFCJNEi+eFbIqHNtKFISVJRkqWQJFu0iAqTLetomQhhLGNnZjD7ff/++HTcc/dzzj3bnXk/H4/zmHvnnnM+73Puued13u/35/P+OIiIwDAMwzCMIopZbQDDMAzDhBMsnAzDMAyjAhZOhmEYhlEBCyfDMAzDqICFk2EYhmFUwMLJMAzDMCpg4WQYhmEYFbBwMgzDMIwKWDgZhmEYRgUsnAzDMAyjAhZOhmEYhlEBCyfDMAzDqICFk2EYhmFUwMLJMAzDMCpg4WQYhmEYFbBwMgzDMIwKWDgZxmDOnz+PQYMGoWfPnujduzfy8vLcPn/xxRfRq1cvi6xjGEYtDiIiq41gmMLMsGHD8Morr+DcuXO4+eabsXLlSnTr1g0AQES49tpr0axZM6xZs8ZiSxmGUQJ7nAxjIH///TcqV66MSpUqYfPmzQCAChUqXP38jz/+wIULF9C+fXurTGQYRiUsnAxjIGfOnEG/fv0AAPPmzUOdOnXQokWLq58nJSUBAAsnw4QRkVYbwDCFmbvuugsAkJqaio0bN2L8+PFwOBxXP09KSkJsbCyaNm1qlYkMw6iEPU6GMYFly5YBAB544AG3/yclJeGuu+5CRESEFWYxDKMBFk6GMYHt27ejcuXKuPHGG6/+b9++fTh16hSHaRkmzGDhZBgTOHfuHKpXr+72v59++gkA0K5dOytMYhhGIyycDGMCzZo1Q2pqKgoKCgAAv//+O1599VWUK1cOjRo1stg6hmHUwJ2DGMYEXnrpJRw7dgxdunRBnTp1UKZMGeTl5SEhIcGtsxDDMPaHCyAwjMEQEbKzs1GyZMmr/1uxYgV69uyJVatWoWvXrhZaxzCMWlg4GcZgOnXqhC1btiAtLQ2lS5cGEeGOO+5AbGwsVq9ebbV5DMOohHOcDGMw27dvR4sWLVCyZEkUFBRg5MiRcDqd+Oqrr6w2jWEYDbDHyTAGs3btWqxduxZXrlzB6dOn0aJFCzzzzDOIioqy2jSGYTTAwskwDMMwKuBQLcMwDMOogIWTYRiGYVTAwskwDMMwKmDhZBiGYRgVsHAyDMMwjApYOBmGYRhGBSycDMMwDKMCFk6GYRiGUQELJ8MwDMOogIWTYRiGYVTAwskwDMMwKmDhZBiTISJkZGSAy0QzTHjCwskwJpOZmYm4uDhkZmZabQrDMBpg4WQYhmEYFbBwMgzDMIwKWDgZhmEYRgUsnEyRJSkpCd26dUN8fDwcDgdWrFgRcP3169fD4XB4LXv37jXJYoZh7ECk1QYwjFVcvnwZjRo1woABA9CrVy/F2+3btw+xsbFX35cvX94I8xiGsSksnEyRJSEhAQkJCaq3q1ChAq655hoDLGIYJhzgUC3DqKRx48aoXLkyOnTogHXr1gVdPycnBxkZGW4LwzDhCwsnYyhOJ5CaChSGsf6VK1fGzJkzsXTpUixbtgw33ngjOnTogKSkpIDbTZw4EXFxcVeXqlWrmmQxwzBG4CAuX8LojNMJbN4MfPklMGcOkJ0N3HEHsHGj1Zb5x+FwYPny5ejRo4eq7bp16waHw4GVK1f6XScnJwc5OTlX32dkZKBq1apIT093y5UyDBMecI6T0QVJLL/+GliyBDhxwv3zP/+0xi6jadmyJRYsWBBwneLFi6N48eImWcQwjNGwcDKaCSaWcu67zzy7zGT37t2oXLmy1WYwDGMiLJyMKtSIpZyRI421SwuXLl3CgQMHrr4/dOgQkpOTUa5cOVSrVg2JiYk4fvw45s2bBwCYOnUqatSogQYNGiA3NxcLFizA0qVLsXTpUqsOgWEYC2DhZBTx22/AwoXqxFKiTh2gUSNj7AqFHTt2oF27dlffjxo1CgDQv39/fPbZZ0hLS0NqaurVz3Nzc/Hcc8/h+PHjKFmyJBo0aIDvvvsOXbp0Md12hmGsgzsHMUH5/HPg8ce1b5+YCLz5pm7mhD0ZGRmIi4vjzkEME6bwcBQmKAcPhrb9gw/qYwfDMIwdYOFkgjJqFNCkibZt7RqmZRiG0QoLJxOUa64B1q7VJp69ewMOh/42MQzDWAULJ6OIcuW0iSeHaRmGKWywcDKKkcSzcWNl63OYlmGYwggLJ6OKUqVE6FYJHKZlGKYwwsLJKCY7G+jRA5AmBCkW5OrhMK0706dPR/369dG8eXOrTWEYJgR4HCejCEk0f/xRvC9TBvjqK+DVV4Fdu7zXr1MH+Ocf9jh9weM4GSa8YY+TCYov0fzhB6BLF/8dhjhMyzBMYYWFkwmIP9Fs3Vq899fblsO0DMMUVlg4Gb8EE00JT/Fs2dK63rREwOHDwDffAG+8Adx7LxATAxQvDnzxhTU2MQxTuOAcJ+MTpaIpJycHSEoCmjUDypY13sbLl8U8n3v2AL//7vqbkeF7/VatxMwuVsM5ToYJb3h2FMYLLaIJCK/u7ruNsensWWDTJneBPHBAeJhKGT7cGNsYhilasHAybmgVTSP56y8R/r10Sfs+br8d6NtXP5sYhim6cI6TuYodRRMQw1pCEU0AmDBBH1sYhmFYOBkA9hVNQHTwCaVmQJs2QNu2upnDMEwRh4WTsbVoAkB0tCi2oLTUnydjx+pqDsMwRRwWziKO3UVTomZNYO5c9duxt8kwjN6wcBZhwkU0JXr0AEaMULcNe5sMw+gNC2cRJdxEU+KZZ0RBAyXYzdvkIu8MUzjgAghFkHAVzbVrgUceAc6cUbb+unX2Ek4JLoDAMOENe5xFjHAUzYIC4LXXgE6dXKJ57bWBt7Gbt8kwTOGBhbMIEY6imZYGdOwo6s5KsZEuXYC9ewPnOzm3yTCMUbBwFhHCUTTXrgVuvRVYv168j4gA3n4bWLUKuO468dpXupC9TYZhjISFswgQbqIpD82ePi3+d/31wIYNwAsvAMX+u2r9je9kb5NhGCNh4SzkhJto+gvN7t4N3HGH9/qe4zvZ22QYxmi4yHshJtxEc+1a4NFHXV5mRATw5pvAc8+5vExf9OgBLFggQrpGeZszZ4p6t1lZ6rfNyRHbXXONmNmldGn97WMYxjx4OEohxVM0S5cGVq9WJ5pHjgD9+gH79gGzZwNduxpja0EBMG4cMH68y8u8/npg0SLfXqYV3HijKDYfKhMmAMOG8XAUhglnOFRbCAlVNFNTgSFDgNq1gV9/FR5gYqIxtqoNzVpFhw6h76NECWDw4ND3wzCMtbBwFjJCEU1JMOvUAWbMEJ6gxE036W9rsF6zdiIxEYiK0r59RATw889A+fL62cQwjDWwcBYitIqmp2Dm5Xmv07OnfnYq7TVrJ6pWBQYN0r79W2+JybQZhgl/OMdZSNAimqmpwMSJIn/pSyzl/Pkn0KBB6HampQEPP+zyMgERmv38c/t5mZ4cPSrC18HOlSdduwLffON6IOCSewwT3tjw2Z5Ri1rRVOJhyomOBurWDd1OX6HZSZPsGZr1RdWqwMCB6rf57DN7etEMw2iDh6OEOWpEU42HKadBg9Dye+HQazYYBQXAkiUiT6mUyEhRoEGqqzt9+nRMnz4dBfLkMcMwYQeHasMYNaL5wQdiPKTaMCMAPP64tkmkgfAOzQIuwXz9dSAlRd2277wjzrknHKplmPCGA0hhitrw7IQJ2kQTAG65Rdt24dRr1pOCAuEt3nIL0Levu2g2bSq8yUB07QqMGmWsjQzDWAMLZxiipSNQoJlEgtGokbr1w7HXrEQgwbz9dmDNGmD79sDjMTmvyTCFGw7VhhmhjNNcskR0bsnIUNfmmTPKPcRwDc0GCsnefrso5dexI+BwiP/562EbGQkkJQGtWvlvi0O1DBPe8DNxGBFqRaAHHgB27QKaNFHeZny8csELx16zSjzMjRuBu+92iSbgf1znxImBRTMUcnKAFSuEMF+5YkwbDMMogJiwICuLqFMnItEvlah0aaJff9W2r+xsoqFDXfsKtHTuHHx/+flEr75K5HC4trv+eqKNG7XZZwb5+USLFhHVr+99zLffTrRmDZHTGXgfqalEUVGu7bp2JSooCN52eno6AaD09HRVNj/zjKutyEiipk2Jhg0j+uILooMHg9vLMIw+8HCUMECPgu1yihdXnrcMtl64hWbVhmQDUbWq6DU7caIYE2t0XvPUKdfr/Hxg506xTJsm/lexItCypfB4W7UCmjUDSpUyzh6GKbJYrdxMYPT0NCWSk4mKF3fts2ZN/x7nF1/438+aNUQVKrjWjYggmjRJmddlNgUFoXuYvnA6iXbuJMrMVL6NVo/zww+VRQl8eaULFrBXyjB6wcJpY4wQzYwMorp1XfscOlSEbocN833z/fNP732EU2i2oIDoq6/0F8xQ0Cqcf/yhTjh9LeXLE+XlGXRgDFNEYOG0KUaIptNJ9NBDrn02aSLakfj6a6LYWNfn0dFEubnu+zh+nKhNG/ebcZcuRGfOhGabP/bsIerdm2jAAHWerB0FU0KrcBYUEF13XejiuXevQQfGMEUEFk4bYoRoEhHNnOnaZ2ws0YED3uscOCAEFSB65BH3z9asER6LPDT79tv6h2b/+oto7Fhv0Xv33eDb2lkwJbQKJxFRr16hiWa7dgYcEMMUMbhzkM3QuyOQxJ49wNNPu97PmiXGIXpSu7YY4H/ggOjwAphTazYlBfj6a2DxYv+l7WrU8L+90yk6/YwbF3qnH7uSnQ1UqaJtW4cDePfd0AphMAzzH1YrN+PCKE/TV15TKUaGZiXPskGD4J5SuXK+Pdtw8DAlpk2bRvXq1aO6desq8jizsojWrSMaM0Z8B/IOXWqWUqWIVqww4wgZpmjAwmkTjBLNYHnNQBgRmlUjlvJl+HD3/YSTYHriL1Srl1DKl0qViHbssOIoGabwwsJpA4wSTSJleU1PjOg1u2iRerGUL9L5CGfBlJCE89SpdFVCWasW0f/9H1Hz5srOWcOGREeOWHywDFMIYeG0GCNF03O85uLFwbcxIjR7+bLwVrWKZny8GEIR7oIpeZSjRwvhjI5OVySU8+a5C6CS8ZydOxNp6HvEMIwCuHOQhRjVEQgAMjOBBx8U9U0BYOhQoHfvwNusXQs88ogo6g6IWrNvvimq44RSEadkSVHF5rfftG1/yy2iglG4dfrJzga2bhVVldavF6+l7wMAcnPd169ZE2jbVixt2gDVq/veb9u2gdsdMkTMvxps6rNQOHVKXK9lyhjXBsPYFquVu6hipKepNq+Zl0f0yivGFjQ4dYro5ptDz9nZ2cNUnqMUHmf16uk0YADR558THT6svB1/4zkdDqIpU4w/L7/8Imr0lixJ9OyzRCdPGtsew9gNFk4LMFI0idTlNc0saBCqeNpNMNV25qlZUxRy+Phj7eM4JTzHc5rZc3b0aPe2WUCZogYLp8kYLZpq8ppmFTSQo0U87SKYWoXS06MMpQCCxPTprnbM7jn74ou+j5cFlCkqsHCaiNGiqXS8pq/QbJUq5tWaPX6cKC5OmWiaEXr0h15C6YkewnnliihF2LOn+T1n/QknCyhTVGDhNAmjRVNpXtPsWrOe5OW52xloqVzZ3JlW1AplRMRhAmbT8OE7VOUo9RBOKwkmnCygTGGHe9WagJG9ZyVmzQK+/FK8jo0VpetKlHBfx6hes0rJzwf69ROl+pTQu7exdgXr9epJrVqiR2vZsnuQk7MG7drVRq9eA9Gu3XJUr97UOEPDlKwsUebvo4+Ap54Cnn9ezBnKMOEOC6fBmCGawerQ5ueLGq4TJghfABA1T7/6Sr9as8HIywPatQM2bfL+rFQp4MoV7/8HGz6jha1bxflXI5TS8JBq1aRPGv23aOPgQfF3wwZxPVjBqVOivm+lSuqH8hw5om59SUCnTQPuuw+YPFlMAn7kiDh+Kyc8T00F4uLEYhVpaeIht2xZ62xgVGK1y1vYeeEF48KzRMrymq+/bl1olkiEZ6UZV3x1+jl50rvDUHy8/mHaWbMChxb9FRwIBABavnx5wHWys7MpPT2d0tPTadasyyQNRxF/1XWUKgxLVBTRt9+KzmiRkUSDBxMdOhT696uWjRuFLcWLE338sTW59F27xDkoWZJo5Urz22e0YUKArmhz7Jj4a4SnSQQ88QTwzz/ifZMm4mnek6NHxd+ICODtt4FVq8x7ys/PBx57DNi1y/W/evWANWuAjRuBu+8W4buffwZuvtm1Tq9e+odpDx92f1+rFvB//wfMmye8n4MHgdmzRTi5fHlg717xnb31FtC1K7B8ubZ2J06ciLi4OMTFxWHQoNdDPo5wJy8POHRIzLqTnw98+ilwww3A//7n/R0ZyfHjwpacHFE04qGHgIwM89oHgBMnxDnIyhLX/KpV5rbPaMNBJAXvGCM4c0ZMl3XPPa5puvTi00/FzQYQec1du7ynClu0SOQ2GzYE2rcXVXjMQhJNKfdarBjwxhtAYqLv8ODp08DAgcC5c8DSpUDlyvrac+UK8MUXQPHiQMuWIlR5+LDv5dQp7+2LFRPHJLfd4XBg+fLl6NGjh992c3JykPNfTPjKFeDzz7MwenQlPPtsOooXj9XvABXidAI7dwL794sHu/x8/+vGxooKRtWqib9xcSLMvWWLtrYrVRLT0w0YIFIHkye7i1VkpPjspZcCTyOnB06nmGbtww9d/6tTR/xeb73V2LYlCgrEb2ThQvE+Kkpc+926mdM+oxGrXV5GG8HGa+blEQ0Z4vq8c2dz7fPsPRsVRbRqlbk2yPn2W6I+fYhuu42oYkVtIcZSpbzDeVAQqvXETr1qs7NF+uCNN4g6dBAhw0DnoFo1bUUsGjcm+uYb7/N3/jzRa6+JQh3y9c0M4S5Z4t5+8eJEM2aYF7rNyyN6+GH33wqHbe0NC2cYEiyveewYUevW7jeiZs3Ms89uopmRQRQdHXpubt48732Hu3B6olZItQqmJ1YL6MGDRE2burfdp495hfJZPMMLFs4wI9h4zR9+8F3HtE8fc+yzm2gSiU5G1auHJgDt2rlu/pmZmbR7927avXs3AaApU6bQ7t276YjCHkV2Fk5PtApptWqi9KPaDl5aBHT+fKLJk4kuXQr9WJ9+2r3dOnWIdu8Obb9KYfEMH1g4wwx/dWjz8ogSE/3fyPr1M942O4qmxOrV2kXT4RChcYl169YRAK+lf//+imwJJ+H0JDub6JFHlJ+7atWIHnuMaM4con//VR7+VCqgmza5R1XS0kI/RitDtyye4QELZxjhL6/pKzRrtnDaWTQlBg7UJpyDB+trRzgLJ5HvykGVKxPdcouyHKkaIQ0moEOHeu//jz9CP0YrQ7csnvaHhTNM8JfX9BeaNVM4w0E0iYguXhTTpakRzZgY/UvGhbtwzpnjOj+eOUwtnY2UCKk/AZXXW5Z/Z6tXh36cVoZuWTztDQtnGOArr5mZGTg0a5ZwhotoSqgN2U6apL8N4S6cBQVES5cSrV0b3GPUW0j9CajnEhEhwqt6YFXolsXTvrBwhgGeec2NG4OHZs0QznATTaeTaPZsYaeSc1arlrjx6024C2coSEL6+uuhCen580SPPhr8O3z2WX0qUFkVumXxtCcsnDbHM6/50kvKQrNGC2e4iebRo2Isq5pztmyZMbYUZeH0JBSP1DO/6W/p2ZPo8mV9bLUidMviaT9YOG2MZ16ze3f1gmmEcIaTaEpepmdor2PHwOdLPvxEb1g4/aP3OFJpadhQnx63RNaEblk87QULp03xldecMMF64Qwn0fTlZcbHiypCRP572XoOP9EbFk7l6CmkpUvr02mIyJrQLYunfWDhtCm+xmteuUI0aJDo+GCFcIaLaPrzMvv3F7kxCX+9bPUefiIxbdo0qlevHtWtW5eFUyOSkD7+uHYBTUjQpxKRFaFbFk97wMJpQ4LVoT1wgGjAAHUCGqpwhotoBvMyPfHsZWvE8BMiolOniFq1EkJ9xx3C4xw7Np2WLiXas0efHFxR4uWXtQsnQFSsmH6l/MwO3bJ4Wg8Lp81QMr+mhCSgvsay6Smc4SCaSr1MX8hDtkYMPyEiWrhQbpfv+TirVCFq00ZEFd56i1hUA3DHHaEJp7ToVQvX7NAti6e1sHDaiGB1aH1x8KAyz1OrcIaDaKr1Mj25dIlo1CiiV18Vx2sE+/YFF85AS+nS4pi+/94Y+8KJS5eUDylSI6D/+x/R4cPa7TI7dMviaR0snDbCXx3aQMi9peHD/YdwtQinXqJ5/rzwpPUmFC/TCho10i6c8htxUWftWm3ieMMNos5uYqLIk776qu9SfqEKqJmhWxZPa2DhtAnB8pq+OHhQ/NABorg4ogsXxP995UADhXx9oYdopqe7BqkXK6ZPDVEJf16m3bxhOePHhy6cL7xg9VFYj5L8ZpkyRO3bi3W//Zbo7Fnf+zp3Tl8B3bFDXIdNmxLdeqv7Po0K3bJ4mg8Lpw1Qk9eUI/c2x471/vzAAaInnhC9CPfuVW5PqKKZny+85/Ll3W8c776rfB/+CDcvU44rXKtNOMePt/oI7MEzz3ifm7p1xTXw8cfiITQ/X90+9RBQp5OoZUvXtt26EQ0bZk7olsXTXFg4LUZLXpPIv7cZKqGK5rp18pCk+7JtW2i2hZrLtAPi3KgXzilTrLbcPpw5QzRyZHBvUguhCKivOshTp5oXumXxNA8WTovRktckCu5taiEU0TxwQJQ2C3TzP3dOm13h7GUSCfu3bBE3+7g49cLJomk+agXU09uU/4Z++828XrcsnubAwmkhWvKaRMZ4m1pFMz1d5N2iowPf/GNitD1hh6uXKRfLqlU9z4dy4WTRtBalAhpo1p0aNcQDnlm9blk8jYeF0yK05jWJ9Pc2tYimlMesUEFZqLFhQ3U2haOXGVgsXTfcMmWUCSeLpn0IJKCDB4t5SQN9lz16uB4cfYVuP/5Y39Ati6exsHBagNa8JpH+3qYW0QyUx/S3dOum3KajR0WHpnDwMpWKZUKCmNHj3DmiV14JLpxGimZ+vvaweVHHn4AqWaZOde3HV+i2b199Q7csnsbBwmkBWvOaRPp6m2pF89ix4HlMf8vTTwe3x+kU4iLygPb1MrWIpZydOwMLp9GeZqdOop127Yg2bDC2rcKKJKAxMcp/A1K+U8JX6PaGG/QN3bJ4GgMLp8lozWsS6ettavE027TRJppA8KEodvcyQxVLOdLsKL6E02jRzMz0tpsFVDtff63udyDlO+UY3euWxVN/WDhNJJS8JpF+3qbWjkBdu2oXzqVLfe/Tzl6mnmJJ5D07iqdwmpHTTE/3/x2xgKrDX0/aYIs83ylhdOiWxVNfWDhNIpS8JpF+3mYoQ04uXCB67DFtwrlzp/f+7Ohl6i2WvvDlcZrVESiQcLKAqiNQT9pgizzfKWF06JbFUz9YOE0ilLwmkT7epl61Z1euJKpcWd2NQi4wdvMyzRBLOZJwPvlkOlWsSPTRR/och7K2lX9nLKD+0eptyn978nynHCNDtyye+sDCaQKh5DWJ9PE29Z7l5Px55d6nfAynXbxMs8VSjiScVkxkrUY4WUD9E4q3Kf9dnDrle/9Ghm5ZPEPHQUQExjAyM4FmzYB//hHvhw4Fpk1Tt49Bg4DZs8XrsWOBMWPUbZ+fDzz2GPDll+J9VBSwbBnQtau6/Xhy+TJQpw5w8mTg9Ro2BPbsAT77DBg5EkhPd33Wvz/w3ntA2bKh2aKUHTuAhQuBJUuAo0e9P4+MBO6+G+jdG7jvPqBcOf1t+PvvDNSvH4eff05H6dKx+jcQgMuXgQ4dtG3btCmQmAj06qWPLadOAXFxQIkS+uxPC2fPAqVKiUUNDz/s+j2FQu/ewKefCgm75hr3z3JygOefBz780PW/G24AFi8Gbr01tHbz88Vvb+FC8T4qCli6FOjWLbT9FhmsVu7CzvPPu57s1OY1ifTxNt98Uz9PU4682LZnQXf50q0b0fTp1nuZ8+aZ61n6YskSIodD++wodlj0mKFl3TpRbSomhuiTT4yZcisY27YJG8qVI0pKUrft5Mn6nMsXXxTX37XXiplVfBFK6DY9XVz3J054f8aep3YirRbuwo7k1cTGiidFtU/Xb74png4B4a15PpUq4cAB8VcvTxMAfv0V+OAD8bpECWDjRmDfPuCJJ4C0NPd1a9QA9u51vTfbywTEreHvv13vzfAsfbF3r7AlnNmzJ/R9HDgA5OaK5YknRARg1iygWrXQ963WhvPngYQE4IcfgDvvVLbts88CffsCFy5oazsvT1xze/YAb78NnDsHPPggsGuX8MLl9OoFNG4sPt+5U3iiTz4JrF8PfPKJuLf4IisLuOsu0caNNwJ//CHuARKRkcDnn4vXCxcKm3r1Ys9TCRyqNZjjx8VF2b27uHjV8O+/Ypv8fPFjOnxYm3CePg3Mmwd07Bh6iAcQ4b5GjYCDB8X7d98FRo0Sry9cAEaMEO1JTJkCDBwoboxNmwJt2oRugxJOnBA35MmTgWPHhFAmJIhz2L27eWIpJzMTmDYtAy+9FIcnn0xH8eLmhmpzcoAZM7RtW6wY0KoV8M03wLXXhmZHfj4wZIi4JiRiYsS1NGgQ4HCEtn8l5OaKh6bVq8X70qXViadeNtx5J7Btm3j/wAPiAdvX8asN3f7vfyIMLDFrlvgdesJhWw1Y7fIy/pEmgQaIbrrJamtcyEO0t9/ue+7DlStFV/ratX2HiYzi+HGiDz4guvNOIofDPSxWooR5dgQi3DoHORyi+EVysv72/PAD0fXXu7d3991ER47o35YvsrLcJxEoXVp92DZUDh0iuuYalw3TpgVeX0nodsEC7++xRg2i3Fzf++SwrTpYOG3K3r3uN/4yZay2SJCU5LKrRAkxOXMgzMhdBRJL+dKunfG2KCHchFNaIiKIOnYUQ6vOnNHPprVrierXd28rJka0Y8b1YwfxXLHC1X50tP98p0SgXrd794pj8PUdzprlf58snsph4bQhTqd7hSFp0XPCXi1cuiQ8SMl8Oc/MAAAgAElEQVSeYGX0jESpWMqX1auts1eO3YUzMpKoVy+iJ58UXoqRIpqbS1SxoutBzHO2HbO8TzuI58iRrvZr1SK6eDHw+r4KJtSuLSI9/r7bQF4nEYunUlg4bcgLL/i+6K2u26okRGskJ06oF0tpKVcu8A3DTOwqnFFRREOGEKWmutZ3Oom2bxfXpBEi6jkesnRponvvtcb7tFo8c3KIWrRwtf/AA8qOeelS72IigZZAXicRi6cSWDhtRqCi0S+/bJ1dakO0evPTT6JdNWIpXwYONNfeQNhNOH0Jpi+MEFF5RSxpKVNGDPewIvdptXiqzXdKHDzo/ztR63USsXgGg4XTRmzdKvIb/i749u2tscsOIdpx47SLJmCPMK1nkXcrhDM/3xUaVSqYvtBDRHNzRSTA17ZlyoiOQ57Caob3abV4qs13EgXOa2rxOolYPAPBwmkTDh3yzu/4upmYHR4lsj5ESyRKkwXK3QRa7BSmJbLW4yQi+vNP4cloEUxfaBXRYGXrypQh+vVXa3reWi2eavKdV64QNWyo7jehxOskYvH0BwunDbhwwbtXob/FiCEBgfAM0e7da277co4d0yaedgrTElkvnEaiRkRbtw7+3UniefGi+d6nleKpJt85eLC2B0olXicRi6cvWDgtJjdX3ESUXuwzZphnmx1CtJ5oEU87hGnlFGbhlKNERJUskngSme99WimeSvKdvsZr6u11ErF4esLCaSFOp/qnxf79zbPPDiFaX6gRT7uFaYmKjnDKCVVE5eJptvdppXgGyndmZbkXQjDS6yRi8ZTDwmkhkyapv9Dr1jXHNqt70QbC6SR6/HFl58tuYVqioimccpxOovvuC008icz1Pq0UT3/5zvR0olKlQhPOatXUPViyeApYOC1iyRLtF7vRhRDsGKKVcDqJhg1Tfq7sFqYlYuEM1Js22FK6tLt4mul9WiWegfKdf/4phql17SpEUMs5feMNdfaweLJwWsKVK+oGLHsuRhdCsGuI1lM0HQ6i997zH7a1Y5iWiIUz1EmgIyLEg6ccs7xPq8RT6fjO8+eJ1q8XhUIGDiRq3pyoZMnA5zMuTr09WsUzJ8eaKeT0hoXTAnJyiK67TvuNw8hCCHYN0foSzc8+E5/5y3naMUxLxMLpq+iB2qVCBe/9+vM+9Z7v0yrx1DK+k0g8+O7dS/TVVy7vND7eta8GDbTZo1Y8v/9ezDtaq5a+tY6tgKcVs4hjx4AFC4Bp08TUY2po3x74+Wf9bQo0XZiVEAHDh4tzBYgpl+bOFVMhSRw/DrRrB+zf7/rf6tVAp0762JCdLeYgzcrStn1aGnDzzcAddwAZGRmIi4tDeno6Yv1NplhIycsDKlUSc2CGwv33i6mvfLF6NTB4sPiNSXTsKKbVql5d2f737gXOngVat/b9eXY20LOn+VOSjRol5rIFgFq1fM/fqZTz54E//wRuv13MzakFpVOS/fAD0KOHmEYNAN55B3juOW1t2gKrlbsoc/CgKKgNiI4Pr71GVKlS8Kdtowoh2DFEG8jT9ETueart9BCMLl1C95IAou++K9oe56ZNys9VyZJiYH/PnqI37qefEv3yiyjwH4xQvM+tW8VUXQDRxx/7X88Kz1NrPVsjCeZ5fv+9d0W05s2ts1cPWDgtRP7DHjNG/ACkcmilShFNmEDUqZPvUlpZWfra4i9Em58vim7XrUu0f7++bQZDjWhKnD8vOob884++tnhO4aR1mTu3aAvngQPuOTdJHO+/3yWO69aJh6CCgtDb85X77NiR6PBh3+tnZYm5b6V1r7kmcFjRCvHUWs/WSPyJpy/RlJZDh6y2WjssnBYh9zbj4kT1oL//dl1UXbq41s3NJdqyhWjiRKI+fYjmzNHXFn+9aPPzRQcL6f8dOujbbiC0iKaRfPpp6KLZqpU4rqIsnESi1F9Skn7iGIyLF4n+7/+UeZ++ZiYaOjTw/q0QT635TiPxFM+ICNc9ztfyzjtWW6wdFk6L8PQ2iURYSPrfpEnm2eIrRJufT/TII+4XepMm5thjN9EkEiGyUKrf1K5N9M47n1he5L0oE8z73LKFqFgx7+8uIkIM+wiEFeKpdv5OM/AUz0BLOIdrWTgtwJe3SSS8Semi2rbNHFt8hWh9iSZgTvEFO4qmhFavMzqaaNcu136KusdpJf68z2nT3EO0nss99wTPJZotnnbMdxIRrVrl+wHE1xKu4VoWTgvw5W3K85sxMeLJzWh8hWj9iaYkAEZ2GLKzaBJp9zo/+sh9Pyyc1uPL+wy2KBk/bbZ42i3fGSin6WsJ13AtC6fJ+PM2/eU3jcQzRJuT4180jX5CtLtoSrz4orqb7YMPensBLJz2wJf3GWipW1dZT22zxdMu+U61ogmEb7iWhdNkfHmbRObnNz1DtCkpwUUTIFqzRn9bwkE0N21y7yilZKldW9QT9SRU4czKskdIrjCQlUVUtary73TqVOX79RRPealAvbE636lFNI1+GDcSFk4T8edtEpmb3/QM0b7zjjLRBLzDjqFid9HUIpjSk788ryknFOFct04MVapUSZQbvHIltOMr6vjqRRtoCTY8RY6Z4mllvvPECfHwrUU0pftPuMHCaSL+vE2z85vyEG2rVkQPPaT8Ih85Uj87fInm55/rt/9Q8CeYtWqJYQzBcp2BHjBCEU75dwewgIaCv160wZZgw1PkmCmeVuU79+3TLppAeIZrWThNIpC3aWZ+0zNE262buou8Wzd97LCraAYSzDlzXDmuQD1sfeU15YQinP5mhmEBVYdnoQM1i5LhKZ5tmSWeVuU7v/+eKCEh8LjNQEu4hWtZOE3Cn7dJZF5+0zNE26SJ+gv8pptCt8OOoqlUMCX89bD1l9eUY4RwsoCqY/To0LwkJcNT5JgpnlbmO8+fF9Wx1IpouIVrWThNIJC3SWReflMe5qtQQdsNI9QhKXYTzU2biG66KVWxYM6dO5cA/LcM9Do3/vKacowUThZQZWidu1K+rFqlrk2zxNMu4zvViOgNN5hvXyiwcJpAIG/TrPymPEQrFbDWumgNq9hJNP15mHFxZyg6+gk6cMD3RI5z586l2NhYSktLoyNH0qhq1byr2yrtOGWGcLKABmbSpODzVAZbypRR/3s1SzztNr5TiYjqXV/aSFg4DSaYt2lGftNXL9qOHbXfMLQMSbGLaCoJyd500000evRon9vPnTuX4mQz/yYlETVuTPTKK8qf6v/9Vwjnli3p9McfpGpR05FLvlx3nQhPXr4sbLh40fpJvi9eNKfQhz8KCkTR+Z9/JvriCzGpwuDB4vq44QZlwyu0iJ4v8Vy7NvA2W7YQvf460cmTytuxy/hOTyQR7dzZ9TAPiHtluMDCaTBysfD0NonMyW+OG+dqQ6pF63SKsGJiIlGdOupuwlqGpMyYYb1oLlrk63gO0NChO9xEZPjw4XTXXXf53MfcuXMpIiKCqlWrRlWqVKF7772XdgWJz2ZnZ1N6ejqlp6fTokWXKTLyIolQb3pIHo+WJS5O3KSjooRH8vrr1tQ43bRJdE6rWpVozx7z2ycS1390NFH16r5v2gUFYgqzTZvchbVxYyF2DRpoT1t4iqfDISaa9sXSpa6H7x491LVj9fjOYJw9K67B77+32hJ1sHAazAMPiIu2bFlvb5PInPzm44+L/ZcoIWaC90QS0RdfFD0Gg918tQxJeeopa0WTyH3MXq1aRFOmnCcgkjZt2uS23oQJE6iun8K8W7Zsofnz51NycjIlJSVRr169qGTJkvRPgDjTmDFjyJUXffU/wbRGOKUHNPl7KwRU/iB17bXWiOf8+S4b2rQxZ6YWOVlZRLfe6rIhMtLbg5WLprTOuXPK27BLvrOw4SAiMnXm7CLGsWPAp5+KGesbNXL/jAioXBk4dQqIiREzsmudiT0QJ04IG7p2BZo29b/e+vVAu3bidd26gNMJHDjgvV737sA336iz4dQpYOZMoE0b4K671G2bnw+8/z7QpInLPi1kZor91KwJPPggcObMCVSpUgWbN29Gq1atrq43YcIEzJ8/H3v37g26T6fTiSZNmuCuu+7CBx984HOdnJwc5OTkAAAuXgSmTcvGO+9UxGOPpSM6OlbVMWzeDKSkqNrkKrGxwGuvAcOGiWXuXKCgwPX5NdcAo0YBw4cDcXHq9p2fDyxeDNxyC3DzzcHXv3wZ6NgR2LpVvL/2WuCXX8T2ZpGZCTRsCBw5It5/+KE4L2Zy5gxQpQqQlyfelyoF/Pgj0Lo1sGwZ0KePOLdy5swBBgxQ3sbhw0DjxuLaA4Bp04ChQ3Uxv+hitXIXdqSKPI0be39mRX3aQEheIUC0cKH/cO7TT5tn0/HjwjuU2k5N1W/fOTk5FBERQcuWLXP7f6BQrS8GDRpEnTt3Vry+mZ2DAJHf/uwz73zigQNEAwZ4Rxm0eKAjRohto6OJtm9Xtk16OlHLltZ6nj/95Gq/VClr8mzyVAogwsDjx/vvRKPiUruKXfOd4QoLp4GkpbknvzdudP/cqvk3fZGf7+rdW7w4UUaG++dOJ9Hu3UTLl4vwjxn8+KPo1CK/aWzYoG8bLVq0oCFDhrj9r169en47B3nidDqpWbNmNGDAAMVtmiWc/gTTk1AFNDXVvSNNzZq+0xK+sIN4PvmktSHbjAyRylH6vaoN10rYPd8ZTrBwGoj8QgVEbz05Vsy/6Y9161y2qO2AoDd5eaKXqvyhQ1r0flJetGgRRUVF0ezZsyklJYVGjBhBpUuXpsP/zW7cr18/NxEdO3YsrV69mg4ePEi7d++mAQMGUGRkJP3222+K2zRaOJUKpidaBVQeqZCWXr2U59KsFs+MDNFBSGr/ww/Na1vizTfVRRHmzFHfBuc79YOF0yDS0nwXPpa8Tivm3wyEZ5jWKo4fF0/9/m4YRoSYpk+fTtWrV6fo6Ghq0qQJbZC5tW3atKH+/ftffT9ixAiqVq0aRUdHU/ny5emee+6hzZs3q2rPKOHUKpieqBFQT29TvqgRIKvF0+qQbUaGGBeqVDi1hGuJ7De+M1xh4TQIT2/T0+u0U34zWJjWLNasISpfPvANozDkZvQWTr0E0xMlAurL25QWNflOIuvF08qQ7dKl6grOaw3XEnG+Uw9YOA3An7cp9zrtlN+0OkwbKDTLwunOO+8YL5ie+BPQ2Njgw5fU5DuJrBVPq0K2nkNOlC5awrUSnO8MDRZOA/Dnbcq9TjvlN60M0wYLzbJwunPlirihL1pkfnjfn4AGW9TkO4msFU+zQ7bffad9RhGt4VoizneGCgunzgTzNqWlXDnx1+r8ppVhWiWhWRZO+3HgAFHv3uq+N7Xem5XiaWbItnVrbaIJhBauJeJ8ZygUs24EaeFk0iQgOzv4eufPi7933mlM0QOl/PqrKE4AAAkJohCD0RQUiIH4nTqJAeBMeFG7NlC+vLptnn0W2LFD+fqxsaIQQMuW4v25c0D79sDvv6trVwuTJgHVq4vXGzYAH31kXFt9+wLFNN6F8/PVFyKRU6MG8NlnrvejRgE7d2rfX1GChVNHTp4EPv5Y3TZt2xpiimK+/tr1+sEHzWlzwADgjTfEcy4Tfhw9CsyapW6b3FxxfUnVa5RglXjGxACzZ7vev/gi8O+/xrQ1dKioLjZtmqiq5XCo237x4tDav+8+YORI8Vr6jtLTQ9tnUYCFU0eUeptyrBTOggJg6VLxunhxUZLPDH780Zx2GGN46y1xk1XLoUPAoEHqHpisEs8OHYAnnxSvr1wB/u//RAlKI6hcWQjo+vXA8eNCRGvWVLbt2rWu6JVW3noLaNFCvP73X/XfUVGEhVMntHibgPhRWoUVYVpA1NqMjzenLTsxffp01K9fH82bN7faFM1o8TblLF0KTJ6sbhurxNPMkK2EJKJ79ojawRL+PNGCAiG0oRAdDXz1lau9JUvMOdawxuoka2EhWE/aQD1srcLK3rRZWaLDSHw8dw4KJ55+WntnFvny88/q29baYSiUzj0//2xuL1s58mpCvXqJzjtt2ngP2/JVB1sLSsd3/vqr6NTUv7/55QntAgunDijtSetv8axhawZ2KXogCWjlyiyc4YCaoUOBFo/ywIrxJZ7Jyf7XX7hQ1IHt0EF7jWWrCiNkZLh63xcrRrRvn/j/iRNE770nHjpLlNB3mr5A4zsLCogmTnQfjhRsAu7CCk8rpgMvvQRMnKh9+65dgVWr9LNHCfIpxHr0AJYvN7d9T155BZgwIfh6O3YEnhotHMjIyEBcXBzS09MRG6tuWjGr2bpV5MQyM9Vvm5UlOsJcey3w00/irxYyMkSPbPmUZD//7D1t34IFQP/+rtzkihWiM4xarJx+bOJEcX8BgH79gHnzjG0vN1f09N+2Tbx/4AHRAencOdH+6tXu60+aBDz/vLE22RKrlbsw0L9/aE/fTZqYb7NdatMSicoycXHClogIojFj/IdwrfA4MzKIJkwQT9t6DBIPZ4/TLgTzPOfP9y5h98gj2tuzKmTrz+s0Es/xnSNHElWp4vv3+OijxttjR1g4deDYMaLRo4kGD/Zerr1WXGAOh/ug8apVxefPPEP0++/G2rd/P9F994kpwYjsE6aVGDvWdV4GDhT/85cDTUkxx6aMDKIvvhAlCOWVXd59N/R9s3Dqgz/x9CWagCg2kpWlvT2rQrbyXGe/fua0Kc93BloaNjTHHrvBwmkwTZqICywqyrr6tFL+sFgxorNnra9NK0fubUZGej/JSwLatCnR448bWxZMLpbFi/u+UUyZEno7LJz64SmeZcoELpa+YoX2tqyqZWuF13nmDFGNGsGFMzKSKDvbeHvsBg9HMZH1612vzRq/uX49kJYmXjudwLvvWlP0wB/vv+8acN2/P1CrlvvnJUqIfNKOHcDcueoHiAcjMxNYuBDo2VNUw3nkEZELy8nxXjc62jW2j7EHnkNVLl0KPN5Sfu2rJSZGDKWSMLIwgme7zz0nXjudwPjxxra3cSNw663A4cPB183PB/buNdYeW2K1chd2JI8zMtKa+Tc9e0GWKUNUoYI9wrTBvE2jUOJZ+lr69NGnffY49WfmTGXfYajhWiJrQrZmeJ0FBURvvaW+iL+evXrDBfY4TUQqNmBWfdr168XAbTmXLgGnT4vXZhY98EUwb1Nvtm9X5ln6w2rvnPHNggXKIwGZmaFXrrKiMILRXmdmpujdP3q0KKqgBjPqB9sNFk6TkIePzArTjh0b+HMrheDiReC998TryEhXl3ujKCgA7r5bvVhKlC4tHjQYe+E55EQJoYRrAetCtsOGAeXKiddffAH8849++548GfjhB23b7tmjnx3hAgunSRC5XpshnL68TTkREebVpvWF2d6mw+HyErTQtStQsmTodhAZV/O0qKFFNAFg5Ur1NaU9ad/evFq2EkZ6nTfeqH1b9jgZw5CEMyYGaNzY+PaCeZsOB5CXZ7wdvjDb2wTE1E3ffKNdPPXyznv2BCpUEK8PHNBnn0WR33/XJpqAPuFaQIRsa9QQrzds0FarWi1GeZ0PPyyKSLRurX7b06dFre6iBAunyZiR3wzmbQKiN5wkXmZjtrcpUaOGODdqxVOvMO2ZM0K8pQeWZs2Axx7TN+RWVDh6NDQPL9RwLeA9/dgLLxgfsjXS62zfHkhK0iagRc7rtLp3UmFH6lVr5vhNpfVEY2JCm0FeC1b1pJVz6JD7eDyzetNOmDDnv32KXrXir+gl2a+fOePzCgtOJ9GMGWJ8r5oeoHr2rpUYMsTcXrZm9LB1OkW1pNatlZ1PM8el2wH2OE3G6PymEm9TIjPTfK/TKm9TjuR5yqdtCoReYdoBAwb4/L/TCcyfD9Srxx6oUhwO4IknxPjegwdF/Vw1NYz1CtcCwNtvu/eyNTpka8a4TodDnQfKHiejK40buz/lGj1+U+3sFWZ6nXbwNiVef13Z+SldmujKFX3aPHFC2q+7x+m5sAeqnYMHxVhEJZ5oly76tWt2LVuzqwkF80Dj441t326wx2kw8qEPRuc31XibEmZ6nXbwNgHgjTeA115zvS9b1v+6evWmVQN7oNqpVUsMD1Hiia5erX7Moj/atweGDBGvA/WyJRK9eseNEzlvrZhdTSiYB5qWVsR6i1ut3IWdqlXNywNonSvRDK/TLt6mp6c5eXLgnOfSpfq1rdTj9OWB9uxJtGuXfrZcvhy87u+GDaIeq165QE/y882roCV5orfe6n5elZwHpXjWsp02zf3ztDQx2YL0+VNPif9nZWmzwYoathKSB1qtmmi/UiXz2rYDLJwGU7as64eybZtx7cgLt2tZXnnFONuIxJRcUlvSDChms3ixt2hK+BJPPcO0RNqFU75Mnx66HRs2iNKLN9/s/wHm009dbY4eHXqbnmzbJiZhbtjQ/A5qKSlEw4aJMn1xcUR16uhng6+QrdNJtGCB+70AEMXp//6bqHx58YB9+rT69qyYOUWO00n077/mPQDZBRZOg5HPa2fkxTVoUGjCWbOmcbYRuXoeRkVZ520+95xv0ZTwFE+9etNK6CGcXbuGbsekSa79Vavm/X3IRRMQ+Su9e4pOm+baf2KivvtWiry+rR6z3kjIe9m2akXUvbvv77JSJaJ581zv339ffVtWep1FGRZOBWRmirCSFho0EBd1RIS+Nnkyb577vJFqF6O9wFOniJ5/nuinn4xtJxBpaUQvvkj0zTf+1zl0SITzrrvOfWJkPQhVOBs0EPsIlbNnierX9y2enqIpLb/+Gnq7clJTiaKjxb7LlBHTWJlNSoq7wOlFRoYrhBls2brV9bpnT23tWe11FkVYOIPw0UfigixZUpunJJ+P02guXCA6fNh7ad7c9cPav9/787Q042175RUxmXe9esbOqakHTqcxY/G0CKfDQdS3L9Fff+lry8mT3uIpvwF7LsOH69s+kcjxWe113nyzy4bUVH32mZZGdPvtyoQzJcUVwi1XTtt1x16n+bBwBkH+w6pdm+jSJXXbmymc/rjzTtcx5Oaa3/7ly+7Tdy1ebL4NdkCNcBolmHI8xTPQYkS41g5e57hx+oVr/eUyAy2rV4vp7aT3e/Zoa5u9TnPh4ShBkKYCA0T39ocf1q8Le1Fhxgz3YTkTJ4qfOOONwwH07Qv8+Sfw5ZdA/frGtVWxIvDLL0DlysHXPXEC2LxZ3/arVgUGDRKvL10CpkzRd/9K6N3b9TqUMnwnT4o6xI8+Cly4oHy7w4fdi6LIJ7tXg5EzpzDesHAG4MQJ77FWK1cCzz9vjT3hyJUrorKKnN27ge+/t8Yeu2KmYMpZtUqMwVOCHvVdPRk9GoiOFq8//BA4e1b/NgJRrx5w883i9ZYtogauWpKTxff1zTfqt9VLOM0e11nUYeEMwJYtvv//3nvmTF5bGJgxwzVxtpyxY9nrBKwTTACYNQsYPFj5+kuW6D/I3W5e55Il6refNUudlynn8GGgYUNXEY4NG7SfY/Y6zYOFMwD+hBMAnn6avaZg+PI2JXbsKHrnb9GiGXA4rlx936uXNYIJqBdNwJhwLWC91xlquHbwYNdUcWo5fFhMedemjXh//ry4JrTAXqd5sHAGIJBwOp1Anz5Fc/ZzpfjzNiWKmtc5cuST+OmnUhg9WryfM8d8wQSAefPUi6aEEeFaq73OUMO1jRoB+/eLUn/SA4BSDh8Wf/UI1wLsdZoFC6cfcnOBnTsDr3PpkqhleuKEOTaFE4G8TYmi6HW2bw8kJlprw8sva9/WiHAtYC+vU0u4NjZW1MVNSQHuv1/5didPAllZ+gkne53mwMLph+Rk956g/jh2DOjWDbh82Xibwolg3qZEUfM67cB992nf1qhwrdVep169a2vXBpYuBdatE56oElJT9ctzAux1mgELpx8ChWk92bWLh6nIUeJtShRFr9NqPvxQzJ/46qvATTep337xYv1tAqz1OvXoXSunbVsRsfr00+D5Tz3znAB7nWbAwukHNcIJ8DAVOUq9TQn2Os3F4RAezuuvi9CiWhFdvNiYcK2dvE4t4VpPIiLE8QTLf/77r/irV7gWYK/TaFg4/aBWOAEepgKo8zYl2Ou0Di0ieuoU8N13xtijxOskAn79VVw3eqJXuNaTYPnP1avFXz2FU6nXeeGCGH96/nxo7RU5rC5dZEeOH1deMstzKVZM1H+VKGol9959V9t5a9bM/jVs9SI9XZTcS09Pt9oUvzidRL//TvTqq0Q33eT9fT3wgHFt+6th63QSLV/uPqfmzp36tm1E7VpP1q0T5Tuldjp1Ev8vKAi9bq2cQDVsz58X321srPi8adPQ2ipqsMfpAy3epoTTKbyuoogWb1OCvU574csTHTkSKFMGKF4cePJJ49r29DrPnAFWrACaNBFl7ZKTXev+/ru+besdrvVF27bAvn2id3WXLsD8+eL/euY5Ad9e54ULwGuvATVqAG+8AWRkiM/l55QJDgunD7QIZ926wP/+J0Is9erpblJYMGeOutymJ2++qZ8tjH5IIjplCpCZCWRnAx06GNeeZ66zYUNvwTQKo8K1nkREiOv9u++A8uVd/9czXAu45zrnzweqVXMXTEYbLJw+UCKcxYsLoVy4EDh+XDxBfvKJ64mxKCIN5tbKoUO6mMGEOURA48ZCsAH3iRaMRu/etWrRWzjz892HxVy6FPo+GSDSagPsiK8f6g03iIt6zRrgyBFRIOGtt1xjr4yESMy6kJYmwkfSE6TdeP55YevJk96frVvnKib+wAPePQyjo4HHHzfWvvPngWefFUUrevUyti1GPUSio8q4cdaGDnv3doVJlywRIWqzkMZzXrjgGs9ZTIN7c+GC6Kz4/vvsXRqC1UlWO7JoEVGbNkSDBxN98QXRsWOuz0aMcCX1v/km+L706By0YIH7hMNq+5RYPR8nEVHnzi4bzp+3xoZGjVw2HDhgjQ1E4dE5yEx8dfpRusydq789KSmu/bdqpf/+gxHK/JyenX6ULhERxhxLYYVDtfCroBwAACAASURBVD7o00eESWbOFIUNqlRxfaZ3KEUJBw+6XqemAp068VOkWvbuda8rbMWg8OnTp6N+/fpo3ry5+Y3bmFdfNS+HqYRwDddeugQ0a8Y5TDNg4VTJnXe6ci9mCee5c+7vt25l8VSLp1BKuWkzGTp0KFJSUrB9+3ZzG7Y5u3dbbYE3ZvSu9YdW4UxPD72fAaMMFk6VlCvnSrYnJ2ufh08NBw54/4/FUzl794qpu+RIOWrGet57T/QhsBNm9a71hda6tVWqANOmAZHcc8VwWDg1ID0RShVMjGb/ft//Z/FUxvjxvm8+M2ea73Uy3tStK+q6PvSQ1Za4sDJcG8p4ziFDgI0bgerVjbEtXLlw4QJGjBiBYcOGoXPnzpgzZw6ys7Px9NNPY9iwYXjkkUeQkpKieH8snBowM8+Znx94mAaLZ2B8eZsS7HXah5gYUVP1k0/EUC87EI7hWgC47TYx8UT37npaFL7k5ubiqaeewgsvvIBp06bhk08+waBBg9CnTx+MGjUK3bt3x+LFi/GRinqpLJwaMDPPeeSIEM9AsHj6x5+3KcFep31wOMTY6N9+s0fo1spwbagP5+XKiWpLU6Zw6HbGjBkYMGAA4uPjAQAlSpQAEaFGjRqoWbMmCgoKcMMNN+AhFSEPFk4NmJnn9Bem9YTF05tA3qYEe532o1EjEbrt29daO6wM1+oxP6fDIcagbtwoKgYVVcqWLYt77rnn6vsd/80O0LlzZwBAQkICUlJScMcddyjeJwunRszKcyoVToDF05Ng3qYEe532IyZG9Hy2OnRrVbhWz7q1t90mei4X1dBtv3793N6vW7cOERERaN26teZ9snBqxKw8p68etYFg8RQo8TYl2Ou0J1LodutW60K34RyulcOhWxe//PILmjZtipiYGM37YOHUiFl5TjUep4QknllZ+tsTLij1NiXY67Qvt97qP3RrdO1VK8O1ej+cBwrdGjExuR25cOEC9uzZg7bykwtg1qxZqvbDwqkRs/Kcaj1Oia1bgWXL9LUlXFDjbUqw12lv5KHbiAjX/80oAO8vXFtQIARt6FCgaVPg3Xf1bVePPKcvpNBtly767M/OnDlzBi1atMC4ceMAAKtXr4bT6USLFi3c1tm8ebOq/RZxpz002rYVoinlOfXOIQQbihKIa68V8xcWRdR6mxIzZ4q5IOUlFsOV3FwhMv6uH6dTeCBS1EROsWJAt27Gz/STlyfChr5s8IUUuq1bV0wUEBEhps0Khfx8sZ9ANvTuDYwZI14vXixmbvn6a2DpUnfh3rcPGDVK+fHIbShWzLuYu5TnXLHClee85RZ1+/ZHuXLAt9+KeVXnzQPuvVef/dqNDRs2YPv27ejSpQuysrLw1VdfIT4+Hpf+C1VcvnwZw4cPx9sqJxIOSTiJCJmZmaHsIqyRPbTgxx/dQysSBQXiL5H6vOPBg8GHosiJihLzJPbsCSQkAHFxok35PjIyxHpm42mD3GvQk3/+EZ6JFnJzxcTN77yjr005OTnIycm5+l76zWQYmIj+7DPgmWe0bz99urj+ypTRzSQ3fv8d6NFDTKi8Zo26vFuTJsC//7reaz2N//wjBKN8eeCXX4ASJXyvV6mSCG2mpopITrt2vteLiRHzlarhyBGRVildWnivnmm3li2FcALADz+I86Un77zjut7DpV9ETEwMHAqfTjp16oSBAwfi9OnTeOKJJzBx4kRkZGTgpZdewoYNG5Cbm4vExERUU9nt2EFEpMV4QPzw4+LitG7OMAzDMKpIT09HbGyspTaEJJyBPM6MjAxUrVoVR48eVX2QzZs3V10IO9A2v/wCxMaKmQP0bqd1a+CPP8Trw4e95+fcuxf48MNcLFjQA0ePLlJ1LurUmYQzZ17w+n9UFFCrlggNAcArr4i5MH3ZBwjPYfp08XTdoUPwY/LHlSvi6ffee4GOHdWduyNHgHffzcXnnz+Co0dnqzoPar6nb78F+vXTng9q00bMCakm3BbMPk+PMy0tDS1atEBKSgqqqIgLqzkPBQVA8+buM+uo4bXXxNylalBj32uvibkiAWDJksu4++7ShrQTaJu33gImTpRsAO6+W3QQmzJFXANnzqhqAv36iVqxauz78EPx+wWAGTOu4KGHSrl97nQCNWsCFy+Ke8u//7pCunrfJ/XeTu02SjVDjcdpFCGFah0OR9AbYGxsrGrhjIiI0G2bmTOBJ54Qr4cNEz9W6cLTo50OHVzCuWePd56zRQtg+vQMLFiwSfW5iIrKBiDWj44WIZ3evUUbFy+6wjarVomphPwdU+PGQKBOY0rPw223iQeBEiWAihVvVXUsDRsCH3yQgc8/X6P6PKj5nh5+GLjnHuC227pj5cqVitsAgO7dE7Bu3Q+qc1RariNA3ACMOg+AmBD60UdVm4WIiIt47rlrvMKGwbdTbp98bGapUhGIjVUunHrdH+Sh2VKlxMP13XcD27ap2vVVGjQQ+1Bjn9yGkiUjERtbymudtm3FA+uFCyJcLOU59bxPGrGd1ra0aIbZ2LJz0NChQ3XbRt5Zato0kdeYPx+oUEGfdtq2BaZOFa/Xr9e3g1BiYk1UqCCeOqWcpURcnBDlbduEYP/zj+g0oee580Tqip+dDRw9+iXefx8YPlx9Zwi1qD2m664DRo3qhAYN1LUzalRXTcei5ZxrQW07ffsCo0ZdwOnTZYOvLKNLl78RE9NK1TaAfc+Dmm2uu071rq9Sp466tpQiCScg7jGScBp5HvTYzqzrwRKMmiHbLrPcv/mm92zn8fFEGzbos/9z54gcDrHfxo19r2PUuZg82XVM48frumufxMd7n8sePcSs80qwyzVhNUePHiUAdPToUcPbWrDA+zsLtJQrR5SRYbhZ9MILrja///6S8Q36YNw4uQ3if6dOETVooO6cScuePeptkP+GP//8ss91kpNd6/TsGcIB25xwuj8YNo6zePHiGDNmDIpbPNWBr956J06InnFvvhn62Cgl4zmNOhcPPOB6bUZVE189LFesEL0clYS37HJNWI10/Gach759RSRCKc89592z02iirOjm7YcKFUSfCLXRCgCoXTu0tv2dB6PGc9qNcLo/GCqcY8eOte1JcDqBl18WIdDTp0PbV7C6tUadi+rVXUNipHCtFRw+LDpJvf++OAf+sPs1YRZmCmdEhOiIo4Ry5UIfF6mF6Oho8xsNgBbxjI8XQ0pCwZ9w6lm31s6E0/2hyFcOWrNGdJ5JStK+DzPn5/TkwQddr82upSknLw8YMQK4/35jZ4th1KPU67TC27QrasXT6Fq6Vt5jGG+KvHACoYduzZyf0xOzw7XBUBO6ZcxBiddplbdpZ9SIp9QxyChYOO0FC+d/hBK6NXN+Tk/sEq6VozR0y5hHMK+TvU3fKBVPoz3OopLnDBdYOD3QGro1a35OX9glXCuHQ7f2IpDXyd5mYJSIp9EeZ1HJc4YLIQvnsmXL0KlTJ1x33XVwOBxITk4Ous1nn30Gh8PhtWRnZ4dqji5Iodvly5Vv4y+UouX8qMVu4Vo5K1YAt96ag/R0/+uMHTvW61qoVKmSeUYWEfx5nUZ6mx999BFq1qyJEiVKoGnTpvg1wFOlne8LwcRTi8eZlJSE2bNnX32/LUh+I9zDtUlJSejWrRvi4+PhcDiwQhqc6of169f7vB727t1rksX+CVk4L1++jDvuuANvqZyTKTY2FmlpaW5LCX9Vli3A6QQWLVK+vr88p9bzowY7hmvlpKYWx/r1VwKu06BBA7dr4Q+pHBOjG768zrg447zNr776CiNGjMDLL7+M3bt3484770RCQgJSU1P9bmPn+0Ig8dQyFOXy5cuIj49XvH64C+fly5fRqFEjTJs2TdV2+/btc7sebrBqVnMZIVcO6tevHwDg8OHDqrazu1dRqxbw0kvK15fynMnJrjxn2bLaz49aHnzQ1SHn669FvtYuREV9hWPHMgAM9rtOZGSkra+HwkLfvkIoL14U7/v3N87bnDJlCgYOHIhBgwYBAKZOnYoff/wRH3/8MYCJPrex+31BEs877nDNlVu8uLahKAkJCUhJAX7+Wdn6Up7zwgVXntNzKrK0NDF2vXx59fYYTUJCAhISElRvV6FCBVxzzTUGWKQdy3Kcly5dQvXq1XH99deja9eu2L17t1WmuFGrFjBnjqjJKnX4UYqVeU47hmt79AB27QISEhZi27aNAdfdv38/4uPjUbNmTfTt2xf/yueNKiRMnz4d9evXR/PmzS2zISLCNbdk6dJiGjUjyM3Nxc6dO9Gx4z3IysLVpX37e/HrrzuQl+daNydHfJabG4HMzHxUrVoXVarUttV9QU6FCsCmTa4Hjnr1zGnXV57z6FFgwQJg0CCRZ42PB6pWBXbsMMcmM2jcuDEqV66MDh06YN26dVabI9CrBNGhQ4cIAO3evTvoulu2bKH58+dTcnIyJSUlUa9evahkyZL0zz//6GXOVSZNUlYuq1YtojlziHJztbe1YoVrfyNHun+m5vxopUULV/v79um//7p1lZ3Lzp2v0K5dru0GDx5M99xzj9/9fv/997RkyRL6/fffae3atdSmTRuqWLEinT17Vv+DsAF2KC126RJRfr5x+z9+/DgBtalChWxN5esAoooVd1GJEqUNuS8Q+S65p4bMTKJly4jy8rTbIC+59/zzvwVdf8wY1/rXXef/3H36qXabzAAALV++POA6e/fupZkzZ9LOnTtp8+bNNGTIEHI4HLRBr3qpIaDK4/ziiy9QpkyZq0ugRH8gWrZsiUcffRSNGjXCnXfeicWLF6Nu3br48MMPNe1PDxYuBAYMCG2S55MnvwYg+om//36y5vOjFXv0rk3B7NkX0bix6z9EFHAaoISEBPTq1QsNGzZEx44d8d133wEAPv/8c6ONLbKULm3cZOIu2uH0ae1VYE6daoxatVpael8IRJkyYtJ4NZNwq8XToxw3zvXZ2bP+t1MbLbMjN954IwYPHowmTZqgVatW+Oijj3Dvvfdi8uTJVpumLlTbvXt3JCcnX12aeU5wqdWIYsXQvHlz7N+/X5f9KaFWLfcplyZMCH2fDz/cGfXqiRgUUSPUrq3P+VGKVeHajh0voWZNab7J+li82L0j0OnTp1GxYkXF+ytdujQaNmzo93o4fFjMpXjihEaDGcO57rrrUKzYj4iMLNC8j1atgFatapp6X7ALGzYAN94IVKsm5vmcPVv53KolShQO4fRFy5YtbXE9qBLOmJgY1KlT5+pSsmRJXYwgIiQnJ6Ny5cq67E+OZxlMeQ5z1ixAmkd41Spg587Q2oqJiUGnTuIJm8iBHTtc5+feeysDyEViYjVcuhRaO/4wunet57mUcphr15bB1Kkuz2Ly5NJXCx/k5uZiw4YNuP322xW3k5OTg7///tvv9dCwIZCYKL67Nm2AGTNCrzfM6Et0dDSaNauMm27SHnUZM4awZ48x9wW7M3my9t9vs2bev9XCwu7du21xPYTcOej8+fNITk5GSkoKANF1ODk5GSdPnry6zmOPPYbExMSr78eNG4cff/wR//77L5KTkzFw4EAkJyfjySefDNUcL3r0EMn7m292CaYUki1e3L3nrDwMohXPLuPnz5/Hli17kJISDSAKq1eXQ40aefjgg4uGVP/o3dv1Wm+vc/hwMV+hJJjLl+NqSLZbN9fr48cr4eWXt+DPP//E448/jlKlSuHhhx++up8OHTq4dUl/7rnnsGHDBhw6dAi//fYbHnjgAWRkZKB///4+7cjNdb1OSgKGDAEqVxaTirOI2odRo0Zh797HNXmdt9xyGYsWGXdfsAOXLl3C8ePHr74/ffo0kpOTkZqa6vY7Vksr9VOpmsKlS5euRisB4NChQ1ePFwASExPx2GOPXV1/6tSpWLFiBfbv34+//voLiYmJWLp0KYbZoVpHqEnSuXPnEgCvZcyYMVfXadOmDfXv3//q+xEjRlC1atUoOjqaypcvT/fccw9t3rw5VFM0kZ1NVKWKK6m+Y0do+/Ocn9N1fnK9EvjNmxNt2qTPcUgcPuzaf6NG+u47GN9842o7MnIPRUcXp7vuuov++OMPt/WqV6/udn306dOHKleuTFFRURQfH0/3338//fXXX37b6dMncKeSYsWI2rcn+vhjMb+i3bBD5yCzmD59OsXEzFXdMSgurrfh94VQOweFyrp16wgYJTvuXgTg6r1y5EhtnaqWLTP/WJQgjtdbK6Tj7d+/P7Vp0+bq+m+//TbVrl2bSpQoQWXLlqXWrVvTd999Z43xHujWqzacmT7dddF16xb6/m69VezL4XBN8nzTTf4v9L59iY4cCb1dCaN71/rD6RQPC1LbK1ca08769cpvInYU0aIknEREx44RRUcr/85atRLXktFYLZxE7r1qv/7a/bP8fKLu3dULZ1qaNcdSlOBatQAGDtQ31+lrPGegyiKLFomOAK+9Bl3yn0aGawPhcABjx7rejx2Lq7lOPWndGlDa18jpFAPWpXBu+/bAvHnG2MX4pkoV4H//U77+2LGuKlxFmYgI0du/SRPl29SoAdi4fkShgYUT+uc6fZXGqlEj8DbZ2cAbbwgBnTcvtNkPrBJOwD3XuWsX8O23+rcREeHeg1gpTiewbp2olvPll/rbxfhn9GhlHVZatQLuvtt4e8KF0qXFw/z11ytb3675zcIGC+d/6Ol1+qpbG0w4JU6cEDf2li2BzZu1tW9l7VqzvM5QOk8AYgweYx5KvU72Nr2Jjwe++07ZNcvCaQ4snP+hp9fpa35OpcIpsX27qIf50ENiELRaCrvXqSZc60liorDRbIiA1avFnK+A+I6LEsG8TvY2/XPLLcDixd61aT1h4TQHFk4ZenqdnnlOtcIpsWiR+DFcvqxuOytr15rhdWoN1yYmimIXZno1kmC2aiVEU4okLFhgng12IJjXyd5mYBISgEBFlEqUEALLGA8Lpww9vU7PPKdW4QSAc+fcxy4qoUYNa6caM8PrVBuuNVs0PQXzt9/cP8/J8b1dYcaf18nepjKeekpMEO+Lwlz4wG6wcHqgl9fpmee89lptUw9VrAgsWyamE1KLleFaM7xONeHaUaPME81gglmU8ed1srepnMmTge7dvf/PYVrzYOH0QC+v0zPPefGieq/z4YeBv/5y5cTUYvVUY0Z7nWrCtZs2ARkZ+rbvCQumMkaPdi8w36ABe5tq8DdM5bbbrLGnKMLC6QO9vE6tec6KFUU5uy++EJ6qVqwO15rhdQYL10rllH/7DejcGUhP17d9gAVTLVWqiGiBxAsvsLepFmmYirxcOHuc5mHghDjhi+R1Dh0q3o8bB6xcqX4/bdsCU6eK10rznFFRwE8/idq6etC7N7Btm3j99dfAyy/rs1+lSF7n7t0ur1PPHq1SuPbUKe/PEhOBPn2Ajh3FFExbtwrxXL0aiIsLvW0icfMaP94+PWRTU8VDWvfuromWfUFkrVgtXSq+m3r1AFl5Ut0hEmN2//7b+7OkJNfrefO8h385HKJghry/gp2Ijwd+/FFMOXbPPeI9YxJWly6yK3rUsPWsW/vOO/7LZJUo4Xp97736lRw7dMi62rUS8hq2zZvrv/+hQ73PZ2Ki6xzu2eM+6W+nTvq0W6+etlqigCi599BD+pbcy8sjql1btFG/vv8Sg0uXEsXHEyUkmFPazhc7dxJdfz1Ru3ZEWVnGtfPtt1q/I7FERoqSgUbxyiuutubONa4dRl84VOsHPXKd5coBzZuL1+np/j3Ohx8G/vjDVSrru+/EE7Ae1KjhCuGkpemzT7V06+bKx/w3iY6ueIZrPXvP3nIL8PPPYmYXQHj/2dmhtel0ipl2QiEvL7TtPdmwwTVnY0oK0K6d90wxS5aICc9PnAB++MGamWSIRDTn2DFRycnI6zLUQhfFigGlSuljiy82bXK9/m+SECYcsFq5g5GTQ9SvH9Gzzwov0Ez08Dr37CF67DGiH38k2r7d/Wm2YkWi5ctd665c6fosLk6/J919+4QNkycTVaggvJLZs4kuXtRn/0o4dIiof3+ixYv133d+PlHbtkQREUSvvebfi/r7b6IBA4jmz9en3VGjiKKi7ONxPvGEd1tyz/Prr8U5kj578kldm1fM6tUuG26+maigwLi2nE6iZs20e5xDhxpnGxFRtWqutmbNMrYtRj9sL5zym0HZskQffWSugOo5c0puLtGNN4p9PfQQ0dmz3us8+qgxIVsios6d3W8K0dFEXbsSzZtnrogagdNpzTGkpxONHy+uTSuFMy+PqHx53+3Vry9uynLRHDDAWMHyh9NJ1LKlyw7PGUGMQGu4Njqa6OhR4+zKyHClcsw6F4w+2F44fc1Jd/315gmo3vN1ZmcTHT/u//Nz54gqVXK199lnobUn54MPAt8kCouIWoE6AdVfOH/6SbkgWCWaROZ6mxJavU6jvc0ffnBvj4UzfLC9cG7a5P/CNktA9Z6vMxhGhWyvXCEqWVLZkzaLqDaUCaj+wukrTOtr6dvXOtG0wtuUUOt1Gu1tEhG9+CILZ7hie+HMyAh+kRstoHp7nUowKmTbt6/6GwiLqHrS04kmTCAqV8544QwUpvVcAvW2NRorvE0JtV6n0d4mEdFtt7Fwhiu2F04iolq1lF3sRgqo2V6nUSHbpUvVCaeniE6dqo8dRQXfAqqvcKoJ01olnlZ6mxJKvU4zvM2MDPecMwtneBEWw1Gk0nXBOHZMFEGuUwf4+GN9i2jrOXOKEsqVA2bOdL1/5hng+PHQ95uQoK1mLiAKzQeanYHxJjZWDGs6dAjo1m0rIiIuXv2sfHl92lBbTtHfUBUjWbNGFKAARHGP++83r22JLl2Apk2Drzd4sPKJo7WyaRNQUGBsG4xxhIVwqp0qRy6gS5boY4OeM6copVs34NFHxev0dFEcmyi0fZYsGVrlnuHDQ2u/qBIbC6xc2RLnz1+D8ePF/55+OvT95ueLSQDUIonnuXOh2xAMIvfSi2PGBJ9X0ggcDqBr18DrREeLWrpGI01wz4QnYSGcSj1OT44dE2W9Ll4Mvq4SzPY6gf9v78zDoyizvv3rEEgCJBESIMomrwIGBwk7wxJkEQRERZZREBFZVBRHP8dt3EB5ZdEBEeKAooCKCwgvi4DO4IZy4YKELQq4AQMiYZEkBAghfb4/nimqulPdXXtVd5/7uupKeqt6equ7zznPAsyeLU+MsG6dNRMj6F2OS2LKFBanWdLSZGHWrWt+f59/Dhw9auyx338vMjN244VoU2LfvvC3OxFtAizOaCcqxGlmcdbmzQMnQjaDG1GnHSlbI+naKVOcn+eWiYyZVW8SE7WlLs3glWgTEKWGVatC3+5UtFlSAmzZIv7Xuiwe4y2iQpxNmhibOuvaa8Uv8qQk69riRtRpdcpWb7qWpelNjKZp27QBpk0Tq+UYXbJOK16KNjdskLNPtWtXvt2paFNZ37zsMvuPx1hPVIgzIUFf1FmlCjB1qpjz1aoOGBJuRJ2A9Slbrenayy8HHnzQ3LEYe9CTppVk+dNP4sfeI4+IH6R24qVoEwiMzidMCLwtMdGZaBMITNOyOKOTqBAnoF2c9euLiaMffdS+L6kbUafVKVut6dqffgJuvNH8pOiM9bzwQvjb1WRp5YmaSCwVF6p3rpeizXPngJUrxf+pqeLHr/QdBsT3wYloE2BxxgJRI06tHYQefhjo1s3etrgVdVqZso2Urh03ThbrRx+xPL3I559Xvs5uWSqZPVvUSBs2BO69V3TGk/BatKlM0w4cKD7/Uu/mKlWAmTOdaYeyvtmihfnVWxiXcHsgqVbCTb2XkCD/n5JCtGuX/e1xYzYhImsnRgg1GcKUKeL2L74gqlFDvr5vX3vXTowXiorEBAhFReYmQOjVS7wvdesSTZ1K9NNPFjVQI4MHV5444J57xOQBbs4SpMbtt8vtWblSvv7334lOnbL32MeOEeXkiPOU8lzl8wVO8u7zyfdRbj17Or8yFBMeH5HZkYHOUFIiuvIHU78+8O67wOLFwIIF4roWLYBvvjE+0F8rL78s1hUExK/Y1avtPZ7EmjXA9deL/9PTgYKCwLSTVs6cETXg0lL5uuCOQF9+KTpZSffp21ekvJKTjbefSKw96Pcb30f9+qIXZDRSXFyM9PR0FBUVIU3tQ62DigoRMbnBkCHA8uWVr69WDahVCzhyRFxetkzc1y3OnRO9V0+eFGnawkJzn1+9rFwJDBpkbh/5+UBOjjXtYSzAbXPrIXjqvWuvJTp6VNx2+jRRy5bybbffbu2xf/yR6PXXiUpL5evcijqJAuey7d/f+Fy2I0dWjjSDsTryzMkxPu2ftNWta93k905jVcTpNsERp9pWuzbR/v3utnPtWrk9w4c7f/wTJ4jS0ox/1ps0EUsSMt4hqsQ5bpz4IFWpIlJTwemfH34IPMEvXGjNccvK5HklExOJ/vIXkeY8fdr5OWwlrErZHjlC9Ne/Er3zTvj7WSnP5GTz4gSI/vUvY8d3m3gSZ3AK1w1CpWmd5MknjX/OX3vNnTYzoYkqcf7xB9G8eUTbtoW+z1tvyR84q+qdRUXqH+gaNYiGDg2cwNvJqNOu5cdCYZU8n33WvDTr14/euk+8idNNgZaVEV10kTh+aqp7Nfrjx4mqV+doM1aIKnFqRYpMAbEShBXFf63pxXbtRCTqFFalbLVilTzHjjUnzrw865+b3cydO5eys7OpWbNmcSlOaatenejbb51po9tpWiWdO3O0GSvEpDjtqHe+8or2D3tKilj3Ukrn2oldy4+Fwwp5Br9H8RJtEsVvxKncZs92po1eSNNKtG3L0WasEJPiJCLavdvaeufRo5XXz9Oy1aghJPrJJ5Y8LVWcTtkSWSPP4PcolqNNJfEuztxcopIS+9vnlTQtkfr6mxxtRi9RMwGCXpo3B+bPly9PmCCGbRglMxPo2VP/40pLxXCZnj2Bb781fvxw2LH8WCS6dgU+CyPUTgAAIABJREFU/NDcJAnB75EWMjOBO+7Q9xjGG/h8YqjTxx87M/A/eNIDJ4egBKOcn1bLMKomTYCRI+1tE2OcmBUnAIwYIWbAAcSYxWHDAscs6sXoclwSdo63s2P5sUhYIU/le6SFY8eAXr2Af//b/h8HjHXUqSM+K1OmiHlhnUA5N+2wYc4cMxTKafa0LLDw+ONA1aq2NYcxi9shr91YWe80mq4FiGbOtO45hcKNlC2R+bSt0Xpn585iSIrdHaIk/viDaNIkoubNxRAeo8RbqjY3l+jQIWfb5qU0LRFRx47y67F7d/hxnZdeyrVNrxPz4iSytt55zTXelKaE071sJczKU0u98447RC9ppwUqCTM9PfC4x44Z21+8iNPnI3riCaLycufbpuxNO2KE88dXoqxvtmghrgs3rnPBAnfby0QmLsRJZN34Tj29awGiBx6w9nlEwo1ethJm5al8j4I3qSdtRQXRe+85I9BQwpQ2o1FUPIizTh2ijz5yr21e6k27fr3clgkTxHXHj6tHnRxtRgdxI04ia8Z36k3XOjmbkIRbKVsi8/JUvkfKLbgnrZ0CjSRMFqcglDi7d3c+NavEa2naRx6RX5ulS+Xr1aJOjjajg7gSp1X1Tr3pWidnE5JwK2VLZE6eavXOcOM2zQjU7/fT008/TRdffDElJydTly4DaMKEIxGFKW8XEwCqV6+ertcnVsTZtWvg6+FmalaJl9K0RIH1zSNH5OuPHw+cfrJOHY42o4W4EieRNfXOSOla5dJBANGAAZY/jYi4mbIlMifP4PdIy7hNIwKdNm0apaam0htvrKYJE36nqlVP6fpBlJ9/hA4fPkyFhYW6XptYEWfz5vJrkZbmXGq2ooLo738nuv56ojlziH77LfB2L6Vp1eqbSgYNktv62GPOt48xRtyJk8h8vTNcunbmTJEqrVo18PqvvrLnuYTDzZQtkTl5rlhBVLMm0dVX65slSKtA/X4/1a3bjHr3/kJHhMmpWiWzZonvQYMGzs4/u3t35Ug3N1dIdN8+b6Vp1eqbSkpKxGf8hhvcX7OU0U5cipPIfL1TLV2r7D27enWgXBs0cCeFpUzZDh7s/PGD5alnvlAzJ5JwAr3tNqK5cw8TcN6QMM1uPt9J18R54gTRU0+J6dwGDXIvrfrJJyJiHTBA//u8f3+411b+/6abwu9n506xyPY114i6qB0o65vvvVf59l9/FfNg5+aK6JSJDuJWnMG1tFGj9D0+OF2rNuRk+fLA+wwfbu5E5fcLIW/eTHTypLbHKFO2desaP7YZlPKsWZPo/Hnnjq0mUJ+PqGPH465IU2wi4jxwwDlxSsIM7sn5+++ONeECGzaITI/Uhp9/1vf4igqipCQtP1DkSDQ4nXv2rJCmdN8dO6x7fkpC1TclhgyRb9+82Z42MNZjuzg/+ECcuDt1IvrwQ28Vv83UO0+eFF3HExOJXnwx9P1mzgz8FWxGnjfdFHhiuOgi8Wv1xhuJ7r9ftGPlSrHsmlKs+fki2nz3XWPHtYJvvhFLsC1e7M7x33jjLUpKGklVqiynatXuo4ULvyag0JQAW7cmat/+PFWtuoUaNfqNOnYk1a1Dhwpq1678wta27XFdEefu3USHDxt73qGEmZgoeg47TbA0hwwxth+1TIIWib78svj+Pf64fFtOjj2Rd6T65o4dchvq1SMqLbW+DYw92C7O4A947dpEY8aIjgRekKiZemdZGZGWfiHBNU+j8mzfXt/JQk2sX3+t/7ixQHFxMf34448Xtl27dhEAmjPnJ+rQwZg4pRpn79696a677tLcFj01zpdflr83v/6q/fmGE+a4cfr2ZRXB0rzhBuMp0htuMP6DZ+TIwIXpw63va4ZI9U1ltDlrlj1tYOzBdnHecUfoD7BXJGrH+p3BWCHPrVsr99g1sq1da/3zizb8fj9lZWXR9OnTye8nWreOqH37Ct3iPHv2LNWvX58mT56s+dhaxfnNN4GfmTFjIu/bi8IkslaaREQPPmj885+ZKf+v423TTajxm0SB0WZWlrNr+DLmsV2cP/2k7cPspkTtWL9TDSvkaeaEEepLHK9MmzaN0tPTacWKFbRz5066+eZbqFat4dS2rbZOQ2vWfEfXXXcdpaam0r59+zQfV4s4//hDlAKC5ReqHuhVYRJZL00ionnzjH32GzWS/8/JsfdcE66+ydFmdGO7OImI2rTR9+F2Q6JWr98ZCrPyPHlSDJQ2Ks0OHdwfoO4VpAkQsrKyKCkpiXJzc2nnzp0XItBIKdx69VrTTTfdRAUFBbqOG0mcfn/g+D7lFhx1elmYRPZIU9qv3s9+mzZyxsbOFC1R+PomR5vRjyPinDrV+Ik+I4NozRonWmndfLaRMCtPo7+2q1Uj0nmOj2siCdSucZyzZ4d+D6Wo0+vCJLJPmkThh6Sobd26Bfa3sDNFSxS+vsnRZvTjiDi1pmtDbb17O9FKgRP1TiJz8iwvN7YM17Rp9jyXWEdNoFWrGh93F06cwXVNta11a28Lk8heaRJpH5ICiLlzH3pIvmx3ipYodH2To83YwBFxEulP1yo3tYHDduFUvZPInDz1pqo4RWseSaAjR5pL5YcSp1pdM9LmNWES2S9NCS1DUrp3F+OInehFqyRUfZOjzdjAMXEaTdfOn+9UC2WcqncSmZOnni75M2Y4O9E7Exo1cYara6ptPp/3hEnknDSJIn/+u3cXE4AoJzqwO0VLFLq+ydFm7OCYOI2ka92QpoRT9U4i4/LcuzdyWk+53Xij8YH0jHWoiTNcXTNUpKl3xh27cVKaROF7mHfvLsoswRMdONHZMFR9k6PN2MExcRLpS9e6KU0Jp+qdRMblGWl4Su3alS+//TZHn24SLE4tdU21Tcu4TqdwWppEoTvJSdLcssX5FC2Ren2To83YwlFxak3X9ujhjRO7k/VOImPy/OOPwAHdyk3qRfv++5WHsHD06R5KcRqpa3ot6nRDmtJxQ0kzeC5aJ1K0Emr1TY42YwtHxaknXTtxojfk6WS9k8iYPP/5T/XXUNmL9uhRor/8haNPLyCJ8+TJIrruOmPS9ErU6ZY0iSoPSenWTc4K2Z2iPXtWfbk7tfomR5uxh6PiJAqfrr399sAJ0b0iTyfrnUT65ak2PCVUL1qno8/ycvGD6cMPxSoVf/0r0ejRRN99Z8/xvMzcuXMpOzubmjVrRgBo/PgiU9KUos5ffnHn+bgpTSIxJCU5WRy7QQNZmnanaDdsEN/P5GSRHZs8mejzz4VI1eqbHG3GHo6LM1S6VqppLlrkTXk6We8k0i9PZdoq0kQHVkefwXK87z6i/v2JmjYVJy6197trV/3HiRWkiDMtzbw4rc6CFBaK9SmHDRM9UkPhtjQlfvxRyEiK/pxI0SqjWeWWnBw4pd+SJRxtxiqOi1MtXRvcEciL8nS63kmkX54PP0x08cVEb7yhbf9Go89Zs8SkFD17hpdjuM3oclKxgCTOiROLqFo1ccLNyBDvhd6ta1dtK/RoRdnZrE0bdXl6RZpqONGLdskSbZ/x5OTA79fzz1vfFsYdHBcnUeDyWKF6z1opz/PniW67TZzsX31VpG6MfNGdrncSWbckWSj0Rp8ff2w+QgKcndTCa+hZVsxJ/P7AiElNnl6WplO9aH/5xdhnPimJqF8/b3ToYszhijh37RIR28qV4e9nlTylNQ2VW2KiiCBHjBCTA3z4obY6n9P1TiL75UmkPfrcudO8NFNS7E91exmvivOrr9TfL0meXpamk71o/X6x8LTRz//Eifa1jXEGV8SpByvkuWmT9g913boiMn3wQaLFi9WjU6frnUTOyFNr9Pn66/IveyNbPKdpibwrznBjgps2lTvieE2aRM5PdHDjjcY//6tX29s2xn48L04ia+TZt6/xD3piohiblZ8v9uVGvZPIGXkSaYs+P/hAdEIy8nrGc5qWyJviVEvThtq8Jk03JjqYPt3YZ//JJ+1vG2M/USFOIvPytCLFOHasvL/geueiRdY/ZzWckqeW6NOIPBMSxEnnP/+xvs3RghfFGSpNG7ylp3tr4gy3JjrYuFH/+WP4cPc7OTLWEDXiJDIvz6FDzYlz1arA/SnrndWrO7fWpVPyJIocfZqJPDt3JnrxxfiTqBfFGWnqRuUWqretG7gxFy2RyDrp6U3epQvRmTPOtI2xn6gSJ5E5eZqJOu++W32fbtQ7iZyVZ6To04w841GiXhOnnjStl+Tp1ly0Eu3aaXutLrtMfIeY2CHqxElkTp5Gos6cnNC/FoPrnaNHW/c8I+GkPInCR59a5JmSQvTtt0STJhFdeWX8StRr4tSapvWSPN2ci1Zi4sTIr1GtWqKsw8QWUSlOIuPy1Bt1pqaK5bvC4Va9k8h5eYaLPtesCS/P4N60BQXOSnTzZiH6zp3dPZl5TZx60rTBW7du7tTt3ErRKnn77fCvTWIi0WefOd8uxn6iVpxExuWpJ+rUOguPW/VOIuflSRQ6+nzzzdDyDNeb9vvvRdRgh0Q3bya69trAfT30kLnnbwYvidNImla5JSQ4PybX7RStRKSJEBYvdqddjP1EtTiJjMlTT9TZsiXRDz9oa4tb9U4id+QZKvp86KHK8tQz6YFVElUTprQpFxh2iuBJ3r0gTqNpWkAsh7ZggbPt9UKKViLcRAiPPupeuxj7iXpxEhmTZ6SoU7m/GjVERBkJN+udRO7Ik0g9+uzUKVCeRic9MCLRcMJ0U5wSXoo49aZpL71U/DD65pv4TdEqUZsIoU0bHnYS68SEOIn0yzNc1JmaSrRunYgaldePGxd5dQM3651E7slTLfqsWVPI0+ezptajRaIXXaRNACxO8f2oW9f7spTwSopWyTPPBL5WVasSnTjhdqsYu4kZcRLpl2eoqPPdd8Xtp06JWYGUt2lJ3bpZ7yRyT55E6tFnnz7WD5rXIlEWZ3jWrvWOLE+cEDXw339Xv91LKVol//d/ga/bs8+63SLGCWJKnET65KkWdaqN11y4MHByay2pWzfrnUTuytPq9T5DoSUly+IMzYwZga9J48buRZbXXCNnDBYtqnx8r6VoJfLz5XZlZPB6m/FCzImTSJ88lVFnuPGau3bpS90G1zvdOFEHy9PpVRnUos/777dm323aGBOmtCUmih9Abmw1a7ojzvJysSzcnXcSNW8ultobPFj8+Ni0yVlZLl0q3sMhQ4QElRPIA0QDBhAdOiTua1eKdssWog4dxNy7Rn9UDhkit3nWLP2P/+knUaPv319ejJvxPj4iIsQgixcDo0eLjzQATJwIzJ4N+HyB9/v5Z6B3b6BqVWDdOuDyy0Pvs7QUuPdeYNEi+bqWLYGlS4Errqh8/z17gLZtxeMaNwaefx7IywMaNgQyMow9r9xc4KabtN9/zRpg8GCgvByoUwc4cqTya2Anx46J1+y998Tl6tWBkhIgIcH4PsvLgWrVrGmfOxQDSMeBA0Vo2DDN1iOdPw9s3Cg+oytWAEePBt7+++9AvXq2NiGAwkLgnnuA99+Xr9u8Gfjznyvf96KLxHfmxReBggJx3eTJwFNPmW/Hli3ANdcAJ0+Ky9u3A1ddpW8fO3fKj8nKEueS6tW1P/7MGfG8t28XlzdtAjp31tcGxh1iVpyAdnkC4j5ahbJoETBhgvjgA0CNGsD8+cCIEZXv+9lnwLRpwKhRwMiRQEWFkWcSyA8/qIs6FB9/LE5At9wi2uEGy5cDr70GDBwI3H23+f0NGgSsWiW/t3qpVQu45BLz7TBGMQoK0lFUVIS0NOvFGUmWAJCSAjzwAPDss+Z+xOhh2TLxvTl2TL5u9Ghg3DhtwsjJAb75RvzINUOwNHv0EN8RvT8ohw6VfwDMmgXcf7++x991lzhvAEB2NpCfDyQl6dsH4xLuBrz2Y9Vi2MHoTd0Sae/xGSnF6KXVKdxk/36iu+4KTEfHa41TmYYNTo9LW0qKSC2+956zNfcjRwJTmlI98N13xXfxnXe0vWfPPGP+u/vtt4Hfw9xcopIS/fvZsUPeR1aW/tqmctahlBRxPmGih5gXJ5F98tTb63bLFvOToY8ZY77dsYYRgTotzj17iP71L/G5s0qcXpalxNKlRJmZgW0aPFjIVGLqVO3vm7L2qRerpElkrra5Z48YqiU9fuFCY21g3CMuxElknzyJ9PW6XbzYXLT588/WtDkW0SNQJ8W5fLm8BNX8+ebEGQ2yJIocZSq5805934NQPW/DYaU0zUSbp08TtWolP37UKGNtYNwlbsRJZK889aRuR4/maNNOtAjUKXEqpQkQtW2rX5zRIksJLVGmkr59jX0fBg7U1hPVSmkSmYs2lT8SsrPdf68YY8SVOInslafW1G1pqf6B+xxt6iecQJ0QZ7A0pW3btsjijDZZEumLMpU0b25MnADRkiXh22S1NM1Em1zXjB3iTpxE9sqTSFvqtqBAzCqk9QTRpAl/0YyiJtDHH7f3mKGkKWQyRVWc0ShLCb1RpoTfX3kMp9YtI0OMgwyF1dIkMh5tcl0ztohLcRLZL0+11O3YsYG/UPXWO30+omHDxIxHjH727yd64AExi9LBg/YdJ5w0AaKcHDnijGZZEhmPMiUOH9YvzIQE8UOosDD0fu2QptFok+uasUfcipPIfnlqSd1qqXcG/yJngXqXSNIUmxDn6NFFYWU5eLA3ZSlhNMpUsnmzPmn26iUEFg47pElkPNrkumbsEdfiJLJfnkThU7eR6p2JiSJ6/cc/Kq9kwQL1FtqkKYtT/I2OyFKJ2ShTidYxnE2biikkI+3fLmkajTa5rhmbxL04iZyRZ7het+HqncqetKWlLFCvol2ageKMFllKWBFlKok0hjM9XXzmy8oi78suaRIZiza5rhm7sDj/ixPyDJe6Vat3hupJ66ZAeYHeyuiTpizO6dOLokKWRNZGmUrGjlV/jbTUMZXYKU0j0SbXNWMbFqcCJ+RJFDp1G1zvjDRu026B+v1Ev/4q0k0TJxK1a0eUlETUo4d3lnVyG/3SlMU5aZK7y4ppxeooU0nTppVfn969I9cxlZiV5pkzouNYqO+6kWiT65qxDYszCKfkqZa6HT1avq5qVe3jNq0S6OnTRBs3Ek2fTnTjjeLXdaiT//79xp97rPDiiyIy0idNWZytWnlbnHZFmUoyMuR9N2qkrY6pxKw0/X6xnCAglveSpkWUMBJtcl0z9mFxquCUPNVSt1dcISLNjz7Svz89AvX7iX75RQwgl6JJrZFTejrR+fPWvQ7RyP79RoQZKE6gyLOTWtgZZSpZtIioQQNR79dSx1RiRXr20KHK749SoHqjTa5rxgcszhA4JU8ifXPdaiGUQAGiq68matxYHMPoiX/gQKueefRy8KA14pw2zd52njmj73PrRJRpBVbVNMO9j1IkqjXa5Lpm/MDiDIOT8jSyTFkkwgnUzPaPf1j3vKOZL78kuvdeorvvJurXT9Tr9A5Had/evvY984w43q23avvcOhVlmsXKjkBafwDddVfk15DrmvEDizMCTspT7zJlWiktJXrhBesE+t131jzfWKS8XEwDt3490Zw5RPfdpyZVWZxXXWVPO3buDKy/vvpq6PtGS5RJZH3vWT2ZA7UaqATXNeMLFqcGnJQnkfWpWwkpAjWTpuX6pnEkqb7/vhDno48WUUGB9cfx+0XPVOX7lpqq3qErWqJMInuGnBhJuQcLlOua8QeLUyNOy9OO1K1EaakYP6d8Plo3n0+csJ56iuiTT6xpT7wwd+5cys7OpmbNmpEVC1mHYvVq9ffummvkz2w0RZlE9o3TNFOrHj6c65rxCotTB07L067UrcTmzSKCNJO2rVaNRaoXMwtZR6KsTH1spLS9+mp0RZlE9k5uYEacCQmBEzhwXTN+YHHqxGl5EtmXuiUSJw7lL+ZIW4MGLFKz2CnOmTPDvz/BnZe8HGUS2StNInPivOUW+X+ua8YXLE4DuCFPO1O3JSViiEmkE0Vqqqhv/uc/QtxjxxJdfjmLVC92ibOwUF8GwctRJpH90iQyJs7MTBG5c10zfmFxGsQNedqZuj1/nuj++yOfNNRmImKR6sMucd59t/aT//jx3o0yiZyRJpF+cXbtSrR3L9c14x0WpwnckCeRvanbuXMjTyMXaSq/AweI3nxTzIB02WXWiPT0aTHFXZcuYmhNNGOHOIOHn2jJHnh12kSnpEmkT5yPPSZ6RvN4TYbFaRK35Gln6nbt2sA0lLTVqqVPoBJ6RdqtG9GTTxJ9/DHR8eNCmMp5c6tWje5I1Wpxqg0/0bIpe9l6BSelSaRNnBkZYlwuEY/XZAQsTgtwS552pm63bSOqX1/eb3o6UXGxNZPJ6xFpqO3kSfPP0S2sFueaNcZeQyD8xAhO47Q0iSKLs2tXUYog4vGajAyL0yLckieRfanbQ4eI2rcX+/zb3+TrrV7OTCnS//kfbSf8hx4SEWk0Rp5WijPS8JNIm1dStm5Ikyi8OKXULBGP12QCYXFaiJvytCt16/cT7dun/jysFKhUwwy3lJnaFpzatVuky5cvpz59+lBGRgYBoPz8fN37sFKckYafaNmUP4rcwC1pEqmLU5maleC6JqOExWkxbsrT7gkTQmFGoEaF6ZZI33jjDZo8eTK9+uqrrovz0CFR7zX7mi1YYKoZpnBTmkREhw8HvhadO8upWQmuazLBsDhtwE15Etnb6zYcegRqVpivvKJ9+IsdIv31119dF+ett2p/vWrUILrySqIBA4juuYfo+eeJli0j2r3bVBNUKSkh2rQp8pzGbkuTiKiigqhePXH8QYPk1KzE7t1c12Qq4yMiAmM5ixcDo0eLrxsAPP00MGmSc8cvKACGDQO+/16+bvJk4Kmn7D/26dPAvHnA9OlAYaF8vc8njt+uHXDTTUB5ufFj1KkDJCSI/ysqgHPnxP7OnROXw1G9OpCaavzY4pgVOHbsKDIyMpCYWDXCvQmBX7NiFBbWQlFREdLS0gy3YfFi4Pbbxf9JScDllwOXXqq+ZWQA+/cDn30mtq1bgdxcYM4c8b5YBRHQowfw+edA587A+vVA8FM8d058F2bMkN+r3Fxg7VqgZk3r2hKJTZuAJ58E6tYFFiyofOwzZ4BOnYAdO8TlUaOARYusbcPevcC994rX6O23gWrVrN0/YxMuizumUUaejRs7f/zg1G1mprORr1oEmpIieipakZaN3k1EnAcOmK9xFhYS/f67+vv6668iQho1Snz+1Npy+LDpJgSwc2fg/v/8ZyIpsC4rI5o/X47wpK19e2cjzYoKounTiapUkduwfXvl+40fL99uR11zzx6iiy+Wj7Fpk7X7Z+wj0W1xxzKjRolfsbNmAWPGOH/8GjWAhQuBnj2BV14Bhg+3NrqIRPXqwP/7f8Bdd4kIdNUq4LrrgJwc4PrrgbNnje+7USM54ozE+fPiWGfPiminenXgoosiP6609BSOHTt24XK9ellITk7+7z7LcfDgQVxyySWoVi0p7H6IgiNOPw4cANLTtbU/HHXqyP/v2ydHlJ99JiLMUCQnA3feCdSrZ74NSpYuDby8eTPQty9w883AzJnAgQOBt9erB2zY4FykeeyY+F6uWydf17cv8Kc/Bd7v7bfFdwYAUlKAZcvE98kq9u4Frr4aOHxYXM7JATp0sG7/jL1wqpZxhXPngDfeAKZMCX+CD8XJk9aIJxwlJSU4cuTIhcv169dHSkoKAGDfvn1o0qQJ8vPzkZOTo2u/xcXFSE9PN52q1SvKzp3Fyfrqq8VJOim873VDBLRoAezere3+rVsDGzc6J81Nm4TADx4Ul30+4PHHRRklURFC7NkjygmnTonLCxfKKXErCJZmq1bAxx+LdDoTHXDEybhCtWrA2LHAbbeZE6idpKamItVsMdRCvCbKYAoKtEvTyZqm3w+88ALw97/LNdU6dYC33gL69Am875kzom+AJM1Ro1iaTGVYnIyrRINAAXHy3bsXyMg4gUOHDuC3334DAOzZswcAkJWVhaysLEuP6XVRBvPOO9ru17mzc9JUS83m5oq2XnJJ5fvff7/cGSg7G8jLs64tLM0Ywt0SK8MEUlYmpoEL1ZlF2pyccu/IEdHJRXRk+YUAVNqefvppzfsLNRxFS2ceaUtOJurZk+iZZ4g2biQ6e9bCJ6yTsjKiefMqr/UZauvQQe4wZCdffhm4fqzPR/TEE5WHnEgsWRLYic3K8ZrBHYFatSI6dsy6/TPOwuJkPEkkgTolzoICoksvlY+bkGD+2JI4d+woikpRSki9ZBs10t+zWNnb1mrUes3WqUP00UehH2PneE2WZuzB4mQ8jZpAq1UjOnPG/mP/+9/qC0N/8IGx/UkR5S23FP03Ui2KKlFKmBGm3fI8epSof//A4+TmilmWQnH6NNFVV8n3t3IeWpZmbMLiZKICSaB9+hDl5dl/vAULQqcetc7tGjr1WlmcXhalRDhh1qhhXJ7Fxda0T29qVsKu8ZoszdiFxckwCioqiB59NPzJvl079cdqr1EKcebmFnlalBLhhNm/f+Bcrka2SZPMtc9IalbCrromSzO24V61DPNfzpwRPTCXLQt/v61bgaIi4I8/jPV6bd8e6NcPWLOm8nR0XuLcOTHF3P/+b+WJC/r3F+MfO3QwP42jWu9Wraj1mu3eXUxgEGm/e/aISSAkXn4ZuPJK422R4N6zcYDb5mYYL3DkCFHHjtqjpDp1wt8eLvVq9ULWVhMpwvz6a/m+fj/RFVfojzJr1SK64w6iDRuMt9NoapbIvromR5rxAYuTiXuCe84a2fTUKL0qTj3ClAiem1aLLNevJzp3zng7zaRmJeyoa7I04wdO1TJxzYYNwJAhIvWqB59PrALi5oQDVqE1JavGSy+F33etWsCgQcDQoUCvXkDVSAvJRMBMalbCjnloOT0bZ7htboZxixkzAqMWPZuR8Zxz586l7OxsatasmSciTiMRZjDK9TStjiyDiZSa9fuJZs0S72tpqfrvVLrYAAAKJElEQVQ+7BivyZFm/MHiZOKShx82l5oFjI/ndDtVa4UwJdq1E49LTCQaOdJ6WRJpT82uXi3f/qc/Ef3wQ+DtdtQ1WZrxCYuTiUv0dAQKtWkdzxmMW+IsKyN65RX1oTJ6hSlRUUG0dav1spRQm9Cge3f1CQ2CfwzVqEH05pvy7VbXNVma8QuLk4lLfvyRqG1bsbi3UXGGGs8ZCafFGU6Y/foZE6YT6O01e+216u/TmDFEr78uX7ZivCZLM77h9TiZuOfECeCrr8S2eTPw9ddASUnkxyUkiMfqXRdUz3qcRUXAc88BTZqIMYd6FiI/dw5YvFh0+gkeY9qvn+j007GjvrY7gZ5lwJRcconcOSeYhASxX8D8+prcEYhhcTJMEBUVwPffC4lK239XD6vEt9+KRY/1oFWcfr/o1frRR+LyqlXA9ddH3n+0ChMw3mv26FGgbt3I++/aFfjiC+PtY2kyALhXLcNo4fhxonXriJ58kqh3b6LatcXk4SUl+velNVX73HOBKcfWrUXP0VBESsl+9ZX+tjqJmQkNNmzQnmIfMyZ0r9twcHqWkWBxMozDaBHnxo1iyEvwSX/Vqsr3jXZhWjGhwcyZ+urTar1uw8HSZJQkuB3xMgwTyNGjwM03yzU5JZMmiVM3IFKyr74KNGsGjB8fmJbt10/UbNet825aFhCp2YEDgUcekeuZ3bsD27aFr2cGs327vuPu2iVS7G++Gfm+nJ5lguGZgxjGQ/j9wMiRwG+/qd+enw+sWCE6JUVjDVPJpk3iB8LBg+Kyzwc8/rhof6LOM9OOHfqPX1oK3HYbkJkpXjc1WJqMGixOhvEQM2bInYFCMXy4iDaVRJMwjfaaDUV5OVBQYLw9x4+rX8/SZELB4mQYj/DFF8ATT0S+n1Ka0SRMQL3XbG4u8M47xpcX27u38g8JLWRmAo89BowYob5PliYTChYnw3iAo0eBW26RI7BIpKWJyLRTJ3vbZSVWpmaV6K1vZmYCDz0ETJgA1KxZ+XaWJhMJFifDOEReXh7y8vJQEWRHv1/U2g4d0r6v4mKgsNDiBtqE1anZYLSKM5IwAZYmow2eAIFhHCZ4AoRp00TKUC+tWwPffadvNiGnsWIZsEj06wd8+GHo27UIE2BpMtphcTKMwyjFuX17Gnr00J6iDUbrbEJuYFdqNphatYCTJytfr1WYAEuT0QeLk2EcRhLnnj1F6NgxTfWkrxUvRp12p2aVFBYC9eoFXqdHmABLk9EP1zgZxiVuuEE9UtJDfj7wySdAr17WtMksTqRmlVStKn40EAFJScAzz2gXJsDSZIzB4mQYlwg1flAvxcXW7EeN8nIhJy04lZpVUquWqG9+/rmYfSjCYjMBsDQZo3CqlmEcRkrVbt5chOeeS0Pt2sDFFxvbV/PmokdugsWTZ549C/TuDWzdCixaBAwbFvq+TqZmrYKlyZiBxckwDqNnPU63yMsD7r1X/J+SIpZPu/LKyvdzOjVrBSxNxiw8yTvDMAGcPQtMnSpfPnMGGDpUzO2qZNMm0TlJkqbPJ2Y+2rCBpcnENixOhmECeO21ypMx/PADcM894n+/X8yp2727XM+sU0fUGp991r56pllYmoxVcKqWYRzGy6nas2eByy8PPYvRnDlCkGvXytd5PTULsDQZa/Hob0OGYdxALdpUct998nqgTvSatQKWJmM1Hv64MwzjJMG1TTUkaWZmAkuWeLfXrARLk7EDrnEyjEPk5eWhRYsWaN++vdtNUSVStKmkRw+WJhO/cI2TYRzGizXOSLVNNRYuBG6/3bYmmYKlydgJR5wMw+iKNiUmTAAKCuxpjxlYmozdsDgZJs7RUttU48wZMaNQ8PhON2FpMk7A4mSYOMdItCnx/fdiJRIvwNJknILFyTBxjNFoU0m4RaSdgqXJOAmLk2HimJdeMh5tVqki5q+dMcPaNumFpck4DfeqZRiH8UqvWr9fTOB+7lzk+2ZkCCFddZX8t0ULIDnZ/naGg6XJuAFPgMAwcUp5eWVpVqkCXHFFoCBbtRLLnvl8zrSrrAz429/EwtSTJwM1aqjfj6XJuAWLk2HilKQkYP58YNkyYMAAMedsdrb7UeScOcDcueL/rVuBNWsqy5OlybgJp2oZxmG8kqr1Ku3bA1u2yJd79AiUJ0uTcRvuHMQwjGf45ZdAaQLAp58CAweK8aIsTcYLcKqWYRjP8P776td/+inQqxewbx9w5Ii4jqXJuAWLk2EcIi8vD3l5eaioqHC7KZ5l2bLQt339tfw/S5NxE65xMozDcI1TnV9+AS67LPL9atYUc+Q2amR/mxhGDa5xMgzjCUKlaYM5dUqsyuKlOXKZ+ILFyTCMJwiXpg1G2WGIYZyGxckwjOuo9aaNBMuTcQsWJ8MwrqM1TRvMp58CQ4cC3FODcRIWJ8MwrqMnTRvM+vXAsWPWtYVhIsHDURiGcRUjaVqJpCTgnnuAOnWsbRPDhIPFyTCMq+hN0yYlAddeK1K0AwcCPKKHcRpO1TJxy4oVK9C3b19kZmbC5/Nh27ZtER+zaNEi+Hy+StvZs2cdaHFs8uabke+TlATccAPw1ltAYSGwciUwYgRLk3EHjjiZuKW0tBRdunTB0KFDMW7cOM2PS0tLw549ewKuS3Z7SZEopaAA2LVL/TaOLBmvwuJk4paRI0cCAPbt26frcT6fD1lZWTa0KP745JPAyyxLJhrgVC3D6OTUqVNo3LgxGjRogOuuuw75+fluNylqGT8e6NgRaNYM+Oc/OQ3LRAcccTKMDq644gosWrQILVu2RHFxMWbPno0uXbpg+/btaNq0qepjysrKUFZWduFycXGxU831PElJwFdfud0KhtEHR5xMXLBkyRLUrFnzwvbFF18Y2k+nTp1w6623olWrVujWrRuWLl2KZs2aYc6cOSEfM3XqVKSnp1/YGjZsaPRpMAzjAXh1FCYuKCkpwRFpIUcA9evXR0pKCgBR42zSpAny8/ORk5Oje9/jxo3DwYMHsX79etXb1SLOhg0b8uooDBOlcKqWiQtSU1ORmppq+X6JCNu2bUPLli1D3icpKQlJSUmWH5thGHdgcTJxy4kTJ3DgwAH89ttvAHBhiElWVtaFXrO33XYb6tevj6lTpwIAJk+ejE6dOqFp06YoLi7GSy+9hG3btiEvL8+dJ8EwjONwjZOJW1avXo3WrVtjwIABAICbb74ZrVu3xrx58y7c58CBAzh8+PCFyydPnsT48eORnZ2NPn364NChQ9i4cSM6dOjgePsZhnEHrnEyjMMUFxcjPT2da5wME6VwxMkwDMMwOmBxMgzDMIwOWJwMwzAMowOucTKMwxARSkpKkJqaCp/P53ZzGIbRCYuTYRiGYXTAqVqGYRiG0QGLk2EYhmF0wOJkGIZhGB2wOBmGYRhGByxOhmEYhtEBi5NhGIZhdMDiZBiGYRgdsDgZhmEYRgcsToZhGIbRAYuTYRiGYXTw/wHxtkjwpbWmGAAAAABJRU5ErkJggg==\n", "text/plain": [ "Graphics object consisting of 80 graphics primitives" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "graph_z0 = E[3].plot(chart=stereoN, ambient_coords=(x,y),\n", " fixed_coords={z: 0}, max_range=1, scale=0.5)\n", "show(graph_z0, aspect_ratio=1)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "or in the plane $y=0$:" ] }, { "cell_type": "code", "execution_count": 166, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "Graphics object consisting of 121 graphics primitives" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "graph_y0 = E[3].plot(chart=stereoN, ambient_coords=(x,z),\n", " fixed_coords={y: 0}, number_values=11,\n", " ranges={x: (-2,2), z: (-1,1)}, scale=0.4)\n", "show(graph_y0, aspect_ratio=1)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "A 3D view of $\\varepsilon_3$, in terms of the stereographic coordinates $(x,y,z)$:" ] }, { "cell_type": "code", "execution_count": 167, "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", "\n" ], "text/plain": [ "Graphics3d Object" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "graph = E[3].plot(chart=stereoN, max_range=1, number_values=7, \n", " scale=0.25, label_axes=False)\n", "show(graph, viewer=viewer3D, axes_labels=['x','y','z'])" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "SageMath 9.0.beta1", "language": "sage", "name": "sagemath" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.7.3" } }, "nbformat": 4, "nbformat_minor": 1 }