Julia interface to GAlgebra via PyCall 🔮 Mirror of https://github.com/pygae/GAlgebra.jl
0

Configure Feed

Select the types of activity you want to include in your feed.

pygae-GAlgebra.jl / notebook / profiling.ipynb
89 kB 834 lines
1{ 2 "cells": [ 3 { 4 "cell_type": "code", 5 "execution_count": 1, 6 "metadata": {}, 7 "outputs": [], 8 "source": [ 9 "using PyCall\n", 10 "import SymPy: symbols, sympy, Sym\n", 11 "using GAlgebra\n", 12 "using Test" 13 ] 14 }, 15 { 16 "cell_type": "code", 17 "execution_count": 2, 18 "metadata": {}, 19 "outputs": [ 20 { 21 "data": { 22 "text/plain": [ 23 "PyObject <function signature at 0x000000002FE6DAE8>" 24 ] 25 }, 26 "execution_count": 2, 27 "metadata": {}, 28 "output_type": "execute_result" 29 } 30 ], 31 "source": [ 32 "py\"\"\"\n", 33 "def vector(ga, components):\n", 34 " basis = ga.mv()\n", 35 " return sum([components[i] * e for i, e in enumerate(basis)])\n", 36 "\"\"\"\n", 37 "const vector = py\"vector\"\n", 38 "\n", 39 "py\"\"\"\n", 40 "def signature(ga):\n", 41 " basis = ga.mv()\n", 42 " signs = [e * e for e in basis]\n", 43 " p, q, r = 0, 0, 0\n", 44 " for sign in signs:\n", 45 " p += 1 if sign == 1 else 0\n", 46 " q += 1 if sign == -1 else 0\n", 47 " r += 1 if sign == 0 else 0\n", 48 "\n", 49 " return (p, q, r)\n", 50 "\"\"\"\n", 51 "const signature = py\"signature\"" 52 ] 53 }, 54 { 55 "cell_type": "code", 56 "execution_count": 3, 57 "metadata": {}, 58 "outputs": [ 59 { 60 "data": { 61 "text/plain": [ 62 "PyObject <galgebra.ga.Ga object at 0x00000000313D8898>" 63 ] 64 }, 65 "execution_count": 3, 66 "metadata": {}, 67 "output_type": "execute_result" 68 } 69 ], 70 "source": [ 71 "# Basic \n", 72 "Hyper = G(1) # Hyperbolic numbers. \n", 73 "ℂ = G(0,1) # Complex numbers.\n", 74 "Dual = G(0,0,1) # Dual numbers.\n", 75 "ℍ = G(0,2) # Quaternions.\n", 76 "\n", 77 "# Clifford\n", 78 "Cl2 = G(2) # Clifford algebra for 2D vector space.\n", 79 "Cl3 = G(3) # Clifford algebra for 3D vector space.\n", 80 "Spacetime = G(1,3) # Clifford algebra for timespace vectors.\n", 81 "\n", 82 "# Geometric\n", 83 "PGA2D = G(2,0,1) # Projective Euclidean 2D plane. (dual)\n", 84 "PGA3D = G(3,0,1) # Projective Euclidean 3D space. (dual)\n", 85 "CGA2D = G(3,1) # conformal 2D space. \n", 86 "CGA3D = G(4,1) # Conformal 3D space. " 87 ] 88 }, 89 { 90 "cell_type": "code", 91 "execution_count": 4, 92 "metadata": {}, 93 "outputs": [ 94 { 95 "data": { 96 "text/plain": [ 97 "test_geometric_product (generic function with 1 method)" 98 ] 99 }, 100 "execution_count": 4, 101 "metadata": {}, 102 "output_type": "execute_result" 103 } 104 ], 105 "source": [ 106 "function test_geometric_product(V)\n", 107 " dimV = range(0, stop=V.n)\n", 108 " I = V.I()\n", 109 "\n", 110 " α = V.mv(\"α\", \"scalar\")\n", 111 " β = V.mv(\"β\", \"scalar\")\n", 112 " γ = V.mv(\"γ\", \"scalar\")\n", 113 " λ = V.mv(\"λ\", \"scalar\")\n", 114 "\n", 115 " u = V.mv(\"u\", \"vector\")\n", 116 " v = V.mv(\"v\", \"vector\")\n", 117 " w = V.mv(\"w\", \"vector\")\n", 118 "\n", 119 " A = V.mv(\"A\", \"mv\")\n", 120 " B = V.mv(\"B\", \"mv\")\n", 121 " C = V.mv(\"C\", \"mv\")\n", 122 " D = V.mv(\"D\", \"mv\")\n", 123 "\n", 124 " R = V.mv(\"R\", \"spinor\")\n", 125 "\n", 126 " return A*B #, V.mul_table_dict)\n", 127 "end" 128 ] 129 }, 130 { 131 "cell_type": "code", 132 "execution_count": 5, 133 "metadata": {}, 134 "outputs": [ 135 { 136 "name": "stdout", 137 "output_type": "stream", 138 "text": [ 139 " 0.143947 seconds (270.18 k allocations: 13.434 MiB)\n" 140 ] 141 }, 142 { 143 "data": { 144 "text/latex": [ 145 "\\begin{align*}\\left ( A B + A^{0} B^{0}\\right ) + \\left ( A B^{0} + A^{0} B\\right ) \\boldsymbol{e}_{0}\\end{align*}" 146 ], 147 "text/plain": [ 148 "A*B + A__0*B__0 + (A*B__0 + A__0*B)*e_0" 149 ] 150 }, 151 "execution_count": 5, 152 "metadata": {}, 153 "output_type": "execute_result" 154 } 155 ], 156 "source": [ 157 "@time test_geometric_product(Hyper)" 158 ] 159 }, 160 { 161 "cell_type": "code", 162 "execution_count": 6, 163 "metadata": {}, 164 "outputs": [ 165 { 166 "name": "stdout", 167 "output_type": "stream", 168 "text": [ 169 " 0.002141 seconds (157 allocations: 5.859 KiB)\n" 170 ] 171 }, 172 { 173 "data": { 174 "text/latex": [ 175 "\\begin{align*}A B + \\left ( A B^{0} + A^{0} B\\right ) \\boldsymbol{e}_{0}\\end{align*}" 176 ], 177 "text/plain": [ 178 "A*B + (A*B__0 + A__0*B)*e_0" 179 ] 180 }, 181 "execution_count": 6, 182 "metadata": {}, 183 "output_type": "execute_result" 184 } 185 ], 186 "source": [ 187 "@time test_geometric_product(Dual)" 188 ] 189 }, 190 { 191 "cell_type": "code", 192 "execution_count": 7, 193 "metadata": {}, 194 "outputs": [ 195 { 196 "name": "stdout", 197 "output_type": "stream", 198 "text": [ 199 " 0.002485 seconds (157 allocations: 5.859 KiB)\n" 200 ] 201 }, 202 { 203 "data": { 204 "text/latex": [ 205 "\\begin{align*}\\left ( A B - A^{0} B^{0}\\right ) + \\left ( A B^{0} + A^{0} B\\right ) \\boldsymbol{e}_{0}\\end{align*}" 206 ], 207 "text/plain": [ 208 "A*B - A__0*B__0 + (A*B__0 + A__0*B)*e_0" 209 ] 210 }, 211 "execution_count": 7, 212 "metadata": {}, 213 "output_type": "execute_result" 214 } 215 ], 216 "source": [ 217 "@time test_geometric_product(ℂ)" 218 ] 219 }, 220 { 221 "cell_type": "code", 222 "execution_count": 8, 223 "metadata": {}, 224 "outputs": [ 225 { 226 "name": "stdout", 227 "output_type": "stream", 228 "text": [ 229 " 0.047692 seconds (157 allocations: 5.859 KiB)\n" 230 ] 231 }, 232 { 233 "data": { 234 "text/latex": [ 235 "\\begin{align*}\\left ( A B - A^{1} B^{1} - A^{12} B^{12} - A^{2} B^{2}\\right ) + \\left ( A B^{1} + A^{1} B - A^{12} B^{2} + A^{2} B^{12}\\right ) \\boldsymbol{e}_{1} + \\left ( A B^{2} - A^{1} B^{12} + A^{12} B^{1} + A^{2} B\\right ) \\boldsymbol{e}_{2} + \\left ( A B^{12} + A^{1} B^{2} + A^{12} B - A^{2} B^{1}\\right ) \\boldsymbol{e}_{1}\\wedge \\boldsymbol{e}_{2}\\end{align*}" 236 ], 237 "text/plain": [ 238 "A*B - A__1*B__1 - A__12*B__12 - A__2*B__2 + (A*B__1 + A__1*B - A__12*B__2 + A__2*B__12)*e_1 + (A*B__2 - A__1*B__12 + A__12*B__1 + A__2*B)*e_2 + (A*B__12 + A__1*B__2 + A__12*B - A__2*B__1)*e_1^e_2" 239 ] 240 }, 241 "execution_count": 8, 242 "metadata": {}, 243 "output_type": "execute_result" 244 } 245 ], 246 "source": [ 247 "@time test_geometric_product(ℍ)" 248 ] 249 }, 250 { 251 "cell_type": "code", 252 "execution_count": 9, 253 "metadata": {}, 254 "outputs": [ 255 { 256 "name": "stdout", 257 "output_type": "stream", 258 "text": [ 259 " 0.012486 seconds (157 allocations: 5.859 KiB)\n" 260 ] 261 }, 262 { 263 "data": { 264 "text/latex": [ 265 "\\begin{align*}\\left ( A B + A^{1} B^{1} - A^{12} B^{12} + A^{2} B^{2}\\right ) + \\left ( A B^{1} + A^{1} B + A^{12} B^{2} - A^{2} B^{12}\\right ) \\boldsymbol{e}_{1} + \\left ( A B^{2} + A^{1} B^{12} - A^{12} B^{1} + A^{2} B\\right ) \\boldsymbol{e}_{2} + \\left ( A B^{12} + A^{1} B^{2} + A^{12} B - A^{2} B^{1}\\right ) \\boldsymbol{e}_{1}\\wedge \\boldsymbol{e}_{2}\\end{align*}" 266 ], 267 "text/plain": [ 268 "A*B + A__1*B__1 - A__12*B__12 + A__2*B__2 + (A*B__1 + A__1*B + A__12*B__2 - A__2*B__12)*e_1 + (A*B__2 + A__1*B__12 - A__12*B__1 + A__2*B)*e_2 + (A*B__12 + A__1*B__2 + A__12*B - A__2*B__1)*e_1^e_2" 269 ] 270 }, 271 "execution_count": 9, 272 "metadata": {}, 273 "output_type": "execute_result" 274 } 275 ], 276 "source": [ 277 "@time test_geometric_product(Cl2)" 278 ] 279 }, 280 { 281 "cell_type": "code", 282 "execution_count": 10, 283 "metadata": {}, 284 "outputs": [ 285 { 286 "name": "stdout", 287 "output_type": "stream", 288 "text": [ 289 " 0.138977 seconds (157 allocations: 5.859 KiB)\n" 290 ] 291 }, 292 { 293 "data": { 294 "text/latex": [ 295 "\\begin{align*}\\left ( A B + A^{1} B^{1} - A^{12} B^{12} - A^{123} B^{123} - A^{13} B^{13} + A^{2} B^{2} - A^{23} B^{23} + A^{3} B^{3}\\right ) + \\left ( A B^{1} + A^{1} B + A^{12} B^{2} - A^{123} B^{23} + A^{13} B^{3} - A^{2} B^{12} - A^{23} B^{123} - A^{3} B^{13}\\right ) \\boldsymbol{e}_{1} + \\left ( A B^{2} + A^{1} B^{12} - A^{12} B^{1} + A^{123} B^{13} + A^{13} B^{123} + A^{2} B + A^{23} B^{3} - A^{3} B^{23}\\right ) \\boldsymbol{e}_{2} + \\left ( A B^{3} + A^{1} B^{13} - A^{12} B^{123} - A^{123} B^{12} - A^{13} B^{1} + A^{2} B^{23} - A^{23} B^{2} + A^{3} B\\right ) \\boldsymbol{e}_{3} + \\left ( A B^{12} + A^{1} B^{2} + A^{12} B + A^{123} B^{3} - A^{13} B^{23} - A^{2} B^{1} + A^{23} B^{13} + A^{3} B^{123}\\right ) \\boldsymbol{e}_{1}\\wedge \\boldsymbol{e}_{2} + \\left ( A B^{13} + A^{1} B^{3} + A^{12} B^{23} - A^{123} B^{2} + A^{13} B - A^{2} B^{123} - A^{23} B^{12} - A^{3} B^{1}\\right ) \\boldsymbol{e}_{1}\\wedge \\boldsymbol{e}_{3} + \\left ( A B^{23} + A^{1} B^{123} - A^{12} B^{13} + A^{123} B^{1} + A^{13} B^{12} + A^{2} B^{3} + A^{23} B - A^{3} B^{2}\\right ) \\boldsymbol{e}_{2}\\wedge \\boldsymbol{e}_{3} + \\left ( A B^{123} + A^{1} B^{23} + A^{12} B^{3} + A^{123} B - A^{13} B^{2} - A^{2} B^{13} + A^{23} B^{1} + A^{3} B^{12}\\right ) \\boldsymbol{e}_{1}\\wedge \\boldsymbol{e}_{2}\\wedge \\boldsymbol{e}_{3}\\end{align*}" 296 ], 297 "text/plain": [ 298 "A*B + A__1*B__1 - A__12*B__12 - A__123*B__123 - A__13*B__13 + A__2*B__2 - A__23*B__23 + A__3*B__3 + (A*B__1 + A__1*B + A__12*B__2 - A__123*B__23 + A__13*B__3 - A__2*B__12 - A__23*B__123 - A__3*B__13)*e_1 + (A*B__2 + A__1*B__12 - A__12*B__1 + A__123*B__13 + A__13*B__123 + A__2*B + A__23*B__3 - A__3*B__23)*e_2 + (A*B__3 + A__1*B__13 - A__12*B__123 - A__123*B__12 - A__13*B__1 + A__2*B__23 - A__23*B__2 + A__3*B)*e_3 + (A*B__12 + A__1*B__2 + A__12*B + A__123*B__3 - A__13*B__23 - A__2*B__1 + A__23*B__13 + A__3*B__123)*e_1^e_2 + (A*B__13 + A__1*B__3 + A__12*B__23 - A__123*B__2 + A__13*B - A__2*B__123 - A__23*B__12 - A__3*B__1)*e_1^e_3 + (A*B__23 + A__1*B__123 - A__12*B__13 + A__123*B__1 + A__13*B__12 + A__2*B__3 + A__23*B - A__3*B__2)*e_2^e_3 + (A*B__123 + A__1*B__23 + A__12*B__3 + A__123*B - A__13*B__2 - A__2*B__13 + A__23*B__1 + A__3*B__12)*e_1^e_2^e_3" 299 ] 300 }, 301 "execution_count": 10, 302 "metadata": {}, 303 "output_type": "execute_result" 304 } 305 ], 306 "source": [ 307 "@time test_geometric_product(Cl3)" 308 ] 309 }, 310 { 311 "cell_type": "code", 312 "execution_count": 11, 313 "metadata": {}, 314 "outputs": [ 315 { 316 "name": "stdout", 317 "output_type": "stream", 318 "text": [ 319 " 1.388004 seconds (157 allocations: 5.859 KiB)" 320 ] 321 }, 322 { 323 "data": { 324 "text/latex": [ 325 "\\begin{align*}\\left ( A B + A^{1} B^{1} + A^{12} B^{12} - A^{123} B^{123} - A^{1234} B^{1234} - A^{124} B^{124} + A^{13} B^{13} - A^{134} B^{134} + A^{14} B^{14} - A^{2} B^{2} - A^{23} B^{23} + A^{234} B^{234} - A^{24} B^{24} - A^{3} B^{3} - A^{34} B^{34} - A^{4} B^{4}\\right ) + \\left ( A B^{1} + A^{1} B - A^{12} B^{2} - A^{123} B^{23} + A^{1234} B^{234} - A^{124} B^{24} - A^{13} B^{3} - A^{134} B^{34} - A^{14} B^{4} + A^{2} B^{12} - A^{23} B^{123} - A^{234} B^{1234} - A^{24} B^{124} + A^{3} B^{13} - A^{34} B^{134} + A^{4} B^{14}\\right ) \\boldsymbol{e}_{1} + \\left ( A B^{2} + A^{1} B^{12} - A^{12} B^{1} - A^{123} B^{13} + A^{1234} B^{134} - A^{124} B^{14} - A^{13} B^{123} - A^{134} B^{1234} - A^{14} B^{124} + A^{2} B - A^{23} B^{3} - A^{234} B^{34} - A^{24} B^{4} + A^{3} B^{23} - A^{34} B^{234} + A^{4} B^{24}\\right ) \\boldsymbol{e}_{2} + \\left ( A B^{3} + A^{1} B^{13} + A^{12} B^{123} + A^{123} B^{12} - A^{1234} B^{124} + A^{124} B^{1234} - A^{13} B^{1} - A^{134} B^{14} - A^{14} B^{134} - A^{2} B^{23} + A^{23} B^{2} + A^{234} B^{24} + A^{24} B^{234} + A^{3} B - A^{34} B^{4} + A^{4} B^{34}\\right ) \\boldsymbol{e}_{3} + \\left ( A B^{4} + A^{1} B^{14} + A^{12} B^{124} - A^{123} B^{1234} + A^{1234} B^{123} + A^{124} B^{12} + A^{13} B^{134} + A^{134} B^{13} - A^{14} B^{1} - A^{2} B^{24} - A^{23} B^{234} - A^{234} B^{23} + A^{24} B^{2} - A^{3} B^{34} + A^{34} B^{3} + A^{4} B\\right ) \\boldsymbol{e}_{4} + \\left ( A B^{12} + A^{1} B^{2} + A^{12} B - A^{123} B^{3} - A^{1234} B^{34} - A^{124} B^{4} + A^{13} B^{23} - A^{134} B^{234} + A^{14} B^{24} - A^{2} B^{1} - A^{23} B^{13} + A^{234} B^{134} - A^{24} B^{14} - A^{3} B^{123} - A^{34} B^{1234} - A^{4} B^{124}\\right ) \\boldsymbol{e}_{1}\\wedge \\boldsymbol{e}_{2} + \\left ( A B^{13} + A^{1} B^{3} - A^{12} B^{23} + A^{123} B^{2} + A^{1234} B^{24} + A^{124} B^{234} + A^{13} B - A^{134} B^{4} + A^{14} B^{34} + A^{2} B^{123} + A^{23} B^{12} - A^{234} B^{124} + A^{24} B^{1234} - A^{3} B^{1} - A^{34} B^{14} - A^{4} B^{134}\\right ) \\boldsymbol{e}_{1}\\wedge \\boldsymbol{e}_{3} + \\left ( A B^{14} + A^{1} B^{4} - A^{12} B^{24} - A^{123} B^{234} - A^{1234} B^{23} + A^{124} B^{2} - A^{13} B^{34} + A^{134} B^{3} + A^{14} B + A^{2} B^{124} - A^{23} B^{1234} + A^{234} B^{123} + A^{24} B^{12} + A^{3} B^{134} + A^{34} B^{13} - A^{4} B^{1}\\right ) \\boldsymbol{e}_{1}\\wedge \\boldsymbol{e}_{4} + \\left ( A B^{23} + A^{1} B^{123} - A^{12} B^{13} + A^{123} B^{1} + A^{1234} B^{14} + A^{124} B^{134} + A^{13} B^{12} - A^{134} B^{124} + A^{14} B^{1234} + A^{2} B^{3} + A^{23} B - A^{234} B^{4} + A^{24} B^{34} - A^{3} B^{2} - A^{34} B^{24} - A^{4} B^{234}\\right ) \\boldsymbol{e}_{2}\\wedge \\boldsymbol{e}_{3} + \\left ( A B^{24} + A^{1} B^{124} - A^{12} B^{14} - A^{123} B^{134} - A^{1234} B^{13} + A^{124} B^{1} - A^{13} B^{1234} + A^{134} B^{123} + A^{14} B^{12} + A^{2} B^{4} - A^{23} B^{34} + A^{234} B^{3} + A^{24} B + A^{3} B^{234} + A^{34} B^{23} - A^{4} B^{2}\\right ) \\boldsymbol{e}_{2}\\wedge \\boldsymbol{e}_{4} + \\left ( A B^{34} + A^{1} B^{134} + A^{12} B^{1234} + A^{123} B^{124} + A^{1234} B^{12} - A^{124} B^{123} - A^{13} B^{14} + A^{134} B^{1} + A^{14} B^{13} - A^{2} B^{234} + A^{23} B^{24} - A^{234} B^{2} - A^{24} B^{23} + A^{3} B^{4} + A^{34} B - A^{4} B^{3}\\right ) \\boldsymbol{e}_{3}\\wedge \\boldsymbol{e}_{4} + \\left ( A B^{123} + A^{1} B^{23} + A^{12} B^{3} + A^{123} B - A^{1234} B^{4} + A^{124} B^{34} - A^{13} B^{2} - A^{134} B^{24} - A^{14} B^{234} - A^{2} B^{13} + A^{23} B^{1} + A^{234} B^{14} + A^{24} B^{134} + A^{3} B^{12} - A^{34} B^{124} + A^{4} B^{1234}\\right ) \\boldsymbol{e}_{1}\\wedge \\boldsymbol{e}_{2}\\wedge \\boldsymbol{e}_{3} + \\left ( A B^{124} + A^{1} B^{24} + A^{12} B^{4} - A^{123} B^{34} + A^{1234} B^{3} + A^{124} B + A^{13} B^{234} + A^{134} B^{23} - A^{14} B^{2} - A^{2} B^{14} - A^{23} B^{134} - A^{234} B^{13} + A^{24} B^{1} - A^{3} B^{1234} + A^{34} B^{123} + A^{4} B^{12}\\right ) \\boldsymbol{e}_{1}\\wedge \\boldsymbol{e}_{2}\\wedge \\boldsymbol{e}_{4} + \\left ( A B^{134} + A^{1} B^{34} - A^{12} B^{234} + A^{123} B^{24} - A^{1234} B^{2} - A^{124} B^{23} + A^{13} B^{4} + A^{134} B - A^{14} B^{3} + A^{2} B^{1234} + A^{23} B^{124} + A^{234} B^{12} - A^{24} B^{123} - A^{3} B^{14} + A^{34} B^{1} + A^{4} B^{13}\\right ) \\boldsymbol{e}_{1}\\wedge \\boldsymbol{e}_{3}\\wedge \\boldsymbol{e}_{4} + \\left ( A B^{234} + A^{1} B^{1234} - A^{12} B^{134} + A^{123} B^{14} - A^{1234} B^{1} - A^{124} B^{13} + A^{13} B^{124} + A^{134} B^{12} - A^{14} B^{123} + A^{2} B^{34} + A^{23} B^{4} + A^{234} B - A^{24} B^{3} - A^{3} B^{24} + A^{34} B^{2} + A^{4} B^{23}\\right ) \\boldsymbol{e}_{2}\\wedge \\boldsymbol{e}_{3}\\wedge \\boldsymbol{e}_{4} + \\left ( A B^{1234} + A^{1} B^{234} + A^{12} B^{34} + A^{123} B^{4} + A^{1234} B - A^{124} B^{3} - A^{13} B^{24} + A^{134} B^{2} + A^{14} B^{23} - A^{2} B^{134} + A^{23} B^{14} - A^{234} B^{1} - A^{24} B^{13} + A^{3} B^{124} + A^{34} B^{12} - A^{4} B^{123}\\right ) \\boldsymbol{e}_{1}\\wedge \\boldsymbol{e}_{2}\\wedge \\boldsymbol{e}_{3}\\wedge \\boldsymbol{e}_{4}\\end{align*}" 326 ], 327 "text/plain": [ 328 "A*B + A__1*B__1 + A__12*B__12 - A__123*B__123 - A__1234*B__1234 - A__124*B__124 + A__13*B__13 - A__134*B__134 + A__14*B__14 - A__2*B__2 - A__23*B__23 + A__234*B__234 - A__24*B__24 - A__3*B__3 - A__34*B__34 - A__4*B__4 + (A*B__1 + A__1*B - A__12*B__2 - A__123*B__23 + A__1234*B__234 - A__124*B__24 - A__13*B__3 - A__134*B__34 - A__14*B__4 + A__2*B__12 - A__23*B__123 - A__234*B__1234 - A__24*B__124 + A__3*B__13 - A__34*B__134 + A__4*B__14)*e_1 + (A*B__2 + A__1*B__12 - A__12*B__1 - A__123*B__13 + A__1234*B__134 - A__124*B__14 - A__13*B__123 - A__134*B__1234 - A__14*B__124 + A__2*B - A__23*B__3 - A__234*B__34 - A__24*B__4 + A__3*B__23 - A__34*B__234 + A__4*B__24)*e_2 + (A*B__3 + A__1*B__13 + A__12*B__123 + A__123*B__12 - A__1234*B__124 + A__124*B__1234 - A__13*B__1 - A__134*B__14 - A__14*B__134 - A__2*B__23 + A__23*B__2 + A__234*B__24 + A__24*B__234 + A__3*B - A__34*B__4 + A__4*B__34)*e_3 + (A*B__4 + A__1*B__14 + A__12*B__124 - A__123*B__1234 + A__1234*B__123 + A__124*B__12 + A__13*B__134 + A__134*B__13 - A__14*B__1 - A__2*B__24 - A__23*B__234 - A__234*B__23 + A__24*B__2 - A__3*B__34 + A__34*B__3 + A__4*B)*e_4 + (A*B__12 + A__1*B__2 + A__12*B - A__123*B__3 - A__1234*B__34 - A__124*B__4 + A__13*B__23 - A__134*B__234 + A__14*B__24 - A__2*B__1 - A__23*B__13 + A__234*B__134 - A__24*B__14 - A__3*B__123 - A__34*B__1234 - A__4*B__124)*e_1^e_2 + (A*B__13 + A__1*B__3 - A__12*B__23 + A__123*B__2 + A__1234*B__24 + A__124*B__234 + A__13*B - A__134*B__4 + A__14*B__34 + A__2*B__123 + A__23*B__12 - A__234*B__124 + A__24*B__1234 - A__3*B__1 - A__34*B__14 - A__4*B__134)*e_1^e_3 + (A*B__14 + A__1*B__4 - A__12*B__24 - A__123*B__234 - A__1234*B__23 + A__124*B__2 - A__13*B__34 + A__134*B__3 + A__14*B + A__2*B__124 - A__23*B__1234 + A__234*B__123 + A__24*B__12 + A__3*B__134 + A__34*B__13 - A__4*B__1)*e_1^e_4 + (A*B__23 + A__1*B__123 - A__12*B__13 + A__123*B__1 + A__1234*B__14 + A__124*B__134 + A__13*B__12 - A__134*B__124 + A__14*B__1234 + A__2*B__3 + A__23*B - A__234*B__4 + A__24*B__34 - A__3*B__2 - A__34*B__24 - A__4*B__234)*e_2^e_3 + (A*B__24 + A__1*B__124 - A__12*B__14 - A__123*B__134 - A__1234*B__13 + A__124*B__1 - A__13*B__1234 + A__134*B__123 + A__14*B__12 + A__2*B__4 - A__23*B__34 + A__234*B__3 + A__24*B + A__3*B__234 + A__34*B__23 - A__4*B__2)*e_2^e_4 + (A*B__34 + A__1*B__134 + A__12*B__1234 + A__123*B__124 + A__1234*B__12 - A__124*B__123 - A__13*B__14 + A__134*B__1 + A__14*B__13 - A__2*B__234 + A__23*B__24 - A__234*B__2 - A__24*B__23 + A__3*B__4 + A__34*B - A__4*B__3)*e_3^e_4 + (A*B__123 + A__1*B__23 + A__12*B__3 + A__123*B - A__1234*B__4 + A__124*B__34 - A__13*B__2 - A__134*B__24 - A__14*B__234 - A__2*B__13 + A__23*B__1 + A__234*B__14 + A__24*B__134 + A__3*B__12 - A__34*B__124 + A__4*B__1234)*e_1^e_2^e_3 + (A*B__124 + A__1*B__24 + A__12*B__4 - A__123*B__34 + A__1234*B__3 + A__124*B + A__13*B__234 + A__134*B__23 - A__14*B__2 - A__2*B__14 - A__23*B__134 - A__234*B__13 + A__24*B__1 - A__3*B__1234 + A__34*B__123 + A__4*B__12)*e_1^e_2^e_4 + (A*B__134 + A__1*B__34 - A__12*B__234 + A__123*B__24 - A__1234*B__2 - A__124*B__23 + A__13*B__4 + A__134*B - A__14*B__3 + A__2*B__1234 + A__23*B__124 + A__234*B__12 - A__24*B__123 - A__3*B__14 + A__34*B__1 + A__4*B__13)*e_1^e_3^e_4 + (A*B__234 + A__1*B__1234 - A__12*B__134 + A__123*B__14 - A__1234*B__1 - A__124*B__13 + A__13*B__124 + A__134*B__12 - A__14*B__123 + A__2*B__34 + A__23*B__4 + A__234*B - A__24*B__3 - A__3*B__24 + A__34*B__2 + A__4*B__23)*e_2^e_3^e_4 + (A*B__1234 + A__1*B__234 + A__12*B__34 + A__123*B__4 + A__1234*B - A__124*B__3 - A__13*B__24 + A__134*B__2 + A__14*B__23 - A__2*B__134 + A__23*B__14 - A__234*B__1 - A__24*B__13 + A__3*B__124 + A__34*B__12 - A__4*B__123)*e_1^e_2^e_3^e_4" 329 ] 330 }, 331 "execution_count": 11, 332 "metadata": {}, 333 "output_type": "execute_result" 334 }, 335 { 336 "name": "stdout", 337 "output_type": "stream", 338 "text": [ 339 "\n" 340 ] 341 } 342 ], 343 "source": [ 344 "@time test_geometric_product(Spacetime)" 345 ] 346 }, 347 { 348 "cell_type": "code", 349 "execution_count": 12, 350 "metadata": {}, 351 "outputs": [ 352 { 353 "name": "stdout", 354 "output_type": "stream", 355 "text": [ 356 " 0.112692 seconds (157 allocations: 5.859 KiB)\n" 357 ] 358 }, 359 { 360 "data": { 361 "text/latex": [ 362 "\\begin{align*}\\left ( A B + A^{1} B^{1} - A^{12} B^{12} + A^{2} B^{2}\\right ) + \\left ( A B^{1} + A^{1} B + A^{12} B^{2} - A^{2} B^{12}\\right ) \\boldsymbol{e}_{1} + \\left ( A B^{2} + A^{1} B^{12} - A^{12} B^{1} + A^{2} B\\right ) \\boldsymbol{e}_{2} + \\left ( A B^{3} + A^{1} B^{13} - A^{12} B^{123} - A^{123} B^{12} - A^{13} B^{1} + A^{2} B^{23} - A^{23} B^{2} + A^{3} B\\right ) \\boldsymbol{e}_{3} + \\left ( A B^{12} + A^{1} B^{2} + A^{12} B - A^{2} B^{1}\\right ) \\boldsymbol{e}_{1}\\wedge \\boldsymbol{e}_{2} + \\left ( A B^{13} + A^{1} B^{3} + A^{12} B^{23} - A^{123} B^{2} + A^{13} B - A^{2} B^{123} - A^{23} B^{12} - A^{3} B^{1}\\right ) \\boldsymbol{e}_{1}\\wedge \\boldsymbol{e}_{3} + \\left ( A B^{23} + A^{1} B^{123} - A^{12} B^{13} + A^{123} B^{1} + A^{13} B^{12} + A^{2} B^{3} + A^{23} B - A^{3} B^{2}\\right ) \\boldsymbol{e}_{2}\\wedge \\boldsymbol{e}_{3} + \\left ( A B^{123} + A^{1} B^{23} + A^{12} B^{3} + A^{123} B - A^{13} B^{2} - A^{2} B^{13} + A^{23} B^{1} + A^{3} B^{12}\\right ) \\boldsymbol{e}_{1}\\wedge \\boldsymbol{e}_{2}\\wedge \\boldsymbol{e}_{3}\\end{align*}" 363 ], 364 "text/plain": [ 365 "A*B + A__1*B__1 - A__12*B__12 + A__2*B__2 + (A*B__1 + A__1*B + A__12*B__2 - A__2*B__12)*e_1 + (A*B__2 + A__1*B__12 - A__12*B__1 + A__2*B)*e_2 + (A*B__3 + A__1*B__13 - A__12*B__123 - A__123*B__12 - A__13*B__1 + A__2*B__23 - A__23*B__2 + A__3*B)*e_3 + (A*B__12 + A__1*B__2 + A__12*B - A__2*B__1)*e_1^e_2 + (A*B__13 + A__1*B__3 + A__12*B__23 - A__123*B__2 + A__13*B - A__2*B__123 - A__23*B__12 - A__3*B__1)*e_1^e_3 + (A*B__23 + A__1*B__123 - A__12*B__13 + A__123*B__1 + A__13*B__12 + A__2*B__3 + A__23*B - A__3*B__2)*e_2^e_3 + (A*B__123 + A__1*B__23 + A__12*B__3 + A__123*B - A__13*B__2 - A__2*B__13 + A__23*B__1 + A__3*B__12)*e_1^e_2^e_3" 366 ] 367 }, 368 "execution_count": 12, 369 "metadata": {}, 370 "output_type": "execute_result" 371 } 372 ], 373 "source": [ 374 "@time test_geometric_product(PGA2D)" 375 ] 376 }, 377 { 378 "cell_type": "code", 379 "execution_count": 13, 380 "metadata": {}, 381 "outputs": [ 382 { 383 "name": "stdout", 384 "output_type": "stream", 385 "text": [ 386 " 0.857979 seconds (157 allocations: 5.859 KiB)\n" 387 ] 388 }, 389 { 390 "data": { 391 "text/latex": [ 392 "\\begin{align*}\\left ( A B + A^{1} B^{1} - A^{12} B^{12} - A^{123} B^{123} - A^{13} B^{13} + A^{2} B^{2} - A^{23} B^{23} + A^{3} B^{3}\\right ) + \\left ( A B^{1} + A^{1} B + A^{12} B^{2} - A^{123} B^{23} + A^{13} B^{3} - A^{2} B^{12} - A^{23} B^{123} - A^{3} B^{13}\\right ) \\boldsymbol{e}_{1} + \\left ( A B^{2} + A^{1} B^{12} - A^{12} B^{1} + A^{123} B^{13} + A^{13} B^{123} + A^{2} B + A^{23} B^{3} - A^{3} B^{23}\\right ) \\boldsymbol{e}_{2} + \\left ( A B^{3} + A^{1} B^{13} - A^{12} B^{123} - A^{123} B^{12} - A^{13} B^{1} + A^{2} B^{23} - A^{23} B^{2} + A^{3} B\\right ) \\boldsymbol{e}_{3} + \\left ( A B^{4} + A^{1} B^{14} - A^{12} B^{124} - A^{123} B^{1234} + A^{1234} B^{123} - A^{124} B^{12} - A^{13} B^{134} - A^{134} B^{13} - A^{14} B^{1} + A^{2} B^{24} - A^{23} B^{234} - A^{234} B^{23} - A^{24} B^{2} + A^{3} B^{34} - A^{34} B^{3} + A^{4} B\\right ) \\boldsymbol{e}_{4} + \\left ( A B^{12} + A^{1} B^{2} + A^{12} B + A^{123} B^{3} - A^{13} B^{23} - A^{2} B^{1} + A^{23} B^{13} + A^{3} B^{123}\\right ) \\boldsymbol{e}_{1}\\wedge \\boldsymbol{e}_{2} + \\left ( A B^{13} + A^{1} B^{3} + A^{12} B^{23} - A^{123} B^{2} + A^{13} B - A^{2} B^{123} - A^{23} B^{12} - A^{3} B^{1}\\right ) \\boldsymbol{e}_{1}\\wedge \\boldsymbol{e}_{3} + \\left ( A B^{14} + A^{1} B^{4} + A^{12} B^{24} - A^{123} B^{234} - A^{1234} B^{23} - A^{124} B^{2} + A^{13} B^{34} - A^{134} B^{3} + A^{14} B - A^{2} B^{124} - A^{23} B^{1234} + A^{234} B^{123} - A^{24} B^{12} - A^{3} B^{134} - A^{34} B^{13} - A^{4} B^{1}\\right ) \\boldsymbol{e}_{1}\\wedge \\boldsymbol{e}_{4} + \\left ( A B^{23} + A^{1} B^{123} - A^{12} B^{13} + A^{123} B^{1} + A^{13} B^{12} + A^{2} B^{3} + A^{23} B - A^{3} B^{2}\\right ) \\boldsymbol{e}_{2}\\wedge \\boldsymbol{e}_{3} + \\left ( A B^{24} + A^{1} B^{124} - A^{12} B^{14} + A^{123} B^{134} + A^{1234} B^{13} + A^{124} B^{1} + A^{13} B^{1234} - A^{134} B^{123} + A^{14} B^{12} + A^{2} B^{4} + A^{23} B^{34} - A^{234} B^{3} + A^{24} B - A^{3} B^{234} - A^{34} B^{23} - A^{4} B^{2}\\right ) \\boldsymbol{e}_{2}\\wedge \\boldsymbol{e}_{4} + \\left ( A B^{34} + A^{1} B^{134} - A^{12} B^{1234} - A^{123} B^{124} - A^{1234} B^{12} + A^{124} B^{123} - A^{13} B^{14} + A^{134} B^{1} + A^{14} B^{13} + A^{2} B^{234} - A^{23} B^{24} + A^{234} B^{2} + A^{24} B^{23} + A^{3} B^{4} + A^{34} B - A^{4} B^{3}\\right ) \\boldsymbol{e}_{3}\\wedge \\boldsymbol{e}_{4} + \\left ( A B^{123} + A^{1} B^{23} + A^{12} B^{3} + A^{123} B - A^{13} B^{2} - A^{2} B^{13} + A^{23} B^{1} + A^{3} B^{12}\\right ) \\boldsymbol{e}_{1}\\wedge \\boldsymbol{e}_{2}\\wedge \\boldsymbol{e}_{3} + \\left ( A B^{124} + A^{1} B^{24} + A^{12} B^{4} + A^{123} B^{34} - A^{1234} B^{3} + A^{124} B - A^{13} B^{234} - A^{134} B^{23} - A^{14} B^{2} - A^{2} B^{14} + A^{23} B^{134} + A^{234} B^{13} + A^{24} B^{1} + A^{3} B^{1234} - A^{34} B^{123} + A^{4} B^{12}\\right ) \\boldsymbol{e}_{1}\\wedge \\boldsymbol{e}_{2}\\wedge \\boldsymbol{e}_{4} + \\left ( A B^{134} + A^{1} B^{34} + A^{12} B^{234} - A^{123} B^{24} + A^{1234} B^{2} + A^{124} B^{23} + A^{13} B^{4} + A^{134} B - A^{14} B^{3} - A^{2} B^{1234} - A^{23} B^{124} - A^{234} B^{12} + A^{24} B^{123} - A^{3} B^{14} + A^{34} B^{1} + A^{4} B^{13}\\right ) \\boldsymbol{e}_{1}\\wedge \\boldsymbol{e}_{3}\\wedge \\boldsymbol{e}_{4} + \\left ( A B^{234} + A^{1} B^{1234} - A^{12} B^{134} + A^{123} B^{14} - A^{1234} B^{1} - A^{124} B^{13} + A^{13} B^{124} + A^{134} B^{12} - A^{14} B^{123} + A^{2} B^{34} + A^{23} B^{4} + A^{234} B - A^{24} B^{3} - A^{3} B^{24} + A^{34} B^{2} + A^{4} B^{23}\\right ) \\boldsymbol{e}_{2}\\wedge \\boldsymbol{e}_{3}\\wedge \\boldsymbol{e}_{4} + \\left ( A B^{1234} + A^{1} B^{234} + A^{12} B^{34} + A^{123} B^{4} + A^{1234} B - A^{124} B^{3} - A^{13} B^{24} + A^{134} B^{2} + A^{14} B^{23} - A^{2} B^{134} + A^{23} B^{14} - A^{234} B^{1} - A^{24} B^{13} + A^{3} B^{124} + A^{34} B^{12} - A^{4} B^{123}\\right ) \\boldsymbol{e}_{1}\\wedge \\boldsymbol{e}_{2}\\wedge \\boldsymbol{e}_{3}\\wedge \\boldsymbol{e}_{4}\\end{align*}" 393 ], 394 "text/plain": [ 395 "A*B + A__1*B__1 - A__12*B__12 - A__123*B__123 - A__13*B__13 + A__2*B__2 - A__23*B__23 + A__3*B__3 + (A*B__1 + A__1*B + A__12*B__2 - A__123*B__23 + A__13*B__3 - A__2*B__12 - A__23*B__123 - A__3*B__13)*e_1 + (A*B__2 + A__1*B__12 - A__12*B__1 + A__123*B__13 + A__13*B__123 + A__2*B + A__23*B__3 - A__3*B__23)*e_2 + (A*B__3 + A__1*B__13 - A__12*B__123 - A__123*B__12 - A__13*B__1 + A__2*B__23 - A__23*B__2 + A__3*B)*e_3 + (A*B__4 + A__1*B__14 - A__12*B__124 - A__123*B__1234 + A__1234*B__123 - A__124*B__12 - A__13*B__134 - A__134*B__13 - A__14*B__1 + A__2*B__24 - A__23*B__234 - A__234*B__23 - A__24*B__2 + A__3*B__34 - A__34*B__3 + A__4*B)*e_4 + (A*B__12 + A__1*B__2 + A__12*B + A__123*B__3 - A__13*B__23 - A__2*B__1 + A__23*B__13 + A__3*B__123)*e_1^e_2 + (A*B__13 + A__1*B__3 + A__12*B__23 - A__123*B__2 + A__13*B - A__2*B__123 - A__23*B__12 - A__3*B__1)*e_1^e_3 + (A*B__14 + A__1*B__4 + A__12*B__24 - A__123*B__234 - A__1234*B__23 - A__124*B__2 + A__13*B__34 - A__134*B__3 + A__14*B - A__2*B__124 - A__23*B__1234 + A__234*B__123 - A__24*B__12 - A__3*B__134 - A__34*B__13 - A__4*B__1)*e_1^e_4 + (A*B__23 + A__1*B__123 - A__12*B__13 + A__123*B__1 + A__13*B__12 + A__2*B__3 + A__23*B - A__3*B__2)*e_2^e_3 + (A*B__24 + A__1*B__124 - A__12*B__14 + A__123*B__134 + A__1234*B__13 + A__124*B__1 + A__13*B__1234 - A__134*B__123 + A__14*B__12 + A__2*B__4 + A__23*B__34 - A__234*B__3 + A__24*B - A__3*B__234 - A__34*B__23 - A__4*B__2)*e_2^e_4 + (A*B__34 + A__1*B__134 - A__12*B__1234 - A__123*B__124 - A__1234*B__12 + A__124*B__123 - A__13*B__14 + A__134*B__1 + A__14*B__13 + A__2*B__234 - A__23*B__24 + A__234*B__2 + A__24*B__23 + A__3*B__4 + A__34*B - A__4*B__3)*e_3^e_4 + (A*B__123 + A__1*B__23 + A__12*B__3 + A__123*B - A__13*B__2 - A__2*B__13 + A__23*B__1 + A__3*B__12)*e_1^e_2^e_3 + (A*B__124 + A__1*B__24 + A__12*B__4 + A__123*B__34 - A__1234*B__3 + A__124*B - A__13*B__234 - A__134*B__23 - A__14*B__2 - A__2*B__14 + A__23*B__134 + A__234*B__13 + A__24*B__1 + A__3*B__1234 - A__34*B__123 + A__4*B__12)*e_1^e_2^e_4 + (A*B__134 + A__1*B__34 + A__12*B__234 - A__123*B__24 + A__1234*B__2 + A__124*B__23 + A__13*B__4 + A__134*B - A__14*B__3 - A__2*B__1234 - A__23*B__124 - A__234*B__12 + A__24*B__123 - A__3*B__14 + A__34*B__1 + A__4*B__13)*e_1^e_3^e_4 + (A*B__234 + A__1*B__1234 - A__12*B__134 + A__123*B__14 - A__1234*B__1 - A__124*B__13 + A__13*B__124 + A__134*B__12 - A__14*B__123 + A__2*B__34 + A__23*B__4 + A__234*B - A__24*B__3 - A__3*B__24 + A__34*B__2 + A__4*B__23)*e_2^e_3^e_4 + (A*B__1234 + A__1*B__234 + A__12*B__34 + A__123*B__4 + A__1234*B - A__124*B__3 - A__13*B__24 + A__134*B__2 + A__14*B__23 - A__2*B__134 + A__23*B__14 - A__234*B__1 - A__24*B__13 + A__3*B__124 + A__34*B__12 - A__4*B__123)*e_1^e_2^e_3^e_4" 396 ] 397 }, 398 "execution_count": 13, 399 "metadata": {}, 400 "output_type": "execute_result" 401 } 402 ], 403 "source": [ 404 "@time test_geometric_product(PGA3D)" 405 ] 406 }, 407 { 408 "cell_type": "code", 409 "execution_count": 14, 410 "metadata": {}, 411 "outputs": [ 412 { 413 "name": "stdout", 414 "output_type": "stream", 415 "text": [ 416 " 1.281144 seconds (157 allocations: 5.859 KiB)\n" 417 ] 418 }, 419 { 420 "data": { 421 "text/latex": [ 422 "\\begin{align*}\\left ( A B + A^{1} B^{1} - A^{12} B^{12} - A^{123} B^{123} - A^{1234} B^{1234} + A^{124} B^{124} - A^{13} B^{13} + A^{134} B^{134} + A^{14} B^{14} + A^{2} B^{2} - A^{23} B^{23} + A^{234} B^{234} + A^{24} B^{24} + A^{3} B^{3} + A^{34} B^{34} - A^{4} B^{4}\\right ) + \\left ( A B^{1} + A^{1} B + A^{12} B^{2} - A^{123} B^{23} + A^{1234} B^{234} + A^{124} B^{24} + A^{13} B^{3} + A^{134} B^{34} - A^{14} B^{4} - A^{2} B^{12} - A^{23} B^{123} - A^{234} B^{1234} + A^{24} B^{124} - A^{3} B^{13} + A^{34} B^{134} + A^{4} B^{14}\\right ) \\boldsymbol{e}_{1} + \\left ( A B^{2} + A^{1} B^{12} - A^{12} B^{1} + A^{123} B^{13} - A^{1234} B^{134} - A^{124} B^{14} + A^{13} B^{123} + A^{134} B^{1234} - A^{14} B^{124} + A^{2} B + A^{23} B^{3} + A^{234} B^{34} - A^{24} B^{4} - A^{3} B^{23} + A^{34} B^{234} + A^{4} B^{24}\\right ) \\boldsymbol{e}_{2} + \\left ( A B^{3} + A^{1} B^{13} - A^{12} B^{123} - A^{123} B^{12} + A^{1234} B^{124} - A^{124} B^{1234} - A^{13} B^{1} - A^{134} B^{14} - A^{14} B^{134} + A^{2} B^{23} - A^{23} B^{2} - A^{234} B^{24} - A^{24} B^{234} + A^{3} B - A^{34} B^{4} + A^{4} B^{34}\\right ) \\boldsymbol{e}_{3} + \\left ( A B^{4} + A^{1} B^{14} - A^{12} B^{124} - A^{123} B^{1234} + A^{1234} B^{123} - A^{124} B^{12} - A^{13} B^{134} - A^{134} B^{13} - A^{14} B^{1} + A^{2} B^{24} - A^{23} B^{234} - A^{234} B^{23} - A^{24} B^{2} + A^{3} B^{34} - A^{34} B^{3} + A^{4} B\\right ) \\boldsymbol{e}_{4} + \\left ( A B^{12} + A^{1} B^{2} + A^{12} B + A^{123} B^{3} + A^{1234} B^{34} - A^{124} B^{4} - A^{13} B^{23} + A^{134} B^{234} + A^{14} B^{24} - A^{2} B^{1} + A^{23} B^{13} - A^{234} B^{134} - A^{24} B^{14} + A^{3} B^{123} + A^{34} B^{1234} - A^{4} B^{124}\\right ) \\boldsymbol{e}_{1}\\wedge \\boldsymbol{e}_{2} + \\left ( A B^{13} + A^{1} B^{3} + A^{12} B^{23} - A^{123} B^{2} - A^{1234} B^{24} - A^{124} B^{234} + A^{13} B - A^{134} B^{4} + A^{14} B^{34} - A^{2} B^{123} - A^{23} B^{12} + A^{234} B^{124} - A^{24} B^{1234} - A^{3} B^{1} - A^{34} B^{14} - A^{4} B^{134}\\right ) \\boldsymbol{e}_{1}\\wedge \\boldsymbol{e}_{3} + \\left ( A B^{14} + A^{1} B^{4} + A^{12} B^{24} - A^{123} B^{234} - A^{1234} B^{23} - A^{124} B^{2} + A^{13} B^{34} - A^{134} B^{3} + A^{14} B - A^{2} B^{124} - A^{23} B^{1234} + A^{234} B^{123} - A^{24} B^{12} - A^{3} B^{134} - A^{34} B^{13} - A^{4} B^{1}\\right ) \\boldsymbol{e}_{1}\\wedge \\boldsymbol{e}_{4} + \\left ( A B^{23} + A^{1} B^{123} - A^{12} B^{13} + A^{123} B^{1} + A^{1234} B^{14} + A^{124} B^{134} + A^{13} B^{12} - A^{134} B^{124} + A^{14} B^{1234} + A^{2} B^{3} + A^{23} B - A^{234} B^{4} + A^{24} B^{34} - A^{3} B^{2} - A^{34} B^{24} - A^{4} B^{234}\\right ) \\boldsymbol{e}_{2}\\wedge \\boldsymbol{e}_{3} + \\left ( A B^{24} + A^{1} B^{124} - A^{12} B^{14} + A^{123} B^{134} + A^{1234} B^{13} + A^{124} B^{1} + A^{13} B^{1234} - A^{134} B^{123} + A^{14} B^{12} + A^{2} B^{4} + A^{23} B^{34} - A^{234} B^{3} + A^{24} B - A^{3} B^{234} - A^{34} B^{23} - A^{4} B^{2}\\right ) \\boldsymbol{e}_{2}\\wedge \\boldsymbol{e}_{4} + \\left ( A B^{34} + A^{1} B^{134} - A^{12} B^{1234} - A^{123} B^{124} - A^{1234} B^{12} + A^{124} B^{123} - A^{13} B^{14} + A^{134} B^{1} + A^{14} B^{13} + A^{2} B^{234} - A^{23} B^{24} + A^{234} B^{2} + A^{24} B^{23} + A^{3} B^{4} + A^{34} B - A^{4} B^{3}\\right ) \\boldsymbol{e}_{3}\\wedge \\boldsymbol{e}_{4} + \\left ( A B^{123} + A^{1} B^{23} + A^{12} B^{3} + A^{123} B - A^{1234} B^{4} + A^{124} B^{34} - A^{13} B^{2} - A^{134} B^{24} - A^{14} B^{234} - A^{2} B^{13} + A^{23} B^{1} + A^{234} B^{14} + A^{24} B^{134} + A^{3} B^{12} - A^{34} B^{124} + A^{4} B^{1234}\\right ) \\boldsymbol{e}_{1}\\wedge \\boldsymbol{e}_{2}\\wedge \\boldsymbol{e}_{3} + \\left ( A B^{124} + A^{1} B^{24} + A^{12} B^{4} + A^{123} B^{34} - A^{1234} B^{3} + A^{124} B - A^{13} B^{234} - A^{134} B^{23} - A^{14} B^{2} - A^{2} B^{14} + A^{23} B^{134} + A^{234} B^{13} + A^{24} B^{1} + A^{3} B^{1234} - A^{34} B^{123} + A^{4} B^{12}\\right ) \\boldsymbol{e}_{1}\\wedge \\boldsymbol{e}_{2}\\wedge \\boldsymbol{e}_{4} + \\left ( A B^{134} + A^{1} B^{34} + A^{12} B^{234} - A^{123} B^{24} + A^{1234} B^{2} + A^{124} B^{23} + A^{13} B^{4} + A^{134} B - A^{14} B^{3} - A^{2} B^{1234} - A^{23} B^{124} - A^{234} B^{12} + A^{24} B^{123} - A^{3} B^{14} + A^{34} B^{1} + A^{4} B^{13}\\right ) \\boldsymbol{e}_{1}\\wedge \\boldsymbol{e}_{3}\\wedge \\boldsymbol{e}_{4} + \\left ( A B^{234} + A^{1} B^{1234} - A^{12} B^{134} + A^{123} B^{14} - A^{1234} B^{1} - A^{124} B^{13} + A^{13} B^{124} + A^{134} B^{12} - A^{14} B^{123} + A^{2} B^{34} + A^{23} B^{4} + A^{234} B - A^{24} B^{3} - A^{3} B^{24} + A^{34} B^{2} + A^{4} B^{23}\\right ) \\boldsymbol{e}_{2}\\wedge \\boldsymbol{e}_{3}\\wedge \\boldsymbol{e}_{4} + \\left ( A B^{1234} + A^{1} B^{234} + A^{12} B^{34} + A^{123} B^{4} + A^{1234} B - A^{124} B^{3} - A^{13} B^{24} + A^{134} B^{2} + A^{14} B^{23} - A^{2} B^{134} + A^{23} B^{14} - A^{234} B^{1} - A^{24} B^{13} + A^{3} B^{124} + A^{34} B^{12} - A^{4} B^{123}\\right ) \\boldsymbol{e}_{1}\\wedge \\boldsymbol{e}_{2}\\wedge \\boldsymbol{e}_{3}\\wedge \\boldsymbol{e}_{4}\\end{align*}" 423 ], 424 "text/plain": [ 425 "A*B + A__1*B__1 - A__12*B__12 - A__123*B__123 - A__1234*B__1234 + A__124*B__124 - A__13*B__13 + A__134*B__134 + A__14*B__14 + A__2*B__2 - A__23*B__23 + A__234*B__234 + A__24*B__24 + A__3*B__3 + A__34*B__34 - A__4*B__4 + (A*B__1 + A__1*B + A__12*B__2 - A__123*B__23 + A__1234*B__234 + A__124*B__24 + A__13*B__3 + A__134*B__34 - A__14*B__4 - A__2*B__12 - A__23*B__123 - A__234*B__1234 + A__24*B__124 - A__3*B__13 + A__34*B__134 + A__4*B__14)*e_1 + (A*B__2 + A__1*B__12 - A__12*B__1 + A__123*B__13 - A__1234*B__134 - A__124*B__14 + A__13*B__123 + A__134*B__1234 - A__14*B__124 + A__2*B + A__23*B__3 + A__234*B__34 - A__24*B__4 - A__3*B__23 + A__34*B__234 + A__4*B__24)*e_2 + (A*B__3 + A__1*B__13 - A__12*B__123 - A__123*B__12 + A__1234*B__124 - A__124*B__1234 - A__13*B__1 - A__134*B__14 - A__14*B__134 + A__2*B__23 - A__23*B__2 - A__234*B__24 - A__24*B__234 + A__3*B - A__34*B__4 + A__4*B__34)*e_3 + (A*B__4 + A__1*B__14 - A__12*B__124 - A__123*B__1234 + A__1234*B__123 - A__124*B__12 - A__13*B__134 - A__134*B__13 - A__14*B__1 + A__2*B__24 - A__23*B__234 - A__234*B__23 - A__24*B__2 + A__3*B__34 - A__34*B__3 + A__4*B)*e_4 + (A*B__12 + A__1*B__2 + A__12*B + A__123*B__3 + A__1234*B__34 - A__124*B__4 - A__13*B__23 + A__134*B__234 + A__14*B__24 - A__2*B__1 + A__23*B__13 - A__234*B__134 - A__24*B__14 + A__3*B__123 + A__34*B__1234 - A__4*B__124)*e_1^e_2 + (A*B__13 + A__1*B__3 + A__12*B__23 - A__123*B__2 - A__1234*B__24 - A__124*B__234 + A__13*B - A__134*B__4 + A__14*B__34 - A__2*B__123 - A__23*B__12 + A__234*B__124 - A__24*B__1234 - A__3*B__1 - A__34*B__14 - A__4*B__134)*e_1^e_3 + (A*B__14 + A__1*B__4 + A__12*B__24 - A__123*B__234 - A__1234*B__23 - A__124*B__2 + A__13*B__34 - A__134*B__3 + A__14*B - A__2*B__124 - A__23*B__1234 + A__234*B__123 - A__24*B__12 - A__3*B__134 - A__34*B__13 - A__4*B__1)*e_1^e_4 + (A*B__23 + A__1*B__123 - A__12*B__13 + A__123*B__1 + A__1234*B__14 + A__124*B__134 + A__13*B__12 - A__134*B__124 + A__14*B__1234 + A__2*B__3 + A__23*B - A__234*B__4 + A__24*B__34 - A__3*B__2 - A__34*B__24 - A__4*B__234)*e_2^e_3 + (A*B__24 + A__1*B__124 - A__12*B__14 + A__123*B__134 + A__1234*B__13 + A__124*B__1 + A__13*B__1234 - A__134*B__123 + A__14*B__12 + A__2*B__4 + A__23*B__34 - A__234*B__3 + A__24*B - A__3*B__234 - A__34*B__23 - A__4*B__2)*e_2^e_4 + (A*B__34 + A__1*B__134 - A__12*B__1234 - A__123*B__124 - A__1234*B__12 + A__124*B__123 - A__13*B__14 + A__134*B__1 + A__14*B__13 + A__2*B__234 - A__23*B__24 + A__234*B__2 + A__24*B__23 + A__3*B__4 + A__34*B - A__4*B__3)*e_3^e_4 + (A*B__123 + A__1*B__23 + A__12*B__3 + A__123*B - A__1234*B__4 + A__124*B__34 - A__13*B__2 - A__134*B__24 - A__14*B__234 - A__2*B__13 + A__23*B__1 + A__234*B__14 + A__24*B__134 + A__3*B__12 - A__34*B__124 + A__4*B__1234)*e_1^e_2^e_3 + (A*B__124 + A__1*B__24 + A__12*B__4 + A__123*B__34 - A__1234*B__3 + A__124*B - A__13*B__234 - A__134*B__23 - A__14*B__2 - A__2*B__14 + A__23*B__134 + A__234*B__13 + A__24*B__1 + A__3*B__1234 - A__34*B__123 + A__4*B__12)*e_1^e_2^e_4 + (A*B__134 + A__1*B__34 + A__12*B__234 - A__123*B__24 + A__1234*B__2 + A__124*B__23 + A__13*B__4 + A__134*B - A__14*B__3 - A__2*B__1234 - A__23*B__124 - A__234*B__12 + A__24*B__123 - A__3*B__14 + A__34*B__1 + A__4*B__13)*e_1^e_3^e_4 + (A*B__234 + A__1*B__1234 - A__12*B__134 + A__123*B__14 - A__1234*B__1 - A__124*B__13 + A__13*B__124 + A__134*B__12 - A__14*B__123 + A__2*B__34 + A__23*B__4 + A__234*B - A__24*B__3 - A__3*B__24 + A__34*B__2 + A__4*B__23)*e_2^e_3^e_4 + (A*B__1234 + A__1*B__234 + A__12*B__34 + A__123*B__4 + A__1234*B - A__124*B__3 - A__13*B__24 + A__134*B__2 + A__14*B__23 - A__2*B__134 + A__23*B__14 - A__234*B__1 - A__24*B__13 + A__3*B__124 + A__34*B__12 - A__4*B__123)*e_1^e_2^e_3^e_4" 426 ] 427 }, 428 "execution_count": 14, 429 "metadata": {}, 430 "output_type": "execute_result" 431 } 432 ], 433 "source": [ 434 "@time test_geometric_product(CGA2D)" 435 ] 436 }, 437 { 438 "cell_type": "code", 439 "execution_count": 15, 440 "metadata": { 441 "scrolled": false 442 }, 443 "outputs": [ 444 { 445 "name": "stdout", 446 "output_type": "stream", 447 "text": [ 448 " 14.452170 seconds (157 allocations: 5.859 KiB)\n" 449 ] 450 }, 451 { 452 "data": { 453 "text/latex": [ 454 "\\begin{align*}\\left ( A B + A^{1} B^{1} - A^{12} B^{12} - A^{123} B^{123} + A^{1234} B^{1234} - A^{12345} B^{12345} - A^{1235} B^{1235} - A^{124} B^{124} - A^{1245} B^{1245} + A^{125} B^{125} - A^{13} B^{13} - A^{134} B^{134} - A^{1345} B^{1345} + A^{135} B^{135} - A^{14} B^{14} + A^{145} B^{145} + A^{15} B^{15} + A^{2} B^{2} - A^{23} B^{23} - A^{234} B^{234} - A^{2345} B^{2345} + A^{235} B^{235} - A^{24} B^{24} + A^{245} B^{245} + A^{25} B^{25} + A^{3} B^{3} - A^{34} B^{34} + A^{345} B^{345} + A^{35} B^{35} + A^{4} B^{4} + A^{45} B^{45} - A^{5} B^{5}\\right ) + \\left ( A B^{1} + A^{1} B + A^{12} B^{2} - A^{123} B^{23} - A^{1234} B^{234} - A^{12345} B^{2345} + A^{1235} B^{235} - A^{124} B^{24} + A^{1245} B^{245} + A^{125} B^{25} + A^{13} B^{3} - A^{134} B^{34} + A^{1345} B^{345} + A^{135} B^{35} + A^{14} B^{4} + A^{145} B^{45} - A^{15} B^{5} - A^{2} B^{12} - A^{23} B^{123} + A^{234} B^{1234} - A^{2345} B^{12345} - A^{235} B^{1235} - A^{24} B^{124} - A^{245} B^{1245} + A^{25} B^{125} - A^{3} B^{13} - A^{34} B^{134} - A^{345} B^{1345} + A^{35} B^{135} - A^{4} B^{14} + A^{45} B^{145} + A^{5} B^{15}\\right ) \\boldsymbol{e}_{1} + \\left ( A B^{2} + A^{1} B^{12} - A^{12} B^{1} + A^{123} B^{13} + A^{1234} B^{134} + A^{12345} B^{1345} - A^{1235} B^{135} + A^{124} B^{14} - A^{1245} B^{145} - A^{125} B^{15} + A^{13} B^{123} - A^{134} B^{1234} + A^{1345} B^{12345} + A^{135} B^{1235} + A^{14} B^{124} + A^{145} B^{1245} - A^{15} B^{125} + A^{2} B + A^{23} B^{3} - A^{234} B^{34} + A^{2345} B^{345} + A^{235} B^{35} + A^{24} B^{4} + A^{245} B^{45} - A^{25} B^{5} - A^{3} B^{23} - A^{34} B^{234} - A^{345} B^{2345} + A^{35} B^{235} - A^{4} B^{24} + A^{45} B^{245} + A^{5} B^{25}\\right ) \\boldsymbol{e}_{2} + \\left ( A B^{3} + A^{1} B^{13} - A^{12} B^{123} - A^{123} B^{12} - A^{1234} B^{124} - A^{12345} B^{1245} + A^{1235} B^{125} + A^{124} B^{1234} - A^{1245} B^{12345} - A^{125} B^{1235} - A^{13} B^{1} + A^{134} B^{14} - A^{1345} B^{145} - A^{135} B^{15} + A^{14} B^{134} + A^{145} B^{1345} - A^{15} B^{135} + A^{2} B^{23} - A^{23} B^{2} + A^{234} B^{24} - A^{2345} B^{245} - A^{235} B^{25} + A^{24} B^{234} + A^{245} B^{2345} - A^{25} B^{235} + A^{3} B + A^{34} B^{4} + A^{345} B^{45} - A^{35} B^{5} - A^{4} B^{34} + A^{45} B^{345} + A^{5} B^{35}\\right ) \\boldsymbol{e}_{3} + \\left ( A B^{4} + A^{1} B^{14} - A^{12} B^{124} - A^{123} B^{1234} + A^{1234} B^{123} + A^{12345} B^{1235} + A^{1235} B^{12345} - A^{124} B^{12} + A^{1245} B^{125} - A^{125} B^{1245} - A^{13} B^{134} - A^{134} B^{13} + A^{1345} B^{135} - A^{135} B^{1345} - A^{14} B^{1} - A^{145} B^{15} - A^{15} B^{145} + A^{2} B^{24} - A^{23} B^{234} - A^{234} B^{23} + A^{2345} B^{235} - A^{235} B^{2345} - A^{24} B^{2} - A^{245} B^{25} - A^{25} B^{245} + A^{3} B^{34} - A^{34} B^{3} - A^{345} B^{35} - A^{35} B^{345} + A^{4} B - A^{45} B^{5} + A^{5} B^{45}\\right ) \\boldsymbol{e}_{4} + \\left ( A B^{5} + A^{1} B^{15} - A^{12} B^{125} - A^{123} B^{1235} + A^{1234} B^{12345} + A^{12345} B^{1234} + A^{1235} B^{123} - A^{124} B^{1245} + A^{1245} B^{124} - A^{125} B^{12} - A^{13} B^{135} - A^{134} B^{1345} + A^{1345} B^{134} - A^{135} B^{13} - A^{14} B^{145} - A^{145} B^{14} - A^{15} B^{1} + A^{2} B^{25} - A^{23} B^{235} - A^{234} B^{2345} + A^{2345} B^{234} - A^{235} B^{23} - A^{24} B^{245} - A^{245} B^{24} - A^{25} B^{2} + A^{3} B^{35} - A^{34} B^{345} - A^{345} B^{34} - A^{35} B^{3} + A^{4} B^{45} - A^{45} B^{4} + A^{5} B\\right ) \\boldsymbol{e}_{5} + \\left ( A B^{12} + A^{1} B^{2} + A^{12} B + A^{123} B^{3} - A^{1234} B^{34} + A^{12345} B^{345} + A^{1235} B^{35} + A^{124} B^{4} + A^{1245} B^{45} - A^{125} B^{5} - A^{13} B^{23} - A^{134} B^{234} - A^{1345} B^{2345} + A^{135} B^{235} - A^{14} B^{24} + A^{145} B^{245} + A^{15} B^{25} - A^{2} B^{1} + A^{23} B^{13} + A^{234} B^{134} + A^{2345} B^{1345} - A^{235} B^{135} + A^{24} B^{14} - A^{245} B^{145} - A^{25} B^{15} + A^{3} B^{123} - A^{34} B^{1234} + A^{345} B^{12345} + A^{35} B^{1235} + A^{4} B^{124} + A^{45} B^{1245} - A^{5} B^{125}\\right ) \\boldsymbol{e}_{1}\\wedge \\boldsymbol{e}_{2} + \\left ( A B^{13} + A^{1} B^{3} + A^{12} B^{23} - A^{123} B^{2} + A^{1234} B^{24} - A^{12345} B^{245} - A^{1235} B^{25} + A^{124} B^{234} + A^{1245} B^{2345} - A^{125} B^{235} + A^{13} B + A^{134} B^{4} + A^{1345} B^{45} - A^{135} B^{5} - A^{14} B^{34} + A^{145} B^{345} + A^{15} B^{35} - A^{2} B^{123} - A^{23} B^{12} - A^{234} B^{124} - A^{2345} B^{1245} + A^{235} B^{125} + A^{24} B^{1234} - A^{245} B^{12345} - A^{25} B^{1235} - A^{3} B^{1} + A^{34} B^{14} - A^{345} B^{145} - A^{35} B^{15} + A^{4} B^{134} + A^{45} B^{1345} - A^{5} B^{135}\\right ) \\boldsymbol{e}_{1}\\wedge \\boldsymbol{e}_{3} + \\left ( A B^{14} + A^{1} B^{4} + A^{12} B^{24} - A^{123} B^{234} - A^{1234} B^{23} + A^{12345} B^{235} - A^{1235} B^{2345} - A^{124} B^{2} - A^{1245} B^{25} - A^{125} B^{245} + A^{13} B^{34} - A^{134} B^{3} - A^{1345} B^{35} - A^{135} B^{345} + A^{14} B - A^{145} B^{5} + A^{15} B^{45} - A^{2} B^{124} - A^{23} B^{1234} + A^{234} B^{123} + A^{2345} B^{1235} + A^{235} B^{12345} - A^{24} B^{12} + A^{245} B^{125} - A^{25} B^{1245} - A^{3} B^{134} - A^{34} B^{13} + A^{345} B^{135} - A^{35} B^{1345} - A^{4} B^{1} - A^{45} B^{15} - A^{5} B^{145}\\right ) \\boldsymbol{e}_{1}\\wedge \\boldsymbol{e}_{4} + \\left ( A B^{15} + A^{1} B^{5} + A^{12} B^{25} - A^{123} B^{235} - A^{1234} B^{2345} + A^{12345} B^{234} - A^{1235} B^{23} - A^{124} B^{245} - A^{1245} B^{24} - A^{125} B^{2} + A^{13} B^{35} - A^{134} B^{345} - A^{1345} B^{34} - A^{135} B^{3} + A^{14} B^{45} - A^{145} B^{4} + A^{15} B - A^{2} B^{125} - A^{23} B^{1235} + A^{234} B^{12345} + A^{2345} B^{1234} + A^{235} B^{123} - A^{24} B^{1245} + A^{245} B^{124} - A^{25} B^{12} - A^{3} B^{135} - A^{34} B^{1345} + A^{345} B^{134} - A^{35} B^{13} - A^{4} B^{145} - A^{45} B^{14} - A^{5} B^{1}\\right ) \\boldsymbol{e}_{1}\\wedge \\boldsymbol{e}_{5} + \\left ( A B^{23} + A^{1} B^{123} - A^{12} B^{13} + A^{123} B^{1} - A^{1234} B^{14} + A^{12345} B^{145} + A^{1235} B^{15} - A^{124} B^{134} - A^{1245} B^{1345} + A^{125} B^{135} + A^{13} B^{12} + A^{134} B^{124} + A^{1345} B^{1245} - A^{135} B^{125} - A^{14} B^{1234} + A^{145} B^{12345} + A^{15} B^{1235} + A^{2} B^{3} + A^{23} B + A^{234} B^{4} + A^{2345} B^{45} - A^{235} B^{5} - A^{24} B^{34} + A^{245} B^{345} + A^{25} B^{35} - A^{3} B^{2} + A^{34} B^{24} - A^{345} B^{245} - A^{35} B^{25} + A^{4} B^{234} + A^{45} B^{2345} - A^{5} B^{235}\\right ) \\boldsymbol{e}_{2}\\wedge \\boldsymbol{e}_{3} + \\left ( A B^{24} + A^{1} B^{124} - A^{12} B^{14} + A^{123} B^{134} + A^{1234} B^{13} - A^{12345} B^{135} + A^{1235} B^{1345} + A^{124} B^{1} + A^{1245} B^{15} + A^{125} B^{145} + A^{13} B^{1234} - A^{134} B^{123} - A^{1345} B^{1235} - A^{135} B^{12345} + A^{14} B^{12} - A^{145} B^{125} + A^{15} B^{1245} + A^{2} B^{4} + A^{23} B^{34} - A^{234} B^{3} - A^{2345} B^{35} - A^{235} B^{345} + A^{24} B - A^{245} B^{5} + A^{25} B^{45} - A^{3} B^{234} - A^{34} B^{23} + A^{345} B^{235} - A^{35} B^{2345} - A^{4} B^{2} - A^{45} B^{25} - A^{5} B^{245}\\right ) \\boldsymbol{e}_{2}\\wedge \\boldsymbol{e}_{4} + \\left ( A B^{25} + A^{1} B^{125} - A^{12} B^{15} + A^{123} B^{135} + A^{1234} B^{1345} - A^{12345} B^{134} + A^{1235} B^{13} + A^{124} B^{145} + A^{1245} B^{14} + A^{125} B^{1} + A^{13} B^{1235} - A^{134} B^{12345} - A^{1345} B^{1234} - A^{135} B^{123} + A^{14} B^{1245} - A^{145} B^{124} + A^{15} B^{12} + A^{2} B^{5} + A^{23} B^{35} - A^{234} B^{345} - A^{2345} B^{34} - A^{235} B^{3} + A^{24} B^{45} - A^{245} B^{4} + A^{25} B - A^{3} B^{235} - A^{34} B^{2345} + A^{345} B^{234} - A^{35} B^{23} - A^{4} B^{245} - A^{45} B^{24} - A^{5} B^{2}\\right ) \\boldsymbol{e}_{2}\\wedge \\boldsymbol{e}_{5} + \\left ( A B^{34} + A^{1} B^{134} - A^{12} B^{1234} - A^{123} B^{124} - A^{1234} B^{12} + A^{12345} B^{125} - A^{1235} B^{1245} + A^{124} B^{123} + A^{1245} B^{1235} + A^{125} B^{12345} - A^{13} B^{14} + A^{134} B^{1} + A^{1345} B^{15} + A^{135} B^{145} + A^{14} B^{13} - A^{145} B^{135} + A^{15} B^{1345} + A^{2} B^{234} - A^{23} B^{24} + A^{234} B^{2} + A^{2345} B^{25} + A^{235} B^{245} + A^{24} B^{23} - A^{245} B^{235} + A^{25} B^{2345} + A^{3} B^{4} + A^{34} B - A^{345} B^{5} + A^{35} B^{45} - A^{4} B^{3} - A^{45} B^{35} - A^{5} B^{345}\\right ) \\boldsymbol{e}_{3}\\wedge \\boldsymbol{e}_{4} + \\left ( A B^{35} + A^{1} B^{135} - A^{12} B^{1235} - A^{123} B^{125} - A^{1234} B^{1245} + A^{12345} B^{124} - A^{1235} B^{12} + A^{124} B^{12345} + A^{1245} B^{1234} + A^{125} B^{123} - A^{13} B^{15} + A^{134} B^{145} + A^{1345} B^{14} + A^{135} B^{1} + A^{14} B^{1345} - A^{145} B^{134} + A^{15} B^{13} + A^{2} B^{235} - A^{23} B^{25} + A^{234} B^{245} + A^{2345} B^{24} + A^{235} B^{2} + A^{24} B^{2345} - A^{245} B^{234} + A^{25} B^{23} + A^{3} B^{5} + A^{34} B^{45} - A^{345} B^{4} + A^{35} B - A^{4} B^{345} - A^{45} B^{34} - A^{5} B^{3}\\right ) \\boldsymbol{e}_{3}\\wedge \\boldsymbol{e}_{5} + \\left ( A B^{45} + A^{1} B^{145} - A^{12} B^{1245} - A^{123} B^{12345} + A^{1234} B^{1235} - A^{12345} B^{123} - A^{1235} B^{1234} - A^{124} B^{125} - A^{1245} B^{12} + A^{125} B^{124} - A^{13} B^{1345} - A^{134} B^{135} - A^{1345} B^{13} + A^{135} B^{134} - A^{14} B^{15} + A^{145} B^{1} + A^{15} B^{14} + A^{2} B^{245} - A^{23} B^{2345} - A^{234} B^{235} - A^{2345} B^{23} + A^{235} B^{234} - A^{24} B^{25} + A^{245} B^{2} + A^{25} B^{24} + A^{3} B^{345} - A^{34} B^{35} + A^{345} B^{3} + A^{35} B^{34} + A^{4} B^{5} + A^{45} B - A^{5} B^{4}\\right ) \\boldsymbol{e}_{4}\\wedge \\boldsymbol{e}_{5} + \\left ( A B^{123} + A^{1} B^{23} + A^{12} B^{3} + A^{123} B + A^{1234} B^{4} + A^{12345} B^{45} - A^{1235} B^{5} - A^{124} B^{34} + A^{1245} B^{345} + A^{125} B^{35} - A^{13} B^{2} + A^{134} B^{24} - A^{1345} B^{245} - A^{135} B^{25} + A^{14} B^{234} + A^{145} B^{2345} - A^{15} B^{235} - A^{2} B^{13} + A^{23} B^{1} - A^{234} B^{14} + A^{2345} B^{145} + A^{235} B^{15} - A^{24} B^{134} - A^{245} B^{1345} + A^{25} B^{135} + A^{3} B^{12} + A^{34} B^{124} + A^{345} B^{1245} - A^{35} B^{125} - A^{4} B^{1234} + A^{45} B^{12345} + A^{5} B^{1235}\\right ) \\boldsymbol{e}_{1}\\wedge \\boldsymbol{e}_{2}\\wedge \\boldsymbol{e}_{3} + \\left ( A B^{124} + A^{1} B^{24} + A^{12} B^{4} + A^{123} B^{34} - A^{1234} B^{3} - A^{12345} B^{35} - A^{1235} B^{345} + A^{124} B - A^{1245} B^{5} + A^{125} B^{45} - A^{13} B^{234} - A^{134} B^{23} + A^{1345} B^{235} - A^{135} B^{2345} - A^{14} B^{2} - A^{145} B^{25} - A^{15} B^{245} - A^{2} B^{14} + A^{23} B^{134} + A^{234} B^{13} - A^{2345} B^{135} + A^{235} B^{1345} + A^{24} B^{1} + A^{245} B^{15} + A^{25} B^{145} + A^{3} B^{1234} - A^{34} B^{123} - A^{345} B^{1235} - A^{35} B^{12345} + A^{4} B^{12} - A^{45} B^{125} + A^{5} B^{1245}\\right ) \\boldsymbol{e}_{1}\\wedge \\boldsymbol{e}_{2}\\wedge \\boldsymbol{e}_{4} + \\left ( A B^{125} + A^{1} B^{25} + A^{12} B^{5} + A^{123} B^{35} - A^{1234} B^{345} - A^{12345} B^{34} - A^{1235} B^{3} + A^{124} B^{45} - A^{1245} B^{4} + A^{125} B - A^{13} B^{235} - A^{134} B^{2345} + A^{1345} B^{234} - A^{135} B^{23} - A^{14} B^{245} - A^{145} B^{24} - A^{15} B^{2} - A^{2} B^{15} + A^{23} B^{135} + A^{234} B^{1345} - A^{2345} B^{134} + A^{235} B^{13} + A^{24} B^{145} + A^{245} B^{14} + A^{25} B^{1} + A^{3} B^{1235} - A^{34} B^{12345} - A^{345} B^{1234} - A^{35} B^{123} + A^{4} B^{1245} - A^{45} B^{124} + A^{5} B^{12}\\right ) \\boldsymbol{e}_{1}\\wedge \\boldsymbol{e}_{2}\\wedge \\boldsymbol{e}_{5} + \\left ( A B^{134} + A^{1} B^{34} + A^{12} B^{234} - A^{123} B^{24} + A^{1234} B^{2} + A^{12345} B^{25} + A^{1235} B^{245} + A^{124} B^{23} - A^{1245} B^{235} + A^{125} B^{2345} + A^{13} B^{4} + A^{134} B - A^{1345} B^{5} + A^{135} B^{45} - A^{14} B^{3} - A^{145} B^{35} - A^{15} B^{345} - A^{2} B^{1234} - A^{23} B^{124} - A^{234} B^{12} + A^{2345} B^{125} - A^{235} B^{1245} + A^{24} B^{123} + A^{245} B^{1235} + A^{25} B^{12345} - A^{3} B^{14} + A^{34} B^{1} + A^{345} B^{15} + A^{35} B^{145} + A^{4} B^{13} - A^{45} B^{135} + A^{5} B^{1345}\\right ) \\boldsymbol{e}_{1}\\wedge \\boldsymbol{e}_{3}\\wedge \\boldsymbol{e}_{4} + \\left ( A B^{135} + A^{1} B^{35} + A^{12} B^{235} - A^{123} B^{25} + A^{1234} B^{245} + A^{12345} B^{24} + A^{1235} B^{2} + A^{124} B^{2345} - A^{1245} B^{234} + A^{125} B^{23} + A^{13} B^{5} + A^{134} B^{45} - A^{1345} B^{4} + A^{135} B - A^{14} B^{345} - A^{145} B^{34} - A^{15} B^{3} - A^{2} B^{1235} - A^{23} B^{125} - A^{234} B^{1245} + A^{2345} B^{124} - A^{235} B^{12} + A^{24} B^{12345} + A^{245} B^{1234} + A^{25} B^{123} - A^{3} B^{15} + A^{34} B^{145} + A^{345} B^{14} + A^{35} B^{1} + A^{4} B^{1345} - A^{45} B^{134} + A^{5} B^{13}\\right ) \\boldsymbol{e}_{1}\\wedge \\boldsymbol{e}_{3}\\wedge \\boldsymbol{e}_{5} + \\left ( A B^{145} + A^{1} B^{45} + A^{12} B^{245} - A^{123} B^{2345} - A^{1234} B^{235} - A^{12345} B^{23} + A^{1235} B^{234} - A^{124} B^{25} + A^{1245} B^{2} + A^{125} B^{24} + A^{13} B^{345} - A^{134} B^{35} + A^{1345} B^{3} + A^{135} B^{34} + A^{14} B^{5} + A^{145} B - A^{15} B^{4} - A^{2} B^{1245} - A^{23} B^{12345} + A^{234} B^{1235} - A^{2345} B^{123} - A^{235} B^{1234} - A^{24} B^{125} - A^{245} B^{12} + A^{25} B^{124} - A^{3} B^{1345} - A^{34} B^{135} - A^{345} B^{13} + A^{35} B^{134} - A^{4} B^{15} + A^{45} B^{1} + A^{5} B^{14}\\right ) \\boldsymbol{e}_{1}\\wedge \\boldsymbol{e}_{4}\\wedge \\boldsymbol{e}_{5} + \\left ( A B^{234} + A^{1} B^{1234} - A^{12} B^{134} + A^{123} B^{14} - A^{1234} B^{1} - A^{12345} B^{15} - A^{1235} B^{145} - A^{124} B^{13} + A^{1245} B^{135} - A^{125} B^{1345} + A^{13} B^{124} + A^{134} B^{12} - A^{1345} B^{125} + A^{135} B^{1245} - A^{14} B^{123} - A^{145} B^{1235} - A^{15} B^{12345} + A^{2} B^{34} + A^{23} B^{4} + A^{234} B - A^{2345} B^{5} + A^{235} B^{45} - A^{24} B^{3} - A^{245} B^{35} - A^{25} B^{345} - A^{3} B^{24} + A^{34} B^{2} + A^{345} B^{25} + A^{35} B^{245} + A^{4} B^{23} - A^{45} B^{235} + A^{5} B^{2345}\\right ) \\boldsymbol{e}_{2}\\wedge \\boldsymbol{e}_{3}\\wedge \\boldsymbol{e}_{4} + \\left ( A B^{235} + A^{1} B^{1235} - A^{12} B^{135} + A^{123} B^{15} - A^{1234} B^{145} - A^{12345} B^{14} - A^{1235} B^{1} - A^{124} B^{1345} + A^{1245} B^{134} - A^{125} B^{13} + A^{13} B^{125} + A^{134} B^{1245} - A^{1345} B^{124} + A^{135} B^{12} - A^{14} B^{12345} - A^{145} B^{1234} - A^{15} B^{123} + A^{2} B^{35} + A^{23} B^{5} + A^{234} B^{45} - A^{2345} B^{4} + A^{235} B - A^{24} B^{345} - A^{245} B^{34} - A^{25} B^{3} - A^{3} B^{25} + A^{34} B^{245} + A^{345} B^{24} + A^{35} B^{2} + A^{4} B^{2345} - A^{45} B^{234} + A^{5} B^{23}\\right ) \\boldsymbol{e}_{2}\\wedge \\boldsymbol{e}_{3}\\wedge \\boldsymbol{e}_{5} + \\left ( A B^{245} + A^{1} B^{1245} - A^{12} B^{145} + A^{123} B^{1345} + A^{1234} B^{135} + A^{12345} B^{13} - A^{1235} B^{134} + A^{124} B^{15} - A^{1245} B^{1} - A^{125} B^{14} + A^{13} B^{12345} - A^{134} B^{1235} + A^{1345} B^{123} + A^{135} B^{1234} + A^{14} B^{125} + A^{145} B^{12} - A^{15} B^{124} + A^{2} B^{45} + A^{23} B^{345} - A^{234} B^{35} + A^{2345} B^{3} + A^{235} B^{34} + A^{24} B^{5} + A^{245} B - A^{25} B^{4} - A^{3} B^{2345} - A^{34} B^{235} - A^{345} B^{23} + A^{35} B^{234} - A^{4} B^{25} + A^{45} B^{2} + A^{5} B^{24}\\right ) \\boldsymbol{e}_{2}\\wedge \\boldsymbol{e}_{4}\\wedge \\boldsymbol{e}_{5} + \\left ( A B^{345} + A^{1} B^{1345} - A^{12} B^{12345} - A^{123} B^{1245} - A^{1234} B^{125} - A^{12345} B^{12} + A^{1235} B^{124} + A^{124} B^{1235} - A^{1245} B^{123} - A^{125} B^{1234} - A^{13} B^{145} + A^{134} B^{15} - A^{1345} B^{1} - A^{135} B^{14} + A^{14} B^{135} + A^{145} B^{13} - A^{15} B^{134} + A^{2} B^{2345} - A^{23} B^{245} + A^{234} B^{25} - A^{2345} B^{2} - A^{235} B^{24} + A^{24} B^{235} + A^{245} B^{23} - A^{25} B^{234} + A^{3} B^{45} + A^{34} B^{5} + A^{345} B - A^{35} B^{4} - A^{4} B^{35} + A^{45} B^{3} + A^{5} B^{34}\\right ) \\boldsymbol{e}_{3}\\wedge \\boldsymbol{e}_{4}\\wedge \\boldsymbol{e}_{5} + \\left ( A B^{1234} + A^{1} B^{234} + A^{12} B^{34} + A^{123} B^{4} + A^{1234} B - A^{12345} B^{5} + A^{1235} B^{45} - A^{124} B^{3} - A^{1245} B^{35} - A^{125} B^{345} - A^{13} B^{24} + A^{134} B^{2} + A^{1345} B^{25} + A^{135} B^{245} + A^{14} B^{23} - A^{145} B^{235} + A^{15} B^{2345} - A^{2} B^{134} + A^{23} B^{14} - A^{234} B^{1} - A^{2345} B^{15} - A^{235} B^{145} - A^{24} B^{13} + A^{245} B^{135} - A^{25} B^{1345} + A^{3} B^{124} + A^{34} B^{12} - A^{345} B^{125} + A^{35} B^{1245} - A^{4} B^{123} - A^{45} B^{1235} - A^{5} B^{12345}\\right ) \\boldsymbol{e}_{1}\\wedge \\boldsymbol{e}_{2}\\wedge \\boldsymbol{e}_{3}\\wedge \\boldsymbol{e}_{4} + \\left ( A B^{1235} + A^{1} B^{235} + A^{12} B^{35} + A^{123} B^{5} + A^{1234} B^{45} - A^{12345} B^{4} + A^{1235} B - A^{124} B^{345} - A^{1245} B^{34} - A^{125} B^{3} - A^{13} B^{25} + A^{134} B^{245} + A^{1345} B^{24} + A^{135} B^{2} + A^{14} B^{2345} - A^{145} B^{234} + A^{15} B^{23} - A^{2} B^{135} + A^{23} B^{15} - A^{234} B^{145} - A^{2345} B^{14} - A^{235} B^{1} - A^{24} B^{1345} + A^{245} B^{134} - A^{25} B^{13} + A^{3} B^{125} + A^{34} B^{1245} - A^{345} B^{124} + A^{35} B^{12} - A^{4} B^{12345} - A^{45} B^{1234} - A^{5} B^{123}\\right ) \\boldsymbol{e}_{1}\\wedge \\boldsymbol{e}_{2}\\wedge \\boldsymbol{e}_{3}\\wedge \\boldsymbol{e}_{5} + \\left ( A B^{1245} + A^{1} B^{245} + A^{12} B^{45} + A^{123} B^{345} - A^{1234} B^{35} + A^{12345} B^{3} + A^{1235} B^{34} + A^{124} B^{5} + A^{1245} B - A^{125} B^{4} - A^{13} B^{2345} - A^{134} B^{235} - A^{1345} B^{23} + A^{135} B^{234} - A^{14} B^{25} + A^{145} B^{2} + A^{15} B^{24} - A^{2} B^{145} + A^{23} B^{1345} + A^{234} B^{135} + A^{2345} B^{13} - A^{235} B^{134} + A^{24} B^{15} - A^{245} B^{1} - A^{25} B^{14} + A^{3} B^{12345} - A^{34} B^{1235} + A^{345} B^{123} + A^{35} B^{1234} + A^{4} B^{125} + A^{45} B^{12} - A^{5} B^{124}\\right ) \\boldsymbol{e}_{1}\\wedge \\boldsymbol{e}_{2}\\wedge \\boldsymbol{e}_{4}\\wedge \\boldsymbol{e}_{5} + \\left ( A B^{1345} + A^{1} B^{345} + A^{12} B^{2345} - A^{123} B^{245} + A^{1234} B^{25} - A^{12345} B^{2} - A^{1235} B^{24} + A^{124} B^{235} + A^{1245} B^{23} - A^{125} B^{234} + A^{13} B^{45} + A^{134} B^{5} + A^{1345} B - A^{135} B^{4} - A^{14} B^{35} + A^{145} B^{3} + A^{15} B^{34} - A^{2} B^{12345} - A^{23} B^{1245} - A^{234} B^{125} - A^{2345} B^{12} + A^{235} B^{124} + A^{24} B^{1235} - A^{245} B^{123} - A^{25} B^{1234} - A^{3} B^{145} + A^{34} B^{15} - A^{345} B^{1} - A^{35} B^{14} + A^{4} B^{135} + A^{45} B^{13} - A^{5} B^{134}\\right ) \\boldsymbol{e}_{1}\\wedge \\boldsymbol{e}_{3}\\wedge \\boldsymbol{e}_{4}\\wedge \\boldsymbol{e}_{5} + \\left ( A B^{2345} + A^{1} B^{12345} - A^{12} B^{1345} + A^{123} B^{145} - A^{1234} B^{15} + A^{12345} B^{1} + A^{1235} B^{14} - A^{124} B^{135} - A^{1245} B^{13} + A^{125} B^{134} + A^{13} B^{1245} + A^{134} B^{125} + A^{1345} B^{12} - A^{135} B^{124} - A^{14} B^{1235} + A^{145} B^{123} + A^{15} B^{1234} + A^{2} B^{345} + A^{23} B^{45} + A^{234} B^{5} + A^{2345} B - A^{235} B^{4} - A^{24} B^{35} + A^{245} B^{3} + A^{25} B^{34} - A^{3} B^{245} + A^{34} B^{25} - A^{345} B^{2} - A^{35} B^{24} + A^{4} B^{235} + A^{45} B^{23} - A^{5} B^{234}\\right ) \\boldsymbol{e}_{2}\\wedge \\boldsymbol{e}_{3}\\wedge \\boldsymbol{e}_{4}\\wedge \\boldsymbol{e}_{5} + \\left ( A B^{12345} + A^{1} B^{2345} + A^{12} B^{345} + A^{123} B^{45} + A^{1234} B^{5} + A^{12345} B - A^{1235} B^{4} - A^{124} B^{35} + A^{1245} B^{3} + A^{125} B^{34} - A^{13} B^{245} + A^{134} B^{25} - A^{1345} B^{2} - A^{135} B^{24} + A^{14} B^{235} + A^{145} B^{23} - A^{15} B^{234} - A^{2} B^{1345} + A^{23} B^{145} - A^{234} B^{15} + A^{2345} B^{1} + A^{235} B^{14} - A^{24} B^{135} - A^{245} B^{13} + A^{25} B^{134} + A^{3} B^{1245} + A^{34} B^{125} + A^{345} B^{12} - A^{35} B^{124} - A^{4} B^{1235} + A^{45} B^{123} + A^{5} B^{1234}\\right ) \\boldsymbol{e}_{1}\\wedge \\boldsymbol{e}_{2}\\wedge \\boldsymbol{e}_{3}\\wedge \\boldsymbol{e}_{4}\\wedge \\boldsymbol{e}_{5}\\end{align*}" 455 ], 456 "text/plain": [ 457 "A*B + A__1*B__1 - A__12*B__12 - A__123*B__123 + A__1234*B__1234 - A__12345*B__12345 - A__1235*B__1235 - A__124*B__124 - A__1245*B__1245 + A__125*B__125 - A__13*B__13 - A__134*B__134 - A__1345*B__1345 + A__135*B__135 - A__14*B__14 + A__145*B__145 + A__15*B__15 + A__2*B__2 - A__23*B__23 - A__234*B__234 - A__2345*B__2345 + A__235*B__235 - A__24*B__24 + A__245*B__245 + A__25*B__25 + A__3*B__3 - A__34*B__34 + A__345*B__345 + A__35*B__35 + A__4*B__4 + A__45*B__45 - A__5*B__5 + (A*B__1 + A__1*B + A__12*B__2 - A__123*B__23 - A__1234*B__234 - A__12345*B__2345 + A__1235*B__235 - A__124*B__24 + A__1245*B__245 + A__125*B__25 + A__13*B__3 - A__134*B__34 + A__1345*B__345 + A__135*B__35 + A__14*B__4 + A__145*B__45 - A__15*B__5 - A__2*B__12 - A__23*B__123 + A__234*B__1234 - A__2345*B__12345 - A__235*B__1235 - A__24*B__124 - A__245*B__1245 + A__25*B__125 - A__3*B__13 - A__34*B__134 - A__345*B__1345 + A__35*B__135 - A__4*B__14 + A__45*B__145 + A__5*B__15)*e_1 + (A*B__2 + A__1*B__12 - A__12*B__1 + A__123*B__13 + A__1234*B__134 + A__12345*B__1345 - A__1235*B__135 + A__124*B__14 - A__1245*B__145 - A__125*B__15 + A__13*B__123 - A__134*B__1234 + A__1345*B__12345 + A__135*B__1235 + A__14*B__124 + A__145*B__1245 - A__15*B__125 + A__2*B + A__23*B__3 - A__234*B__34 + A__2345*B__345 + A__235*B__35 + A__24*B__4 + A__245*B__45 - A__25*B__5 - A__3*B__23 - A__34*B__234 - A__345*B__2345 + A__35*B__235 - A__4*B__24 + A__45*B__245 + A__5*B__25)*e_2 + (A*B__3 + A__1*B__13 - A__12*B__123 - A__123*B__12 - A__1234*B__124 - A__12345*B__1245 + A__1235*B__125 + A__124*B__1234 - A__1245*B__12345 - A__125*B__1235 - A__13*B__1 + A__134*B__14 - A__1345*B__145 - A__135*B__15 + A__14*B__134 + A__145*B__1345 - A__15*B__135 + A__2*B__23 - A__23*B__2 + A__234*B__24 - A__2345*B__245 - A__235*B__25 + A__24*B__234 + A__245*B__2345 - A__25*B__235 + A__3*B + A__34*B__4 + A__345*B__45 - A__35*B__5 - A__4*B__34 + A__45*B__345 + A__5*B__35)*e_3 + (A*B__4 + A__1*B__14 - A__12*B__124 - A__123*B__1234 + A__1234*B__123 + A__12345*B__1235 + A__1235*B__12345 - A__124*B__12 + A__1245*B__125 - A__125*B__1245 - A__13*B__134 - A__134*B__13 + A__1345*B__135 - A__135*B__1345 - A__14*B__1 - A__145*B__15 - A__15*B__145 + A__2*B__24 - A__23*B__234 - A__234*B__23 + A__2345*B__235 - A__235*B__2345 - A__24*B__2 - A__245*B__25 - A__25*B__245 + A__3*B__34 - A__34*B__3 - A__345*B__35 - A__35*B__345 + A__4*B - A__45*B__5 + A__5*B__45)*e_4 + (A*B__5 + A__1*B__15 - A__12*B__125 - A__123*B__1235 + A__1234*B__12345 + A__12345*B__1234 + A__1235*B__123 - A__124*B__1245 + A__1245*B__124 - A__125*B__12 - A__13*B__135 - A__134*B__1345 + A__1345*B__134 - A__135*B__13 - A__14*B__145 - A__145*B__14 - A__15*B__1 + A__2*B__25 - A__23*B__235 - A__234*B__2345 + A__2345*B__234 - A__235*B__23 - A__24*B__245 - A__245*B__24 - A__25*B__2 + A__3*B__35 - A__34*B__345 - A__345*B__34 - A__35*B__3 + A__4*B__45 - A__45*B__4 + A__5*B)*e_5 + (A*B__12 + A__1*B__2 + A__12*B + A__123*B__3 - A__1234*B__34 + A__12345*B__345 + A__1235*B__35 + A__124*B__4 + A__1245*B__45 - A__125*B__5 - A__13*B__23 - A__134*B__234 - A__1345*B__2345 + A__135*B__235 - A__14*B__24 + A__145*B__245 + A__15*B__25 - A__2*B__1 + A__23*B__13 + A__234*B__134 + A__2345*B__1345 - A__235*B__135 + A__24*B__14 - A__245*B__145 - A__25*B__15 + A__3*B__123 - A__34*B__1234 + A__345*B__12345 + A__35*B__1235 + A__4*B__124 + A__45*B__1245 - A__5*B__125)*e_1^e_2 + (A*B__13 + A__1*B__3 + A__12*B__23 - A__123*B__2 + A__1234*B__24 - A__12345*B__245 - A__1235*B__25 + A__124*B__234 + A__1245*B__2345 - A__125*B__235 + A__13*B + A__134*B__4 + A__1345*B__45 - A__135*B__5 - A__14*B__34 + A__145*B__345 + A__15*B__35 - A__2*B__123 - A__23*B__12 - A__234*B__124 - A__2345*B__1245 + A__235*B__125 + A__24*B__1234 - A__245*B__12345 - A__25*B__1235 - A__3*B__1 + A__34*B__14 - A__345*B__145 - A__35*B__15 + A__4*B__134 + A__45*B__1345 - A__5*B__135)*e_1^e_3 + (A*B__14 + A__1*B__4 + A__12*B__24 - A__123*B__234 - A__1234*B__23 + A__12345*B__235 - A__1235*B__2345 - A__124*B__2 - A__1245*B__25 - A__125*B__245 + A__13*B__34 - A__134*B__3 - A__1345*B__35 - A__135*B__345 + A__14*B - A__145*B__5 + A__15*B__45 - A__2*B__124 - A__23*B__1234 + A__234*B__123 + A__2345*B__1235 + A__235*B__12345 - A__24*B__12 + A__245*B__125 - A__25*B__1245 - A__3*B__134 - A__34*B__13 + A__345*B__135 - A__35*B__1345 - A__4*B__1 - A__45*B__15 - A__5*B__145)*e_1^e_4 + (A*B__15 + A__1*B__5 + A__12*B__25 - A__123*B__235 - A__1234*B__2345 + A__12345*B__234 - A__1235*B__23 - A__124*B__245 - A__1245*B__24 - A__125*B__2 + A__13*B__35 - A__134*B__345 - A__1345*B__34 - A__135*B__3 + A__14*B__45 - A__145*B__4 + A__15*B - A__2*B__125 - A__23*B__1235 + A__234*B__12345 + A__2345*B__1234 + A__235*B__123 - A__24*B__1245 + A__245*B__124 - A__25*B__12 - A__3*B__135 - A__34*B__1345 + A__345*B__134 - A__35*B__13 - A__4*B__145 - A__45*B__14 - A__5*B__1)*e_1^e_5 + (A*B__23 + A__1*B__123 - A__12*B__13 + A__123*B__1 - A__1234*B__14 + A__12345*B__145 + A__1235*B__15 - A__124*B__134 - A__1245*B__1345 + A__125*B__135 + A__13*B__12 + A__134*B__124 + A__1345*B__1245 - A__135*B__125 - A__14*B__1234 + A__145*B__12345 + A__15*B__1235 + A__2*B__3 + A__23*B + A__234*B__4 + A__2345*B__45 - A__235*B__5 - A__24*B__34 + A__245*B__345 + A__25*B__35 - A__3*B__2 + A__34*B__24 - A__345*B__245 - A__35*B__25 + A__4*B__234 + A__45*B__2345 - A__5*B__235)*e_2^e_3 + (A*B__24 + A__1*B__124 - A__12*B__14 + A__123*B__134 + A__1234*B__13 - A__12345*B__135 + A__1235*B__1345 + A__124*B__1 + A__1245*B__15 + A__125*B__145 + A__13*B__1234 - A__134*B__123 - A__1345*B__1235 - A__135*B__12345 + A__14*B__12 - A__145*B__125 + A__15*B__1245 + A__2*B__4 + A__23*B__34 - A__234*B__3 - A__2345*B__35 - A__235*B__345 + A__24*B - A__245*B__5 + A__25*B__45 - A__3*B__234 - A__34*B__23 + A__345*B__235 - A__35*B__2345 - A__4*B__2 - A__45*B__25 - A__5*B__245)*e_2^e_4 + (A*B__25 + A__1*B__125 - A__12*B__15 + A__123*B__135 + A__1234*B__1345 - A__12345*B__134 + A__1235*B__13 + A__124*B__145 + A__1245*B__14 + A__125*B__1 + A__13*B__1235 - A__134*B__12345 - A__1345*B__1234 - A__135*B__123 + A__14*B__1245 - A__145*B__124 + A__15*B__12 + A__2*B__5 + A__23*B__35 - A__234*B__345 - A__2345*B__34 - A__235*B__3 + A__24*B__45 - A__245*B__4 + A__25*B - A__3*B__235 - A__34*B__2345 + A__345*B__234 - A__35*B__23 - A__4*B__245 - A__45*B__24 - A__5*B__2)*e_2^e_5 + (A*B__34 + A__1*B__134 - A__12*B__1234 - A__123*B__124 - A__1234*B__12 + A__12345*B__125 - A__1235*B__1245 + A__124*B__123 + A__1245*B__1235 + A__125*B__12345 - A__13*B__14 + A__134*B__1 + A__1345*B__15 + A__135*B__145 + A__14*B__13 - A__145*B__135 + A__15*B__1345 + A__2*B__234 - A__23*B__24 + A__234*B__2 + A__2345*B__25 + A__235*B__245 + A__24*B__23 - A__245*B__235 + A__25*B__2345 + A__3*B__4 + A__34*B - A__345*B__5 + A__35*B__45 - A__4*B__3 - A__45*B__35 - A__5*B__345)*e_3^e_4 + (A*B__35 + A__1*B__135 - A__12*B__1235 - A__123*B__125 - A__1234*B__1245 + A__12345*B__124 - A__1235*B__12 + A__124*B__12345 + A__1245*B__1234 + A__125*B__123 - A__13*B__15 + A__134*B__145 + A__1345*B__14 + A__135*B__1 + A__14*B__1345 - A__145*B__134 + A__15*B__13 + A__2*B__235 - A__23*B__25 + A__234*B__245 + A__2345*B__24 + A__235*B__2 + A__24*B__2345 - A__245*B__234 + A__25*B__23 + A__3*B__5 + A__34*B__45 - A__345*B__4 + A__35*B - A__4*B__345 - A__45*B__34 - A__5*B__3)*e_3^e_5 + (A*B__45 + A__1*B__145 - A__12*B__1245 - A__123*B__12345 + A__1234*B__1235 - A__12345*B__123 - A__1235*B__1234 - A__124*B__125 - A__1245*B__12 + A__125*B__124 - A__13*B__1345 - A__134*B__135 - A__1345*B__13 + A__135*B__134 - A__14*B__15 + A__145*B__1 + A__15*B__14 + A__2*B__245 - A__23*B__2345 - A__234*B__235 - A__2345*B__23 + A__235*B__234 - A__24*B__25 + A__245*B__2 + A__25*B__24 + A__3*B__345 - A__34*B__35 + A__345*B__3 + A__35*B__34 + A__4*B__5 + A__45*B - A__5*B__4)*e_4^e_5 + (A*B__123 + A__1*B__23 + A__12*B__3 + A__123*B + A__1234*B__4 + A__12345*B__45 - A__1235*B__5 - A__124*B__34 + A__1245*B__345 + A__125*B__35 - A__13*B__2 + A__134*B__24 - A__1345*B__245 - A__135*B__25 + A__14*B__234 + A__145*B__2345 - A__15*B__235 - A__2*B__13 + A__23*B__1 - A__234*B__14 + A__2345*B__145 + A__235*B__15 - A__24*B__134 - A__245*B__1345 + A__25*B__135 + A__3*B__12 + A__34*B__124 + A__345*B__1245 - A__35*B__125 - A__4*B__1234 + A__45*B__12345 + A__5*B__1235)*e_1^e_2^e_3 + (A*B__124 + A__1*B__24 + A__12*B__4 + A__123*B__34 - A__1234*B__3 - A__12345*B__35 - A__1235*B__345 + A__124*B - A__1245*B__5 + A__125*B__45 - A__13*B__234 - A__134*B__23 + A__1345*B__235 - A__135*B__2345 - A__14*B__2 - A__145*B__25 - A__15*B__245 - A__2*B__14 + A__23*B__134 + A__234*B__13 - A__2345*B__135 + A__235*B__1345 + A__24*B__1 + A__245*B__15 + A__25*B__145 + A__3*B__1234 - A__34*B__123 - A__345*B__1235 - A__35*B__12345 + A__4*B__12 - A__45*B__125 + A__5*B__1245)*e_1^e_2^e_4 + (A*B__125 + A__1*B__25 + A__12*B__5 + A__123*B__35 - A__1234*B__345 - A__12345*B__34 - A__1235*B__3 + A__124*B__45 - A__1245*B__4 + A__125*B - A__13*B__235 - A__134*B__2345 + A__1345*B__234 - A__135*B__23 - A__14*B__245 - A__145*B__24 - A__15*B__2 - A__2*B__15 + A__23*B__135 + A__234*B__1345 - A__2345*B__134 + A__235*B__13 + A__24*B__145 + A__245*B__14 + A__25*B__1 + A__3*B__1235 - A__34*B__12345 - A__345*B__1234 - A__35*B__123 + A__4*B__1245 - A__45*B__124 + A__5*B__12)*e_1^e_2^e_5 + (A*B__134 + A__1*B__34 + A__12*B__234 - A__123*B__24 + A__1234*B__2 + A__12345*B__25 + A__1235*B__245 + A__124*B__23 - A__1245*B__235 + A__125*B__2345 + A__13*B__4 + A__134*B - A__1345*B__5 + A__135*B__45 - A__14*B__3 - A__145*B__35 - A__15*B__345 - A__2*B__1234 - A__23*B__124 - A__234*B__12 + A__2345*B__125 - A__235*B__1245 + A__24*B__123 + A__245*B__1235 + A__25*B__12345 - A__3*B__14 + A__34*B__1 + A__345*B__15 + A__35*B__145 + A__4*B__13 - A__45*B__135 + A__5*B__1345)*e_1^e_3^e_4 + (A*B__135 + A__1*B__35 + A__12*B__235 - A__123*B__25 + A__1234*B__245 + A__12345*B__24 + A__1235*B__2 + A__124*B__2345 - A__1245*B__234 + A__125*B__23 + A__13*B__5 + A__134*B__45 - A__1345*B__4 + A__135*B - A__14*B__345 - A__145*B__34 - A__15*B__3 - A__2*B__1235 - A__23*B__125 - A__234*B__1245 + A__2345*B__124 - A__235*B__12 + A__24*B__12345 + A__245*B__1234 + A__25*B__123 - A__3*B__15 + A__34*B__145 + A__345*B__14 + A__35*B__1 + A__4*B__1345 - A__45*B__134 + A__5*B__13)*e_1^e_3^e_5 + (A*B__145 + A__1*B__45 + A__12*B__245 - A__123*B__2345 - A__1234*B__235 - A__12345*B__23 + A__1235*B__234 - A__124*B__25 + A__1245*B__2 + A__125*B__24 + A__13*B__345 - A__134*B__35 + A__1345*B__3 + A__135*B__34 + A__14*B__5 + A__145*B - A__15*B__4 - A__2*B__1245 - A__23*B__12345 + A__234*B__1235 - A__2345*B__123 - A__235*B__1234 - A__24*B__125 - A__245*B__12 + A__25*B__124 - A__3*B__1345 - A__34*B__135 - A__345*B__13 + A__35*B__134 - A__4*B__15 + A__45*B__1 + A__5*B__14)*e_1^e_4^e_5 + (A*B__234 + A__1*B__1234 - A__12*B__134 + A__123*B__14 - A__1234*B__1 - A__12345*B__15 - A__1235*B__145 - A__124*B__13 + A__1245*B__135 - A__125*B__1345 + A__13*B__124 + A__134*B__12 - A__1345*B__125 + A__135*B__1245 - A__14*B__123 - A__145*B__1235 - A__15*B__12345 + A__2*B__34 + A__23*B__4 + A__234*B - A__2345*B__5 + A__235*B__45 - A__24*B__3 - A__245*B__35 - A__25*B__345 - A__3*B__24 + A__34*B__2 + A__345*B__25 + A__35*B__245 + A__4*B__23 - A__45*B__235 + A__5*B__2345)*e_2^e_3^e_4 + (A*B__235 + A__1*B__1235 - A__12*B__135 + A__123*B__15 - A__1234*B__145 - A__12345*B__14 - A__1235*B__1 - A__124*B__1345 + A__1245*B__134 - A__125*B__13 + A__13*B__125 + A__134*B__1245 - A__1345*B__124 + A__135*B__12 - A__14*B__12345 - A__145*B__1234 - A__15*B__123 + A__2*B__35 + A__23*B__5 + A__234*B__45 - A__2345*B__4 + A__235*B - A__24*B__345 - A__245*B__34 - A__25*B__3 - A__3*B__25 + A__34*B__245 + A__345*B__24 + A__35*B__2 + A__4*B__2345 - A__45*B__234 + A__5*B__23)*e_2^e_3^e_5 + (A*B__245 + A__1*B__1245 - A__12*B__145 + A__123*B__1345 + A__1234*B__135 + A__12345*B__13 - A__1235*B__134 + A__124*B__15 - A__1245*B__1 - A__125*B__14 + A__13*B__12345 - A__134*B__1235 + A__1345*B__123 + A__135*B__1234 + A__14*B__125 + A__145*B__12 - A__15*B__124 + A__2*B__45 + A__23*B__345 - A__234*B__35 + A__2345*B__3 + A__235*B__34 + A__24*B__5 + A__245*B - A__25*B__4 - A__3*B__2345 - A__34*B__235 - A__345*B__23 + A__35*B__234 - A__4*B__25 + A__45*B__2 + A__5*B__24)*e_2^e_4^e_5 + (A*B__345 + A__1*B__1345 - A__12*B__12345 - A__123*B__1245 - A__1234*B__125 - A__12345*B__12 + A__1235*B__124 + A__124*B__1235 - A__1245*B__123 - A__125*B__1234 - A__13*B__145 + A__134*B__15 - A__1345*B__1 - A__135*B__14 + A__14*B__135 + A__145*B__13 - A__15*B__134 + A__2*B__2345 - A__23*B__245 + A__234*B__25 - A__2345*B__2 - A__235*B__24 + A__24*B__235 + A__245*B__23 - A__25*B__234 + A__3*B__45 + A__34*B__5 + A__345*B - A__35*B__4 - A__4*B__35 + A__45*B__3 + A__5*B__34)*e_3^e_4^e_5 + (A*B__1234 + A__1*B__234 + A__12*B__34 + A__123*B__4 + A__1234*B - A__12345*B__5 + A__1235*B__45 - A__124*B__3 - A__1245*B__35 - A__125*B__345 - A__13*B__24 + A__134*B__2 + A__1345*B__25 + A__135*B__245 + A__14*B__23 - A__145*B__235 + A__15*B__2345 - A__2*B__134 + A__23*B__14 - A__234*B__1 - A__2345*B__15 - A__235*B__145 - A__24*B__13 + A__245*B__135 - A__25*B__1345 + A__3*B__124 + A__34*B__12 - A__345*B__125 + A__35*B__1245 - A__4*B__123 - A__45*B__1235 - A__5*B__12345)*e_1^e_2^e_3^e_4 + (A*B__1235 + A__1*B__235 + A__12*B__35 + A__123*B__5 + A__1234*B__45 - A__12345*B__4 + A__1235*B - A__124*B__345 - A__1245*B__34 - A__125*B__3 - A__13*B__25 + A__134*B__245 + A__1345*B__24 + A__135*B__2 + A__14*B__2345 - A__145*B__234 + A__15*B__23 - A__2*B__135 + A__23*B__15 - A__234*B__145 - A__2345*B__14 - A__235*B__1 - A__24*B__1345 + A__245*B__134 - A__25*B__13 + A__3*B__125 + A__34*B__1245 - A__345*B__124 + A__35*B__12 - A__4*B__12345 - A__45*B__1234 - A__5*B__123)*e_1^e_2^e_3^e_5 + (A*B__1245 + A__1*B__245 + A__12*B__45 + A__123*B__345 - A__1234*B__35 + A__12345*B__3 + A__1235*B__34 + A__124*B__5 + A__1245*B - A__125*B__4 - A__13*B__2345 - A__134*B__235 - A__1345*B__23 + A__135*B__234 - A__14*B__25 + A__145*B__2 + A__15*B__24 - A__2*B__145 + A__23*B__1345 + A__234*B__135 + A__2345*B__13 - A__235*B__134 + A__24*B__15 - A__245*B__1 - A__25*B__14 + A__3*B__12345 - A__34*B__1235 + A__345*B__123 + A__35*B__1234 + A__4*B__125 + A__45*B__12 - A__5*B__124)*e_1^e_2^e_4^e_5 + (A*B__1345 + A__1*B__345 + A__12*B__2345 - A__123*B__245 + A__1234*B__25 - A__12345*B__2 - A__1235*B__24 + A__124*B__235 + A__1245*B__23 - A__125*B__234 + A__13*B__45 + A__134*B__5 + A__1345*B - A__135*B__4 - A__14*B__35 + A__145*B__3 + A__15*B__34 - A__2*B__12345 - A__23*B__1245 - A__234*B__125 - A__2345*B__12 + A__235*B__124 + A__24*B__1235 - A__245*B__123 - A__25*B__1234 - A__3*B__145 + A__34*B__15 - A__345*B__1 - A__35*B__14 + A__4*B__135 + A__45*B__13 - A__5*B__134)*e_1^e_3^e_4^e_5 + (A*B__2345 + A__1*B__12345 - A__12*B__1345 + A__123*B__145 - A__1234*B__15 + A__12345*B__1 + A__1235*B__14 - A__124*B__135 - A__1245*B__13 + A__125*B__134 + A__13*B__1245 + A__134*B__125 + A__1345*B__12 - A__135*B__124 - A__14*B__1235 + A__145*B__123 + A__15*B__1234 + A__2*B__345 + A__23*B__45 + A__234*B__5 + A__2345*B - A__235*B__4 - A__24*B__35 + A__245*B__3 + A__25*B__34 - A__3*B__245 + A__34*B__25 - A__345*B__2 - A__35*B__24 + A__4*B__235 + A__45*B__23 - A__5*B__234)*e_2^e_3^e_4^e_5 + (A*B__12345 + A__1*B__2345 + A__12*B__345 + A__123*B__45 + A__1234*B__5 + A__12345*B - A__1235*B__4 - A__124*B__35 + A__1245*B__3 + A__125*B__34 - A__13*B__245 + A__134*B__25 - A__1345*B__2 - A__135*B__24 + A__14*B__235 + A__145*B__23 - A__15*B__234 - A__2*B__1345 + A__23*B__145 - A__234*B__15 + A__2345*B__1 + A__235*B__14 - A__24*B__135 - A__245*B__13 + A__25*B__134 + A__3*B__1245 + A__34*B__125 + A__345*B__12 - A__35*B__124 - A__4*B__1235 + A__45*B__123 + A__5*B__1234)*e_1^e_2^e_3^e_4^e_5" 458 ] 459 }, 460 "execution_count": 15, 461 "metadata": {}, 462 "output_type": "execute_result" 463 } 464 ], 465 "source": [ 466 "@time test_geometric_product(CGA3D)" 467 ] 468 }, 469 { 470 "cell_type": "code", 471 "execution_count": 16, 472 "metadata": {}, 473 "outputs": [ 474 { 475 "data": { 476 "text/plain": [ 477 "test_all (generic function with 1 method)" 478 ] 479 }, 480 "execution_count": 16, 481 "metadata": {}, 482 "output_type": "execute_result" 483 } 484 ], 485 "source": [ 486 "function test_all(V)\n", 487 " dimV = range(0, stop=V.n)\n", 488 " I = V.I()\n", 489 "\n", 490 " α = V.mv(\"α\", \"scalar\")\n", 491 " β = V.mv(\"β\", \"scalar\")\n", 492 " γ = V.mv(\"γ\", \"scalar\")\n", 493 " λ = V.mv(\"λ\", \"scalar\")\n", 494 "\n", 495 " u = V.mv(\"u\", \"vector\")\n", 496 " v = V.mv(\"v\", \"vector\")\n", 497 " w = V.mv(\"w\", \"vector\")\n", 498 "\n", 499 " A = V.mv(\"A\", \"mv\")\n", 500 " B = V.mv(\"B\", \"mv\")\n", 501 " C = V.mv(\"C\", \"mv\")\n", 502 " D = V.mv(\"D\", \"mv\")\n", 503 "\n", 504 " R = V.mv(\"R\", \"spinor\")\n", 505 " \n", 506 " # Precalculte AB and BA\n", 507 " AB = A * B\n", 508 " BA = B * A\n", 509 "\n", 510 " # The following tests verified implementation correctness per definition\n", 511 "\n", 512 " @test u ⋅ v == u | v == (u < v) == (u > v) == u ⨼ v == u ⨽ v == u ⊙ v\n", 513 " @test u ∧ v == u ⊠ v\n", 514 " @test v ⨼ B == (v < B)\n", 515 " @test v ⨽ B == (v > B)\n", 516 " if V ∉ [PGA3D, CGA3D] # too slow\n", 517 " @test A ⊙ B == A << B == (AB + BA) / 2\n", 518 " # @test A ×̄ B == A ⊙ B\n", 519 " @test A ⊠ B == A >> B == (AB - BA) / 2\n", 520 " @test A ⊛ B == A % B\n", 521 " end\n", 522 "\n", 523 " @test abs(v) == norm(v) == v.norm()\n", 524 " if V ∉ [Spacetime, PGA2D, PGA3D, CGA2D, CGA3D]\n", 525 " @test abs(R) == norm(R) == R.norm()\n", 526 " end\n", 527 "\n", 528 " @test ~A == A[:~] == rev(A) == A.rev()\n", 529 "\n", 530 " if V ∉ [Dual, PGA2D, PGA3D, CGA2D, CGA3D]\n", 531 " @test A' == dual(A) == A.dual() == adjoint(A) == A * I # Ga.dual_mode_value is default to \"I+\"\n", 532 " @test (v)⁻¹ == v[:⁻¹] == v^-1 == inv(v) == v.inv()\n", 533 " @test v^-2 == (v^2).inv()\n", 534 " end\n", 535 "\n", 536 " @test (A)ˣ == A[:*] == involute(A) == (A)₊ - (A)₋ == A[:+] - A[:-] == A.even() - A.odd()\n", 537 " @test (A)ǂ == A[:ǂ] == conj(A) == involute(A).rev() \n", 538 "\n", 539 " if V ∉ [Spacetime, PGA2D, PGA3D, CGA2D, CGA3D]\n", 540 " @test R^-2 == (R^2).inv()\n", 541 " @test (R)⁻¹ == R[:⁻¹] == R^-1 == inv(R) == R.inv()\n", 542 " @test ((R)⁻¹)ˣ == ((R)ˣ)⁻¹\n", 543 " @test ((R)⁻¹)ǂ == ((R)ǂ)⁻¹\n", 544 " end\n", 545 "\n", 546 " if V ∈ [Cl2, Cl3]\n", 547 " @test (v)⁻¹ == (~v) / norm(v)^2 == v / v^2 \n", 548 " @test (R)⁻¹ == (~R) / norm(R)^2 == R / R^2\n", 549 " end\n", 550 "\n", 551 " @test v^0 == 1\n", 552 " @test v^2 == v*v\n", 553 "\n", 554 " @test ((A)ˣ)ˣ == ~(~A) == A[:~][:~] == ((A)ǂ)ǂ == A\n", 555 " @test ~((A)ˣ) == (~A)ˣ\n", 556 "\n", 557 " if V ∉ [Dual]\n", 558 " @test proj(u, v) == v.project_in_blade(u)\n", 559 " @test refl(u, v) == v.reflect_in_blade(u)\n", 560 " end\n", 561 "\n", 562 " if V ∉ [PGA2D, PGA3D, CGA2D, CGA3D] # too slow\n", 563 " @test rot(u ∧ v, A) == A.rotate_multivector(u ∧ v)\n", 564 " @test exp(u ∧ v) == (u ∧ v).exp()\n", 565 " end\n", 566 "\n", 567 " @test typeof(scalar(A)) == Sym\n", 568 " @test typeof(A[0]) == Mv\n", 569 " @test scalar(A) == A.scalar() == A[0].obj\n", 570 " @test (A)₊ == A[:+] == even(A) == A.even()\n", 571 " @test (A)₋ == A[:-] == odd(A) == A.odd()\n", 572 "\n", 573 " for r ∈ dimV\n", 574 " A[r] == A.grade(r) == A.get_grade(r)\n", 575 " end\n", 576 "\n", 577 " # The following tests verified many identities in Linear Algebra\n", 578 "\n", 579 " @test v + w == w + v\n", 580 " @test (u + v) + w == u + (v + w)\n", 581 " @test v + 0 == v\n", 582 " @test 0 * v == 0\n", 583 " @test 1 * v == v\n", 584 " @test α * (β * v) == (α * β) * v\n", 585 " @test α * (v + w) == α * v + α * w\n", 586 " @test (α + β) * v == α * v + β * v\n", 587 " @test v + (-1) * v == 0\n", 588 " @test -v == -1 * v\n", 589 "\n", 590 " 𝑶 = vector(V, fill(0, V.n))\n", 591 " @test α * 𝑶 == 𝑶\n", 592 " @test (-α) * v == α * (-v) == -α * v\n", 593 "\n", 594 " # The following tests verified many identities in https://arxiv.org/abs/1205.5935\n", 595 "\n", 596 " @test v * v == (v * v).scalar()\n", 597 " @test v * B == v ⋅ B + v ∧ B == v ⨼ B + v ∧ B\n", 598 "\n", 599 " @test u ∧ (v + λ * u) == u ∧ v\n", 600 "\n", 601 " @test v == v[1]\n", 602 " if V.n >= 2\n", 603 " G2 = V.mv(\"G2\", \"grade\", 2)\n", 604 " @test G2 == G2[2]\n", 605 " end\n", 606 "\n", 607 " for r ∈ dimV\n", 608 " @test (A + B)[r] == A[r] + B[r]\n", 609 " @test (λ * A)[r] == (A * λ)[r] == λ * A[r]\n", 610 "\n", 611 " Ar = A[r]\n", 612 "\n", 613 " @test v ⨼ Ar == (v * Ar - (-1)^r * Ar * v) / 2\n", 614 " @test Ar ⨽ v == (Ar * v - (-1)^r * v * Ar) / 2 == (-1)^(r-1) * (v ⨼ Ar)\n", 615 " @test v ∧ Ar == (v * Ar + (-1)^r * Ar * v) / 2\n", 616 " @test Ar ∧ v == (Ar * v + (-1)^r * v * Ar) / 2 == (-1)^r * (v ∧ Ar)\n", 617 "\n", 618 " @test v ⨼ Ar == (v * Ar)[r-1]\n", 619 " @test v ∧ Ar == (v * Ar)[r+1]\n", 620 " @test Ar ⨽ v == (Ar * v)[r-1]\n", 621 " @test Ar ∧ v == (Ar * v)[r+1]\n", 622 " @test v * Ar == v ⨼ Ar + v ∧ Ar\n", 623 " @test Ar * v == Ar ⨽ v + Ar ∧ v\n", 624 "\n", 625 " Br = B[r]\n", 626 " Ar ⨼ Br == Ar ⨽ Br == (Ar * Br).scalar()\n", 627 "\n", 628 " for s ∈ dimV\n", 629 " @test A[r][s] == (if r == s; A[r] else 0 end)\n", 630 "\n", 631 " Bs = B[s]\n", 632 " ArBs = Ar * Bs\n", 633 "\n", 634 " @test ArBs == sum([ArBs[abs(r - s) + 2j] for j=0:min(r, s)]) # A.4.1\n", 635 " @test Ar ⨼ Bs == (-1)^(r * (s - 1)) * Bs ⨽ Ar # A.4.10\n", 636 " @test Ar ∧ Bs == (-1)^(r * s) * Bs ∧ Ar # A.4.11\n", 637 "\n", 638 " for j ∈ dimV\n", 639 " @test ArBs[r + s - 2j] == (-1)^(r * s - j) * (B[s] * A[r])[r + s - 2j] # A.4.2\n", 640 " end\n", 641 "\n", 642 " if V ∉ [PGA2D, PGA3D, CGA2D, CGA3D] # too slow\n", 643 " @test v ⨼ ArBs == (v * ArBs - (-1)^(r+s) * ArBs * v)/2 ==\n", 644 " (v ⨼ Ar) * Bs + (-1)^r * Ar * (v ⨼ Bs) == \n", 645 " (v ∧ Ar) * Bs - (-1)^r * Ar * (v ∧ Bs)\n", 646 " @test v ∧ ArBs == (v * ArBs + (-1)^(r+s) * ArBs * v)/2 ==\n", 647 " (v ∧ Ar) * Bs - (-1)^r * Ar * (v ⨼ Bs) ==\n", 648 " (v ⨼ Ar) * Bs + (-1)^r * Ar * (v ∧ Bs)\n", 649 " end\n", 650 " \n", 651 " @test v ⨼ (Ar ∧ Bs) == (v ⨼ Ar) ∧ Bs + (-1)^r * Ar ∧ (v ⨼ Bs)\n", 652 " @test v ∧ (Ar ⨽ Bs) == (v ∧ Ar) ⨽ Bs - (-1)^r * Ar ⨽ (v ⨼ Bs)\n", 653 " @test v ∧ (Ar ⨼ Bs) == (v ⨼ Ar) ⨼ Bs + (-1)^r * Ar ⨼ (v ∧ Bs)\n", 654 "\n", 655 " if r > s\n", 656 " @test Ar ⨼ Bs == Bs ⨽ Ar == 0\n", 657 " end\n", 658 "\n", 659 " if V ∉ [PGA2D, PGA3D, CGA2D, CGA3D] # too slow\n", 660 " for t ∈ dimV\n", 661 " Ct = C[t]\n", 662 "\n", 663 " Ar ∧ (Bs ∧ Ct) == (Ar * Bs * Ct)[r + s + t]\n", 664 " end\n", 665 " end\n", 666 " end\n", 667 " end\n", 668 "\n", 669 " @test A == sum([A[r] for r ∈ dimV])\n", 670 " @test A[-3] == 0\n", 671 "\n", 672 " @test v ⨼ A == (v * A - (A)ˣ * v)/2 # A.4.13\n", 673 " @test v ∧ A == (v * A + (A)ˣ * v)/2 # A.4.14\n", 674 " @test A ⨽ v == - v ⨼ (A)ˣ # A.4.15\n", 675 " @test A ∧ v == v ∧ (A)ˣ # A.4.16\n", 676 "\n", 677 " if V ∉ [PGA2D, PGA3D, CGA2D, CGA3D] # too slow\n", 678 " @test v ⨼ (AB) == (v ⨼ A) * B + (A)ˣ * (v ⨼ B) == (v ∧ A) * B - (A)ˣ * (v ∧ B) # A.4.18-19\n", 679 " @test v ∧ (AB) == (v ∧ A) * B - (A)ˣ * (v ⨼ B) == (v ⨼ A) * B + (A)ˣ * (v ∧ B) # A.4.20-21\n", 680 " end\n", 681 " \n", 682 " @test v ⨼ (A ∧ B) == (v ⨼ A) ∧ B + (A)ˣ ∧ (v ⨼ B) # A.4.22\n", 683 " @test v ∧ (A ⨽ B) == (v ∧ A) ⨽ B - (A)ˣ ⨽ (v ⨼ B) # A.4.23\n", 684 " @test v ∧ (A ⨼ B) == (v ⨼ A) ⨼ B + (A)ˣ ⨼ (v ∧ B) # A.4.24\n", 685 "\n", 686 " @test v ⨼ A[:+] == - (A[:+] ⨽ v)\n", 687 " @test v ⨼ A[:-] == A[:-] ⨽ v\n", 688 " @test v ∧ A[:+] == A[:+] ∧ v\n", 689 " @test v ∧ A[:-] == - (A[:-] ∧ v)\n", 690 "\n", 691 " if V ∉ [PGA2D, PGA3D, CGA2D, CGA3D] # too slow\n", 692 " @test (AB).scalar() == (BA).scalar() == (~A * ~B).scalar() == \n", 693 " ((A)ˣ * (B)ˣ).scalar() == ((A)ǂ * (B)ǂ).scalar() # A.4.3-6\n", 694 " end\n", 695 "\n", 696 " @test A ⨼ B == sum([sum([(A[r] * B[s])[s - r] for r ∈ dimV]) for s ∈ dimV]) # A.4.7\n", 697 " @test A ⨽ B == sum([sum([(A[r] * B[s])[r - s] for r ∈ dimV]) for s ∈ dimV]) # A.4.8\n", 698 " @test A ∧ B == sum([sum([(A[r] * B[s])[r + s] for r ∈ dimV]) for s ∈ dimV]) # A.4.9\n", 699 "\n", 700 " @test (A ∧ B) ∧ C == A ∧ (B ∧ C) == A ∧ B ∧ C # A.4.28\n", 701 " @test A ⨼ (B ⨽ C) == (A ⨼ B) ⨽ C # A.4.29\n", 702 " @test A ⨼ (B ⨼ C) == (A ∧ B) ⨼ C # A.4.30\n", 703 " @test A ⨽ (B ∧ C) == (A ⨽ B) ⨽ C # A.4.31\n", 704 " @test (A ∧ B) ⨼ C == A ⨼ (B ⨼ C)\n", 705 "\n", 706 " @test u ∧ A ∧ v == - v ∧ A ∧ u # A.4.17\n", 707 "\n", 708 " if V ∉ [PGA2D, PGA3D, CGA2D, CGA3D] # too slow\n", 709 " @test AB == A ⊠ B + A ⊙ B\n", 710 " @test A ⊙ B == B ⊙ A\n", 711 " @test A ⊠ B == - B ⊠ A\n", 712 "\n", 713 " @test A ⊛ B == B ⊛ A\n", 714 " \n", 715 " @test A ⊛ B == ~A ⊛ ~B == A.rev() ⊛ B.rev()\n", 716 " @test A ⊛ (B * C) == (~B * A) ⊛ C\n", 717 " @test A ⊛ (B ⨽ C) == (~B ⨽ A) ⊛ C\n", 718 " @test A ⊛ (B ⨼ C) == (~B ∧ A) ⊛ C\n", 719 " @test A ⊛ (B ∧ C) == (~B ⨼ A) ⊛ C\n", 720 " end\n", 721 " \n", 722 " if V ∉ [Spacetime, ℂ, ℍ, Dual, PGA2D, PGA3D, CGA2D, CGA3D]\n", 723 " @test A ⊛ B == A' ⊛ B' == A.dual() ⊛ B.dual()\n", 724 " end \n", 725 "\n", 726 " if V ∉ [PGA2D, PGA3D, CGA2D, CGA3D] # too slow\n", 727 " @test AB ⋅ C ∧ D == ((AB) ⋅ C) ∧ D\n", 728 " end\n", 729 "\n", 730 " if V ∉ [Dual, PGA2D, PGA3D, CGA2D, CGA3D]\n", 731 " @test u.dual() == u * V.I()\n", 732 " @test proj(u, v) == (v ⋅ u) / u == (v ⨼ u) ⨼ u.inv()\n", 733 " @test proj(w, v) + proj(w, u) == proj(w, u + v)\n", 734 " end\n", 735 "\n", 736 " if V == Cl3\n", 737 " @test u × v == -I * (u ∧ v)\n", 738 " @test_throws PyCall.PyError A × B\n", 739 "\n", 740 " Vr = u ∧ v\n", 741 " @test proj(Vr, B) == B ⨼ Vr * (Vr)⁻¹ == (B ⨼ Vr) ⨼ (Vr)⁻¹ # A.4.34\n", 742 " # TODO this is failing for now\n", 743 " @test_broken refl(Vr, B) == B ∧ Vr * (Vr)⁻¹ == (B ∧ Vr) ⨽ (Vr)⁻¹ # A.4.35\n", 744 "\n", 745 " # The following tests verified interoperability with numeric and symbolic numbers\n", 746 " (ex, ey, ez) = V.mv()\n", 747 "\n", 748 " uu = vector(V, [1, 2, 3])\n", 749 " vv = vector(V, [4, 5, 6])\n", 750 " ww = vector(V, [5, 6, 7])\n", 751 "\n", 752 " @test uu + vv == 5 * ex + 7 * ey + 9 * ez\n", 753 " @test 7 * uu + 2 * ww == 17 * ex + 26 * ey + 35 * ez\n", 754 " @test 7 * uu - 2 * ww == -3 * ex + 2 * ey + 7 * ez\n", 755 " @test 3 * uu + 2 * vv + ww == 16 * ex + 22 * ey + 28 * ez\n", 756 " @test (sympy.sqrt(2) * u + sympy.Rational(2, 3) * v) ⋅ ey == \n", 757 " sympy.sqrt(2) * (u ⋅ ey) + sympy.Rational(2, 3) * (v ⋅ ey)\n", 758 " end\n", 759 "end" 760 ] 761 }, 762 { 763 "cell_type": "code", 764 "execution_count": 17, 765 "metadata": {}, 766 "outputs": [], 767 "source": [ 768 "using Profile" 769 ] 770 }, 771 { 772 "cell_type": "code", 773 "execution_count": 18, 774 "metadata": {}, 775 "outputs": [], 776 "source": [ 777 "Profile.init(n = 10^8, delay = 0.01)" 778 ] 779 }, 780 { 781 "cell_type": "code", 782 "execution_count": 19, 783 "metadata": {}, 784 "outputs": [ 785 { 786 "name": "stdout", 787 "output_type": "stream", 788 "text": [ 789 " 27.347987 seconds (7.76 M allocations: 377.404 MiB, 1.26% gc time)\n" 790 ] 791 } 792 ], 793 "source": [ 794 "@time @profile test_all(PGA3D)" 795 ] 796 }, 797 { 798 "cell_type": "code", 799 "execution_count": 20, 800 "metadata": { 801 "scrolled": false 802 }, 803 "outputs": [], 804 "source": [ 805 "using ProfileView\n", 806 "ProfileView.svgwrite(\"profile_results.svg\",combine = true, colorgc=false, pruned=[\n", 807 " (\"PyObject\", raw\"pyfncall.jl\"),\n", 808 " (\"_pycall!\", raw\"pyfncall.jl\")])" 809 ] 810 }, 811 { 812 "cell_type": "code", 813 "execution_count": null, 814 "metadata": {}, 815 "outputs": [], 816 "source": [] 817 } 818 ], 819 "metadata": { 820 "kernelspec": { 821 "display_name": "Julia 1.1.0", 822 "language": "julia", 823 "name": "julia-1.1" 824 }, 825 "language_info": { 826 "file_extension": ".jl", 827 "mimetype": "application/julia", 828 "name": "julia", 829 "version": "1.1.0" 830 } 831 }, 832 "nbformat": 4, 833 "nbformat_minor": 2 834}