Julia interface to GAlgebra via PyCall 🔮 Mirror of https://github.com/pygae/GAlgebra.jl
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}