The arithmatic on this page asumes the operands are a general case of a 4D multivector:
a.e + a.e1 e1 + a.e2 e2 + a.e3 e3 + a.e4 e4 + a.e12 e1^ e2 + a.e31 e3^ e1 + a.e23 e2^ e3 + a.e14 e1^ e4 + a.e24 e2^ e4 + a.e34 e3^ e4 + a.e231 e2^ e3^ e1 + a.e214 e2^ e1^ e4 + a.e134 e1^ e3^ e4 + a.e324 e3^ e2^ e4 + a.e1234 e1^ e2^ e3^ e4
and a second multivector:
b.e + b.e1 e1 + b.e2 e2 + b.e3 e3 + b.e4 e4 + b.e12 e1^ e2 + b.e31 e3^ e1 + b.e23 e2^ e3 + b.e14 e1^ e4 + b.e24 e2^ e4 + b.e34 e3^ e4 + b.e231 e2^ e3^ e1 + b.e214 e2^ e1^ e4 + b.e134 e1^ e3^ e4 + b.e324 e3^ e2^ e4 + b.e1234 e1^ e2^ e3^ e4
The following calculator allows you to calculate multivector arithmetic. Enter the values into the top two multivectors and then press "+ - or * " to display the result in the bottom multivector:
Just add each component independently as follows:
e = a.e + b.e
e1 = a.e1 +b.e1
e2 = a.e2 + b.e2
e3 = a.e3 + b.e3
e4 = a.e4 + b.e4
e12 = a.e12 + b.e12
e31 = a.e31 + b.e31
e23 = a.e23 + b.e23
e14 = a.e14 + b.e14
e24 = a.e24 + b.e24
e34 = a.e34 + b.e34
e231 = a.e231 + b.e231
e214 = a.e214 + b.e214
e134 = a.e134 + b.e134
e324 = a.e324 + b.e324
e1234 = a.e1234 + b.e1234
This operation will be coded in the multi3d class (see this class here).
When adding blades of different grade then we cant reduce it further and we leave the + in the number.
For example:
3 + 4 e1 + 5 e12
added to
5 + 4 e2 + 3 e12
gives
8 + 4 e1 + 4 e2 + 8 e12
Just subtract each component independently as follows:
e = a.e - b.e
e1 = a.e1 - b.e1
e2 = a.e2 - b.e2
e3 = a.e3 - b.e3
e4 = a.e4 - b.e4
e12 = a.e12 - b.e12
e31 = a.e31 - b.e31
e23 = a.e23 - b.e23
e14 = a.e14 - b.e14
e24 = a.e24 - b.e24
e34 = a.e34 - b.e34
e231 = a.e231 - b.e231
e214 = a.e214 - b.e214
e134 = a.e134 - b.e134
e324 = a.e324 - b.e324
e1234 = a.e1234 - b.e1234
This operation will be coded in the multi3d class (see this class here).
The main type of multiplication, which is described here, is geometric multiplication.
So if we have a general case of a 3D multivector:
a.e + a.e1 e1 + a.e2 e2 + a.e3 e3 + a.e4 e4 + a.e12 e1^ e2 + a.e31 e3^ e1 + a.e23 e2^ e3 + a.e14 e1^ e4 + a.e24 e2^ e4 + a.e34 e3^ e4 + a.e231 e2^ e3^ e1 + a.e214 e2^ e1^ e4 + a.e134 e1^ e3^ e4 + a.e324 e3^ e2^ e4 + a.e1234 e1^ e2^ e3^ e4
and a second multivector:
b.e + b.e1 e1 + b.e2 e2 + b.e3 e3 + b.e4 e4 + b.e12 e1^ e2 + b.e31 e3^ e1 + b.e23 e2^ e3 + b.e14 e1^ e4 + b.e24 e2^ e4 + b.e34 e3^ e4 + b.e231 e2^ e3^ e1 + b.e214 e2^ e1^ e4 + b.e134 e1^ e3^ e4 + b.e324 e3^ e2^ e4 + b.e1234 e1^ e2^ e3^ e4
Since * is distributive over + we can multiply out the terms:
(a.e + a.e1 e1 + a.e2 e2 + a.e3 e3 + a.e4 e4 + a.e12 e1^ e2 + a.e31 e3^ e1 + a.e23 e2^ e3 + a.e14 e1^ e4 + a.e24 e2^ e4 + a.e34 e3^ e4 + a.e231 e2^ e3^ e1 + a.e214 e2^ e1^ e4 + a.e134 e1^ e3^ e4 + a.e324 e3^ e2^ e4 + a.e1234 e1^ e2^ e3^ e4) * (b.e + b.e1 e1 + b.e2 e2 + b.e3 e3 + b.e4 e4 + b.e12 e1^ e2 + b.e31 e3^ e1 + b.e23 e2^ e3 + b.e14 e1^ e4 + b.e24 e2^ e4 + b.e34 e3^ e4 + b.e231 e2^ e3^ e1 + b.e214 e2^ e1^ e4 + b.e134 e1^ e3^ e4 + b.e324 e3^ e2^ e4 + b.e1234 e1^ e2^ e3^ e4 )
this gives the result:
e = | a.e * b.e | + a.e1 * b.e1 | + a.e2 * b.e2 | + a.e3 * b.e3 | - a.e12 * b.e12 | - a.e31 * b.e31 | - a.e23 * b.e23 | - a.e123 * b.e123 | + a.e? * b.e? | + a.e? * b.e? | + a.e? * b.e? | + a.e? * b.e? | + a.e? * b.e? | + a.e? * b.e? | + a.e? * b.e? | + a.e? * b.e? |
e1 = | a.e1 * b.e | + a.e * b.e1 | - a.e12 * b.e2 | + a.e31 * b.e3 | + a.e2 * b.e12 | - a.e3 * b.e31 | - a.e123 * b.e23 | - a.e23 * b.e123 | + a.e? * b.e? | + a.e? * b.e? | + a.e? * b.e? | + a.e? * b.e? | + a.e? * b.e? | + a.e? * b.e? | + a.e? * b.e? | + a.e? * b.e? |
e2 = | a.e2 * b.e | + a.e12 * b.e1 | + a.e * b.e2 | - a.e23 * b.e3 | - a.e1 * b.e12 | - a.e123 * b.e31 | + a.e3 * b.e23 | - a.e31 * b.e123 | + a.e? * b.e? | + a.e? * b.e? | + a.e? * b.e? | + a.e? * b.e? | + a.e? * b.e? | + a.e? * b.e? | + a.e? * b.e? | + a.e? * b.e? |
e3 = | a.e3 * b.e | - a.e31 * b.e1 | + a.e23 * b.e2 | + a.e * b.e3 | - a.e123 * b.e12 | + a.e1 * b.e31 | - a.e2 * b.e23 | - a.e12 * b.e123 | + a.e? * b.e? | + a.e? * b.e? | + a.e? * b.e? | + a.e? * b.e? | + a.e? * b.e? | + a.e? * b.e? | + a.e? * b.e? | + a.e? * b.e? |
e12 = | a.e12 * b.e | + a.e2 * b.e1 | - a.e1 * b.e2 | + a.e123 * b.e3 | + a.e * b.e12 | + a.e23 * b.e31 | - a.e31 * b.e23 | + a.e3 * b.e123 | + a.e? * b.e? | + a.e? * b.e? | + a.e? * b.e? | + a.e? * b.e? | + a.e? * b.e? | + a.e? * b.e? | + a.e? * b.e? | + a.e? * b.e? |
e31 = | a.e31 * b.e | - a.e3 * b.e1 | + a.e123 * b.e2 | + a.e1 * b.e3 | - a.e23 * b.e12 | + a.e * b.e31 | + a.e12 * b.e23 | + a.e2 * b.e123 | + a.e? * b.e? | + a.e? * b.e? | + a.e? * b.e? | + a.e? * b.e? | + a.e? * b.e? | + a.e? * b.e? | + a.e? * b.e? | + a.e? * b.e? |
e23 = | a.e23 * b.e | + a.e123 * b.e1 | + a.e3 * b.e2 | - a.e2 * b.e3 | + a.e31 * b.e12 | - a.e12 * b.e31 | + a.e * b.e23 | + a.e1 * b.e123 | + a.e? * b.e? | + a.e? * b.e? | + a.e? * b.e? | + a.e? * b.e? | + a.e? * b.e? | + a.e? * b.e? | + a.e? * b.e? | + a.e? * b.e? |
e123 = | a.e123 * b.e | + a.e23 * b.e1 | + a.e31 * b.e2 | + a.e12 * b.e3 | + a.e3 * b.e12 | + a.e2 * b.e31 | + a.e1 * b.e23 | + a.e * b.e123 | + a.e? * b.e? | + a.e? * b.e? | + a.e? * b.e? | + a.e? * b.e? | + a.e? * b.e? | + a.e? * b.e? | + a.e? * b.e? | + a.e? * b.e? |
e = +a.e*b.e +a.ex*b.ex +a.ey*b.ey +a.ez*b.ez +a.ew*b.ew -a.exy*b.exy -a.exz*b.exz -a.exw*b.exw -a.eyz*b.eyz -a.eyw*b.eyw -a.ezw*b.ezw -a.exyz*b.exyz -a.exyw*b.exyw -a.exzw*b.exzw -a.eyzw*b.eyzw +a.exyzw*b.exyzw ex = +a.e*b.ex +a.ex*b.e -a.ey*b.exy -a.ez*b.exz -a.ew*b.exw +a.exy*b.ey +a.exz*b.ez +a.exw*b.ew -a.eyz*b.exyz -a.eyw*b.exyw -a.ezw*b.exzw -a.exyz*b.eyz -a.exyw*b.eyw -a.exzw*b.ezw +a.eyzw*b.exyzw -a.exyzw*b.eyzw ey = +a.e*b.ey +a.ex*b.exy +a.ey*b.e -a.ez*b.eyz -a.ew*b.eyw -a.exy*b.ex +a.exz*b.exyz +a.exw*b.exyw +a.eyz*b.ez +a.eyw*b.ew -a.ezw*b.eyzw +a.exyz*b.exz +a.exyw*b.exw -a.exzw*b.exyzw -a.eyzw*b.ezw +a.exyzw*b.exzw ez = +a.e*b.ez +a.ex*b.exz +a.ey*b.eyz +a.ez*b.e -a.ew*b.ezw -a.exy*b.exyz -a.exz*b.ex +a.exw*b.exzw -a.eyz*b.ey +a.eyw*b.eyzw +a.ezw*b.ew -a.exyz*b.exy +a.exyw*b.exyzw +a.exzw*b.exw +a.eyzw*b.eyw -a.exyzw*b.exyw ew = +a.e*b.ew +a.ex*b.exw +a.ey*b.eyw +a.ez*b.ezw +a.ew*b.e -a.exy*b.exyw -a.exz*b.exzw -a.exw*b.ex -a.eyz*b.eyzw -a.eyw*b.ey -a.ezw*b.ez -a.exyz*b.exyzw -a.exyw*b.exy -a.exzw*b.exz -a.eyzw*b.eyz +a.exyzw*b.exyz exy = +a.e*b.exy +a.ex*b.ey -a.ey*b.ex +a.ez*b.exyz +a.ew*b.exyw +a.exy*b.e -a.exz*b.eyz -a.exw*b.eyw +a.eyz*b.exz +a.eyw*b.exw -a.ezw*b.exyzw +a.exyz*b.ez +a.exyw*b.ew -a.exzw*b.eyzw +a.eyzw*b.exzw -a.exyzw*b.ezw exz = +a.e*b.exz +a.ex*b.ez -a.ey*b.exyz -a.ez*b.ex +a.ew*b.exzw +a.exy*b.eyz +a.exz*b.e -a.exw*b.ezw -a.eyz*b.exy +a.eyw*b.exyzw +a.ezw*b.exw -a.exyz*b.ey +a.exyw*b.eyzw +a.exzw*b.ew -a.eyzw*b.exyw +a.exyzw*b.eyw exw = +a.e*b.exw +a.ex*b.ew -a.ey*b.exyw -a.ez*b.exzw -a.ew*b.ex +a.exy*b.eyw +a.exz*b.ezw +a.exw*b.e -a.eyz*b.exyzw -a.eyw*b.exy -a.ezw*b.exz -a.exyz*b.eyzw -a.exyw*b.ey -a.exzw*b.ez +a.eyzw*b.exyz -a.exyzw*b.eyz eyz = +a.e*b.eyz +a.ex*b.exyz +a.ey*b.ez -a.ez*b.ey +a.ew*b.eyzw -a.exy*b.exz +a.exz*b.exy -a.exw*b.exyzw +a.eyz*b.e -a.eyw*b.ezw +a.ezw*b.eyw +a.exyz*b.ex -a.exyw*b.exzw +a.exzw*b.exyw +a.eyzw*b.ew -a.exyzw*b.exw eyw = +a.e*b.eyw +a.ex*b.exyw +a.ey*b.ew -a.ez*b.eyzw -a.ew*b.ey -a.exy*b.exw +a.exz*b.exyzw +a.exw*b.exy +a.eyz*b.ezw +a.eyw*b.e -a.ezw*b.eyz +a.exyz*b.exzw +a.exyw*b.ex -a.exzw*b.exyz -a.eyzw*b.ez +a.exyzw*b.exz ezw = +a.e*b.ezw +a.ex*b.exzw +a.ey*b.eyzw +a.ez*b.ew -a.ew*b.ez -a.exy*b.exyzw -a.exz*b.exw +a.exw*b.exz -a.eyz*b.eyw +a.eyw*b.eyz +a.ezw*b.e -a.exyz*b.exyw +a.exyw*b.exyz +a.exzw*b.ex +a.eyzw*b.ey -a.exyzw*b.exy exyz = +a.e*b.exyz +a.ex*b.eyz -a.ey*b.exz +a.ez*b.exy -a.ew*b.exyzw +a.exy*b.ez -a.exz*b.ey +a.exw*b.eyzw +a.eyz*b.ex -a.eyw*b.exzw +a.ezw*b.exyw +a.exyz*b.e -a.exyw*b.ezw +a.exzw*b.eyw -a.eyzw*b.exw +a.exyzw*b.ew exyw = +a.e*b.exyw +a.ex*b.eyw -a.ey*b.exw +a.ez*b.exyzw +a.ew*b.exy +a.exy*b.ew -a.exz*b.eyzw -a.exw*b.ey +a.eyz*b.exzw +a.eyw*b.ex -a.ezw*b.exyz +a.exyz*b.ezw +a.exyw*b.e -a.exzw*b.eyz +a.eyzw*b.exz -a.exyzw*b.ez exzw = +a.e*b.exzw +a.ex*b.ezw -a.ey*b.exyzw -a.ez*b.exw +a.ew*b.exz +a.exy*b.eyzw +a.exz*b.ew -a.exw*b.ez -a.eyz*b.exyw +a.eyw*b.exyz +a.ezw*b.ex -a.exyz*b.eyw +a.exyw*b.eyz +a.exzw*b.e -a.eyzw*b.exy +a.exyzw*b.ey eyzw = +a.e*b.eyzw +a.ex*b.exyzw +a.ey*b.ezw -a.ez*b.eyw +a.ew*b.eyz -a.exy*b.exzw +a.exz*b.exyw -a.exw*b.exyz +a.eyz*b.ew -a.eyw*b.ez +a.ezw*b.ey +a.exyz*b.exw -a.exyw*b.exz +a.exzw*b.exy +a.eyzw*b.e -a.exyzw*b.ex exyzw = +a.e*b.exyzw +a.ex*b.eyzw -a.ey*b.exzw +a.ez*b.exyw -a.ew*b.exyz +a.exy*b.ezw -a.exz*b.eyw +a.exw*b.eyz +a.eyz*b.exw -a.eyw*b.exz +a.ezw*b.exy +a.exyz*b.ew -a.exyw*b.ez +a.exzw*b.ey -a.eyzw*b.ex +a.exyzw*b.e
Each term can be calculated as follows, for example when working out the 5th term in the first multivector a.e12 e1^ e2 multiplied by the 6th term in the second multivector b.e31 e3^ e1 we get the magnitude a.e12*b.e31 and the type e1^ e2 * e3^ e1 which can be calculated as follows:
The type of each term can be calculated by following these rules:
As an example, using 3D vectors, we can use the above rules to calculate a table showing all possible combinations:
In order to make sure we work out all possible combinations of products, I suggest using a table. The entries in the table only shows the type and sign change of the product, it does not show its absolute value. We therefore need to prefix the product by its numerical value which is the real number which is the product of the numbers at the top and left headings.
So we can start by entering the above results in the table, the value to the left of the * is represented by the columns and the value to the right of the * is represented by the rows. So when calculating a^b the column headings are denoted by a.?? and the rows are denoted by b.??
a*b |
b.e | b.e1 | b.e2 | b.e3 | b.e4 | b.e12 | b.e31 | b.e23 | b.e14 | b.e24 | b.e34 | b.e231 | b.e214 | b.e134 | b.e324 | b.e1234 |
a.e | 1 | e1 | e2 | e3 | e4 | e12 | e31 | e23 | e14 | e24 | e34 | e231 | e214 | e134 | e324 | e1234 |
a.e1 | e1 | e11 = 1 [rule 5] | e12 | e13 = -e31 [rule 4] | e112 = e2 [rule 3] | e131 =-e113 [rule 2] = -e3 [rule 3] |
e123 | e1123 = e23 [rule 3] | e11234= e234= -e324= |
|||||||
a.e2 | e2 | a21 = -e12 [rule 4] | e22 = 1 [rule 5] | e23 | e212 = -e221 [rule 2] = -e1 [rule 3] |
e231 = -e132 [rule 4] e123 [rule 4] |
e223 = e3 [rule 3] | e2123 = -e2213 [rule 2] = e31 [rule 4] |
e21234= -e134 |
|||||||
a.e3 | e3 | e31 | e32 = -e23 [rule 4] | e33 = 1 [rule 5] | e312 = -e132 [rule 4] = e123 [rule 4] |
e331 = e1 [rule 3] | e323 = -e332 [rule 2] = -e2 [rule 3] |
e3123 = -e3321 [rule 2] = e12 [rule 4] |
e31234=
-e412= |
|||||||
a.e4 | e4 | e41234= -e231= e132= -e123 |
||||||||||||||
a.e12 | e12 | e121 = -e112 [rule 2] = -e2 [rule 3] |
e122 = e1 [rule 3] | e123 | e1212 = -e1122 [rule 2] = -1 [rule 5] |
e1231 = -e1132 [rule 2] = e23 [rule 3 & 4] |
e1223 = e13 [rule 3] -e31 [rule 4] |
e1234 | e12123 =-e11223 [rule 2] = -e3 [rule 3] |
e121234= -e34 |
||||||
a.e31 | e31 | e311 = e3 [rule 3] | e312 = -e132 [rule 4] = e123 [rule 4] |
e313 = -e331 [rule 2] = -e1 [rule 3] |
e3112 = e32 [rule 3] = -e23 [rule 4] |
e3131 = -e1133 [rule 2] = -1 [rule 5] |
e3123 = -e3321 [rule 2] = e12 [rule 3&4] |
e3124= -e1324= e1234 |
e31123 = e323 [rule 3] = -e332 = -e2 |
e311234= e3234= -e24 |
||||||
a.e23 | e23 | e231 =-e132 [rule 4] = e123 [rule 4] |
e232 = -e223 [rule 2] = -e3 [rule 3] |
e233 = e2 [rule 3] | e2312 = -e2213 [rule 2] = e31 [rule 3&4] |
e2331 = e21 [rule 3] = -e12 [rule 4] |
e2323 = -e3322 [rule 2] = -1 [rule 5] |
e2314= -e1324= e1234 |
e23123 = -e22133 [rule 2] = -e1 [rule 3] |
e231234= -e221334= -e14 |
||||||
a.e14 | e14 | e1423 = e1234 [rule 2] |
e1414 = -e1144 [rule 2] = -1 [rule 5] |
e141234= -e4234= e32= -e23= |
||||||||||||
a.e24 | e24 | e2431 = -e1432 [rule 2]= e1234 | e2424 = -e2244 [rule 2] = -1 [rule 5] |
e241234= -e31 |
||||||||||||
a.e34 | e34 | e3412= e1234 |
e3434 = -e3344 [rule 2] = -1 [rule 5] |
e341234= -e12 |
||||||||||||
a.e231 | e231 | e1231 = -e1123 [rule 2] = e23 [rule 3&4] |
e1232 =-e1223 [rule 2] = e31 [rule 3&4] |
e1233 = e12 [rule 3] | e2314=-e1324 =e1234 | e12312 = -e11322 [rule 2] = -e3 [rule 3] |
e12331 = e121 [rule 2] =-e112 = -e2 |
e12323 = -e12233 [rule 2] =-e1 [rule 3] |
e123123 = -e113223 [rule 2] = -1 [rule 5] |
e2311234= -e2211334= -e4 |
||||||
a.e214 | e214 | e2143 =-e1243 =e1234 | e214421= e2121= -1 |
e2141234= -e2411234= e23244= -e3 |
||||||||||||
a.e134 | e134 | e1342 =e1234 | e134134= -e114334= -1 |
e1341234= -e1143234= e33244= e2 |
||||||||||||
a.e324 | e324 | e3241 =-e1243 =e1234 | e324324= -e334224= -1 |
e3241234= -e3341224= -e414= e1= |
||||||||||||
a.e1234 | e1234 | e12341 = -e11342[rule 2]= -e342[rule 3]= e324[rule 2] |
e12342= -e12243[rule 2]= e134[rule 3]= |
e12343 = -e12433[rule 2]= e214[rule 3] |
e12344 = e123[rule 3] |
e123412 = -e113422 [rule 2] = e34 [rule 3] |
e123431 = -e124331 = e1142 = e42 [rule 2] |
e123423 = -e122433 [rule 2] =-e14 [rule 3] |
e123414 = -e1231 [rule 2] =e32 [rule 3] |
e123424 = -e1232 [rule 2] =e13 [rule 3] |
e123434 = -e12 [rule 2] |
e1234231 = -e1134232 [rule 2] =-e34232 [rule 3] |
e1234214 = -e1134224 [rule 2] =-e3 |
e1234413 = -e11323 [rule 2] =e2 [rule 3] |
e1234324 = -e12424 [rule 2] =e1 [rule 3] |
e12341234 = -e11342234 [rule 2] =e3443 [rule 3] |
So the finished table is:
a*b |
b.e | b.e1 | b.e2 | b.e3 | b.e4 | b.e12 | b.e31 | b.e23 | b.e14 | b.e42 | b.e34 | b.e123 | b.e214 | b.e143 | b.e234 | b.e1234 |
a.e | 1 | e1 | e2 | e3 | e4 | e12 | e31 | e23 | e14 | e42 | e34 | e123 | e214 | e143 | e234 | e1234 |
a.e1 | e1 | 1 | e12 | -e31 | e14 | e2 | -e3 | e123 | e4 | e214 | -e143 | e23 | e42 | -e34 | e1234 | e234 |
a.e2 | e2 | -e12 | 1 | e23 | -e42 | -e1 | e123 | e3 | e214 | -e4 | e234 | e31 | e14 | e1234 | e34 | e143 |
a.e3 | e3 | e31 | -e23 | 1 | e34 | e123 | e1 | -e2 | e143 | e234 | e4 | e12 | -e1234 | e14 | e42 | -e214 |
a.e4 | e4 | -e14 | e42 | -e34 | 1 | -e214 | e143 | e234 | -e1 | e2 | -e3 | -e1234 | -e12 | e31 | -e23 | -e123 |
a.e12 | e12 | -e2 | e1 | e123 | -e214 | -1 | e23 | -e31 | e42 | -e14 | e1234 | -e3 | e4 | e234 | -e143 | -e34 |
a.e31 | e31 | e3 | e123 | -e1 | e143 | -e23 | -1 | e12 | e34 | -e1234 | -e14 | -e2 | e234 | -e4 | -e214 | e42 |
a.e23 | e23 | e123 | -e3 | e2 | e234 | e31 | -e12 | -1 | e1234 | e34 | -e42 | -e1 | -e143 | e214 | -e4 | -e14 |
a.e14 | e14 | -e4 | e214 | e143 | e1 | -e42 | -e34 | e1234 | -1 | e12 | e31 | -e234 | -e2 | -e3 | e123 | -e23 |
a.e42 | e42 | e214 | e4 | e234 | -e2 | e14 | -e1234 | -e34 | -e12 | -1 | e23 | e143 | -e1 | -e123 | -e3 | -e31 |
a.e34 | e34 | -e143 | e234 | -e4 | e3 | e1234 | e14 | e42 | -e31 | -e23 | -1 | e214 | -e123 | -e1 | -e2 | -e12 |
a.e123 | e123 | e23 | e31 | e12 | e1234 | -e3 | -e2 | -e1 | e234 | -e143 | -e214 | -1 | -e34 | e42 | -e14 | -e4 |
a.e214 | e214 | e42 | e14 | e1234 | -e12 | -e4 | e234 | e143 | -e2 | -e1 | e123 | e34 | -1 | -e23 | e31 | e3 |
a.e143 | e143 | -e34 | -e1234 | e14 | e31 | -e234 | -e4 | -e214 | -e3 | e123 | e1 | -e42 | e23 | -1 | -e12 | -e2 |
a.e234 | e234 | -e1234 | e34 | e42 | e23 | e143 | e214 | -e4 | -e123 | -e3 | -e2 | e14 | -e31 | e12 | -1 | e1 |
a.e1234 | e1234 | -e234 | e143 |
e214 | e123 | -e34 | e42 |
-e14 |
-e23 | e31 | -e12 | e4 | -e3 | e2 | -e1 | 1 |
I have colour coded the elements to indicate which products commute and anticommute as follows:
commutes |
anticommutes |
commutes (although I expected it to anticommute) |
anticommutes (although I expected it to commute) |
You can check this by reflecting the cell you want to check in the leading diagonal (top left to bottom right) this is equivalent to swapping rows and columns, i.e. reversing the order of multiplication If the cell and the reflected cell are equal then it commute, if the cell is minus the reflected cell then it anticommutes.
I have marked up 4 pairs that appear to be anomalies, in that they seem to be the inverse of the others of the same type of product. Can anyone see how I could make the table more symmetrical by changing the order of the bivector and trivector components? Without trying all possible products I don't know if there is a set of bivectors and trivectors without any anomalies?
e,ex,ey,ez,ew,exy,exz,exw,eyz,eyw,ezw,exyz,exyw,exzw,eyzw,exyzw, ex,e,exy,exz,exw,ey,ez,ew,exyz,exyw,exzw,eyz,eyw,ezw,exyzw,eyzw, ey,-exy,e,eyz,eyw,-ex,-exyz,-exyw,ez,ew,eyzw,-exz,-exw,-exyzw,ezw,-exzw, ez,-exz,-eyz,e,ezw,exyz,-ex,-exzw,-ey,-eyzw,ew,exy,exyzw,-exw,-eyw,exyw, ew,-exw,-eyw,-ezw,e,exyw,exzw,-ex,eyzw,-ey,-ez,-exyzw,exy,exz,eyz,-exyz, exy,-ey,ex,exyz,exyw,-e,-eyz,-eyw,exz,exw,exyzw,-ez,-ew,-eyzw,exzw,-ezw, exz,-ez,-exyz,ex,exzw,eyz,-e,-ezw,-exy,-exyzw,exw,ey,eyzw,-ew,-exyw,eyw, exw,-ew,-exyw,-exzw,ex,eyw,ezw,-e,exyzw,-exy,-exz,-eyzw,ey,ez,exyz,-eyz, eyz,exyz,-ez,ey,eyzw,-exz,exy,exyzw,-e,-ezw,eyw,-ex,-exzw,exyw,-ew,-exw, eyw,exyw,-ew,-eyzw,ey,-exw,-exyzw,exy,ezw,-e,-eyz,exzw,-ex,-exyz,ez,exz, ezw,exzw,eyzw,-ew,ez,exyzw,-exw,exz,-eyw,eyz,-e,-exyw,exyz,-ex,-ey,-exy, exyz,eyz,-exz,exy,exyzw,-ez,ey,eyzw,-ex,-exzw,exyw,-e,-ezw,eyw,-exw,-ew, exyw,eyw,-exw,-exyzw,exy,-ew,-eyzw,ey,exzw,-ex,-exyz,ezw,-e,-eyz,exz,ez, exzw,ezw,exyzw,-exw,exz,eyzw,-ew,ez,-exyw,exyz,-ex,-eyw,eyz,-e,-exy,-ey, eyzw,-exyzw,ezw,-eyw,eyz,-exzw,exyw,-exyz,-ew,ez,-ey,exw,-exz,exy,-e,ex, exyzw,-eyzw,exzw,-exyw,exyz,-ezw,eyw,-eyz,-exw,exz,-exy,ew,-ez,ey,-ex,e,
In the above table we can see that some entries are commutative and some are anti-commutative, that is, if we swap rows and columns (or reflect in leading diagonal) some values remain the same and the others have their sign changed. We can also see that (A * B)† = B†* A† because if we rotate the whole table by 90 degrees then the entry will become its reversal.
I guess what we really need to know is that, given a multivector with numerical values: a.e, a.e1, a.e2, a.e3, a.e12, a.e31, a.e23 and a.e123 multiplied by a second multivector with numerical values: b.e, b.e1, b.e2, b.e3, b.e12, b.e31, b.e23 and b.e123 then what are the resulting numerical values. Multiplying out each term gives the following result:
e = | a.e * b.e | + a.e1 * b.e1 | + a.e2 * b.e2 | + a.e3 * b.e3 | - a.e12 * b.e12 | - a.e31 * b.e31 | - a.e23 * b.e23 | - a.e123 * b.e123 | + a.e? * b.e? | + a.e? * b.e? | + a.e? * b.e? | + a.e? * b.e? | + a.e? * b.e? | + a.e? * b.e? | + a.e? * b.e? | + a.e? * b.e? |
e1 = | a.e1 * b.e | + a.e * b.e1 | - a.e12 * b.e2 | + a.e31 * b.e3 | + a.e2 * b.e12 | - a.e3 * b.e31 | - a.e123 * b.e23 | - a.e23 * b.e123 | + a.e? * b.e? | + a.e? * b.e? | + a.e? * b.e? | + a.e? * b.e? | + a.e? * b.e? | + a.e? * b.e? | + a.e? * b.e? | + a.e? * b.e? |
e2 = | a.e2 * b.e | + a.e12 * b.e1 | + a.e * b.e2 | - a.e23 * b.e3 | - a.e1 * b.e12 | - a.e123 * b.e31 | + a.e3 * b.e23 | - a.e31 * b.e123 | + a.e? * b.e? | + a.e? * b.e? | + a.e? * b.e? | + a.e? * b.e? | + a.e? * b.e? | + a.e? * b.e? | + a.e? * b.e? | + a.e? * b.e? |
e3 = | a.e3 * b.e | - a.e31 * b.e1 | + a.e23 * b.e2 | + a.e * b.e3 | - a.e123 * b.e12 | + a.e1 * b.e31 | - a.e2 * b.e23 | - a.e12 * b.e123 | + a.e? * b.e? | + a.e? * b.e? | + a.e? * b.e? | + a.e? * b.e? | + a.e? * b.e? | + a.e? * b.e? | + a.e? * b.e? | + a.e? * b.e? |
e12 = | a.e12 * b.e | + a.e2 * b.e1 | - a.e1 * b.e2 | + a.e123 * b.e3 | + a.e * b.e12 | + a.e23 * b.e31 | - a.e31 * b.e23 | + a.e3 * b.e123 | + a.e? * b.e? | + a.e? * b.e? | + a.e? * b.e? | + a.e? * b.e? | + a.e? * b.e? | + a.e? * b.e? | + a.e? * b.e? | + a.e? * b.e? |
e31 = | a.e31 * b.e | - a.e3 * b.e1 | + a.e123 * b.e2 | + a.e1 * b.e3 | - a.e23 * b.e12 | + a.e * b.e31 | + a.e12 * b.e23 | + a.e2 * b.e123 | + a.e? * b.e? | + a.e? * b.e? | + a.e? * b.e? | + a.e? * b.e? | + a.e? * b.e? | + a.e? * b.e? | + a.e? * b.e? | + a.e? * b.e? |
e23 = | a.e23 * b.e | + a.e123 * b.e1 | + a.e3 * b.e2 | - a.e2 * b.e3 | + a.e31 * b.e12 | - a.e12 * b.e31 | + a.e * b.e23 | + a.e1 * b.e123 | + a.e? * b.e? | + a.e? * b.e? | + a.e? * b.e? | + a.e? * b.e? | + a.e? * b.e? | + a.e? * b.e? | + a.e? * b.e? | + a.e? * b.e? |
e123 = | a.e123 * b.e | + a.e23 * b.e1 | + a.e31 * b.e2 | + a.e12 * b.e3 | + a.e3 * b.e12 | + a.e2 * b.e31 | + a.e1 * b.e23 | + a.e * b.e123 | + a.e? * b.e? | + a.e? * b.e? | + a.e? * b.e? | + a.e? * b.e? | + a.e? * b.e? | + a.e? * b.e? | + a.e? * b.e? | + a.e? * b.e? |
Some programs implement multiplication by using Eddington Basis
Eddington Basis for aMonad E Number 1 : 0, 0, 0, 0, *0 E Number 2 : 0, 0, 0, 1, *1 E Number 3 : 0, 0, 0, 2, *2 E Number 4 : 0, 0, 0, 3, *3 E Number 5 : 0, 0, 0, 4, *4 E Number 6 : 0, 0, 1, 2, *7 E Number 7 : 0, 0, 1, 3, *8 E Number 8 : 0, 0, 1, 4, *9 E Number 9 : 0, 0, 2, 3, *13 E Number 10 : 0, 0, 2, 4, *14 E Number 11 : 0, 0, 3, 4, *19 E Number 12 : 0, 1, 2, 3, *38 E Number 13 : 0, 1, 2, 4, *39 E Number 14 : 0, 1, 3, 4, *44 E Number 15 : 0, 2, 3, 4, *69 E Number 16 : 1, 2, 3, 4, *194 Basis products for aMonad E Number 1 : 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, *0 E Number 2 : 2, 1, 6, 7, 8, 3, 4, 5, 12, 13, 14, 9, 10, 11, 16, 15, *1 E Number 3 : 3, -6, 1, 9, 10, -2, -12, -13, 4, 5, 15, -7, -8, -16, 11, -14, *2 E Number 4 : 4, -7, -9, 1, 11, 12, -2, -14, -3, -15, 5, 6, 16, -8, -10, 13, *3 E Number 5 : 5, -8, -10, -11, 1, 13, 14, -2, 15, -3, -4, -16, 6, 7, 9, -12, *4 E Number 6 : 6, -3, 2, 12, 13, -1, -9, -10, 7, 8, 16, -4, -5, -15, 14, -11, *7 E Number 7 : 7, -4, -12, 2, 14, 9, -1, -11, -6, -16, 8, 3, 15, -5, -13, 10, *8 E Number 8 : 8, -5, -13, -14, 2, 10, 11, -1, 16, -6, -7, -15, 3, 4, 12, -9, *9 E Number 9 : 9, 12, -4, 3, 15, -7, 6, 16, -1, -11, 10, -2, -14, 13, -5, -8, *13 E Number 10 : 10, 13, -5, -15, 3, -8, -16, 6, 11, -1, -9, 14, -2, -12, 4, 7, *14 E Number 11 : 11, 14, 15, -5, 4, 16, -8, 7, -10, 9, -1, -13, 12, -2, -3, -6, *19 E Number 12 : 12, 9, -7, 6, 16, -4, 3, 15, -2, -14, 13, -1, -11, 10, -8, -5, *38 E Number 13 : 13, 10, -8, -16, 6, -5, -15, 3, 14, -2, -12, 11, -1, -9, 7, 4, *39 E Number 14 : 14, 11, 16, -8, 7, 15, -5, 4, -13, 12, -2, -10, 9, -1, -6, -3, *44 E Number 15 : 15, -16, 11, -10, 9, -14, 13, -12, -5, 4, -3, 8, -7, 6, -1, 2, *69 E Number 16 : 16, -15, 14, -13, 12, -11, 10, -9, -8, 7, -6, 5, -4, 3, -2, 1, *194
In addition to the geometric product there are two more types of multiplication used in Geometric Algebra. These extend and generalise the 'dot' and 'cross' products used in 3D vector algebra.
Inner product by a vector reduces the grade of a multivector. It is related to the dot product.
Outer product by a vector increases the grade of a multivector. It is related to the cross product.
The outer product is denoted by ^ When two independent base vectors are outer multiplied, for instance e1^ e2, we cant further simplify the result so we just leave the result as: e1^ e2.
Let us consider 3D multivectors:
There are 3 combinations of outer products which cant be further reduced: e1^ e2, e3^ e1 and e2^ e3 so we can think of these as unit length base bivectors. Using the abbreviated notation this gives:
and one trivector:
In order to make sure we work out all possible combinations of outer products, I suggest using a table. This table only shows the type and sign change of the product, it does not attempt to show its absolute value. In other words the table shows unit length bases. To work out the absolute values we can multiply (not outer product) by scalar values so, for example, since e1 ^ e2 = e12 then 2 e1 ^ 3 e2 = 6 e12.
So we can start by entering the above results in the table, the value to the left of the ^ is represented by the columns and the value to the right of the ^ is represented by the rows. So when calculating a^b the column headings are denoted by a.?? and the rows are denoted by b.??
a^b |
b.e | b.e1 | b.e2 | b.e3 | b.e4 | b.e12 | b.e31 | b.e23 | b.e14 | b.e24 | b.e34 | b.e231 | b.e214 | b.e134 | b.e324 | b.e1234 |
a.e | ||||||||||||||||
a.e1 | e12 | |||||||||||||||
a.e2 | e23 | |||||||||||||||
a.e3 | e31 | |||||||||||||||
a.e4 | ||||||||||||||||
a.e12 | ||||||||||||||||
a.e31 | ||||||||||||||||
a.e23 | ||||||||||||||||
a.e14 | ||||||||||||||||
a.e24 | ||||||||||||||||
a.e34 | ||||||||||||||||
a.e231 | ||||||||||||||||
a.e214 | ||||||||||||||||
a.e134 | ||||||||||||||||
a.e324 | ||||||||||||||||
a.e1234 |
We can continue the above by outer multiplying a vector by a bivector to produce a tri-vector. Again when we get e1^ e2^ e3 this cannot be further reduced. There is only one such tri-vector (when we are working with 3D vectors) so in this case the tri-vector is one dimentional.
For instance:
e1^ (e2^ e3) = e1^ e2^ e2
(e1^ e2) ^ e3 = e1^ e2^ e3
In general the outer product is associative.
So using the abbreviated notation we get:
e1 ^ e23 = e123
e12 ^ e3 = e123
Putting these in the table we get: ?
a^b |
b.e | b.e1 | b.e2 | b.e3 | b.e4 | b.e12 | b.e31 | b.e23 | b.e14 | b.e24 | b.e34 | b.e231 | b.e214 | b.e134 | b.e324 | b.e1234 |
a.e | ||||||||||||||||
a.e1 | e12 | |||||||||||||||
a.e2 | e23 | |||||||||||||||
a.e3 | e31 | e123 | ||||||||||||||
a.e4 | ||||||||||||||||
a.e12 | ||||||||||||||||
a.e31 | e123 | |||||||||||||||
a.e23 | ||||||||||||||||
a.e14 | ||||||||||||||||
a.e24 | ||||||||||||||||
a.e34 | ||||||||||||||||
a.e231 | ||||||||||||||||
a.e214 | ||||||||||||||||
a.e134 | ||||||||||||||||
a.e324 | ||||||||||||||||
a.e1234 |
There is another rule that we can use, that is the fact that the outer product anticomutes, ie,
ei ^ ej = - ej ^ ei
However bivectors commute rather than anti-commute because:
(ei ^ ej )^( ek ^ em ) = ( ek ^ em ) ^ (ei ^ ej )
In other words we change the sign when we exchange individual bases, not blocks of bases.
We can also calculate e2^e31 = e2^ (e3^ e1)
= (e2^ e3) ^ e1 from associative rule
= -e1 ^ (e2^ e3) from anti-commute rule
= -e123
So we can also add this to the table and its reflection in diagonal. Making all these changes gives:
a^b |
b.e | b.e1 | b.e2 | b.e3 | b.e12 | b.e31 | b.e23 | b.e123 |
a.e | ||||||||
a.e1 | e12 | -e31 |
e123 | |||||
a.e2 | -e12 | e23 | e123 | |||||
a.e3 | e31 | -e23 | e123 | |||||
a.e12 | e123 | |||||||
a.e31 | e123 | |||||||
a.e23 | e123 | |||||||
a.e123 |
I'm not sure the best way to fill in the remaining gaps?
I think that a vector, outer multiplied by itself, will be zero? I cant find an identity to prove this in Hestenes but it seems to be needed to give a similar result to vector cross 'x' multiplication, so assume that:
a ^ a =0
where a is any vector.
Therefore e1 ^ e1 = e2^ e2 = e3 ^ e3 = 0 and this will also apply to vectors ^ bivectors and bivectors ^ bivectors for example,
ex^e12 = e1 ^ (e1 ^ e2)
= (e1 ^ e1 ) ^ e2
= 0 ^ e2
= 0
also
e12^e31 = (e1 ^ e2) ^ (e3 ^ e1)
= (e1 ^ e1 ) ^ (e2 ^ e3) by applying associatively and anti-commute twice
= 0 ^ (e2 ^ e3)
=0
So by similar logic virtually every remaining square will be zero, this does not seem right? can anyone help me here?
Note that the vector part of the table here:^ |
a.e1 | a.e2 | a.e3 |
b.e1 | 0 | e12 | -e31 |
b.e2 | -e12 | 0 | e23 |
b.e3 | e31 | -e23 | 0 |
is similar to the vector cross product:
× |
a.e1 | a.e2 | a.e3 |
b.e1 | 0 | e3 | -e2 |
b.e2 | -e3 | 0 | e1 |
b.e3 | e2 | -e1 | 0 |
except that in vector algebra we don't have bivectors so the result is mapped back to a vector as follows:
e1 ^ e2 —› e3
e2 ^ e3 —› e1
e3 ^ e1 —› e2
This relationship is given by:
a ^ b = i(a x b) = i a x b
The inner product is denoted by • and the inner product is given by:
(a e1 + b e2 + c e3 ) • (x e1 + y e2 + z e3)
multiplying our the terms gives:
a e1 • x e1 + b e2 • x e1+ c e3 • x e1 + a e1 • y e2+ b e2 • y e2+ c e3 • y e2 + a e1 • z e3+ b e2 • z e3+ c e3 • z e3
Here are some identities for •:
A • B = B • A | Commutivity law, reversing the order of inner product does not change the result. |
ei • ei = 1 | Outer product of vector with itself is 1 (e1 • e1 = e2• e2 = e3 • e3 = 1) |
ei^ej • ei^ej = -1 | Outer product of bivector with itself is -1 (e1^e2 • e1^e2 = e2^e3•e2^e3= e3^e1 •e3^e1 = -1) |
e1^e2^e3 • e1^e2^e3= -1 | Outer product of tri-vector with itself is -1 |
ei • ej = 0 | Product of different base vectors is zero |
e1• 0 = 0 | inner product with 0 gives 0 result |
A• 1 = A | inner product with 1 does not change result |
(a^b)•(c^d) = a•(b•(c^d))= b•(c^d)•a | from Hestenes (New Foundations of Classical Mechanics) pp47 exercise 2.1 |
The inner product is not associative: a•(b•c) may not equal (a•b)•c
So the above expression reduces down to the scalar value: a x + b y + c z
• |
a.e1 | a.e2 | a.e3 |
b.e1 | e | 0 | 0 |
b.e2 | 0 | e | 0 |
b.e3 | 0 | 0 | e |
Which is exactly the same as a dot product in 3D.
We can extend the table above to include scalars, bivectors and tri-vectors in addition to the vectors above.
Inner multiplying something by a scalar (regardless of whether the scalar is on the left or right) does no change its type. So a vector inner multiplied by a scalar is a vector: 1 • e1 = e1• 1 = e1 of course a scalar dot multiplied by a scalar is a scalar: 1•1=1
The result of inner multiplying a vector base by a bivector base depends on weather they contain a common base,
if they do the result is zero: e1•(e1^e2)=0
if they don't the result is a minus tri-vector: e1•(e2^e3) = - e1^e2^e3
The result of inner multiplying a bivector base by a bivector base also depends on weather they contain a common base,
If they don't the result is a minus scalar: (e1^e2)•(e1^e2)=-1
If they do the result is zero: (e1^e2)•(e1^e3)=0
Inner multiplying by a tri-vector turns a vector into a bivector and a bivector into minus a vector and another tri-vector into minus a scalar:
(e1^e2^e3)•e1=e2^e3
(e1^e2^e3)•(e1^e2)=-e3
(e1^e2^e3)•(e1^e2^e3)=-1
So from these we can derive the full table:
a•b |
a.e | a.e1 | a.e2 | a.e3 | a.e12 | a.e31 | a.e23 | a.e123 |
b.e | e | e1 | e2 | e3 | e12 | e31 | e23 | e123 |
b.e1 | e1 | e | 0 | 0 | 0 | 0 | e123 | e23 |
b.e2 | e2 | 0 | e | 0 | 0 | e123 | 0 | e31 |
b.e3 | e3 | 0 | 0 | e | e123 | 0 | 0 | e12 |
b.e12 | e12 | 0 | 0 | e123 | -e | 0 | 0 | -e3 |
b.e31 | e31 | 0 | e123 | 0 | 0 | -e | 0 | -e2 |
b.e23 | e23 | e123 | 0 | 0 | 0 | 0 | -e | -e1 |
b.e123 | e123 | e23 | e31 | e12 | -e3 | -e2 | -e1 | -e |
So multipying out each term gives the following result:
e = | a.e * b.e | + a.ex * b.ex | + a.ey * b.ey | + a.ez * b.ez | - a.exy * b.exy | - a.ezx * b.ezx | - a.eyz * b.eyz | - a.exyz * b.exyz |
ex = | a.ex * b.e | + a.e * b.ex | - a.exy * b.ey | + a.ezx * b.ez | + a.ey * b.exy | - a.ez * b.ezx | - a.exyz * b.eyz | - a.eyz * b.exyz |
ey = | a.ey * b.e | + a.exy * b.ex | + a.e * b.ey | - a.eyz * b.ez | - a.ex * b.exy | - a.exyz * b.ezx | + a.ez * b.eyz | - a.ezx * b.exyz |
ez = | a.ez * b.e | - a.ezx * b.ex | + a.eyz * b.ey | + a.e * b.ez | - a.exyz * b.exy | + a.ex * b.ezx | - a.ey * b.eyz | - a.exy * b.exyz |
exy = | a.exy * b.e | + a.ey * b.ex | - a.ex * b.ey | + a.exyz * b.ez | + a.e * b.exy | + a.eyz * b.ezx | - a.ezx * b.eyz | + a.ez * b.exyz |
ezx = | a.ezx * b.e | - a.ez * b.ex | + a.exyz * b.ey | + a.ex * b.ez | - a.eyz * b.exy | + a.e * b.ezx | + a.exy * b.eyz | + a.ey * b.exyz |
eyz = | a.eyz * b.e | + a.exyz * b.ex | + a.ez * b.ey | - a.ey * b.ez | + a.ezx * b.exy | - a.exy * b.ezx | + a.e * b.eyz | + a.ex * b.exyz |
exyz = | a.exyz * b.e | + a.eyz * b.ex | + a.ezx * b.ey | + a.exy * b.ez | + a.ez * b.exy | + a.ey * b.ezx | + a.ex * b.eyz | + a.e * b.exyz |
As with matrix and quaternion multiplication the order of the multiplicands is important (multiplication on mutivectors is not commutative). As you can see from the first table some of the terms are symmetric (a*b = b*a) and some are anti-symetric (a*b = - b*a) so overall the multiplication operation is not symmetrical.
There are two other multiplication types which can be applied to multivectors:
The inner product is similar to the vector dot product, for the vector part of the multivector the type is given by the following table:
| a.ex | a.ey | a.ez |
b.ex | e | 0 | 0 |
b.ey | 0 | e | 0 |
b.ez | 0 | 0 | e |
This is symmetrical (ab = ba)
So the inner product produces a scalar as follows:
e = | + a.ex * b.ex | + a.ey * b.ey | + a.ez * b.ez |
This can be defined from the geometric product as follows:
ab = ½ (ab + ba)
The outer product is similar to the vector cross product except that it produces a bivector as output, for the vector part of the multivector the type is given by the following table:
^ | a.ex | a.ey | a.ez |
b.ex | 0 | exy | -ezx |
b.ey | -exy | 0 | eyz |
b.ez | ezx | -eyz | 0 |
This is anti-symetrical (a^b = - b^a)
So the outer product produces a bivector as follows:
exy = | a.ey * b.ex | - a.ex * b.ey |
ezx = | a.ex * b.ez | - a.ez * b.ex |
eyz = | a.ez * b.ey | - a.ey * b.ez |
This can be defined from the geometric product as follows:
a^b = ½ (ab - ba)
So for vectors the inner product reduces the grade from 1 to 0, in other words from vectors to scalars. The outer product increases the grade from 1 to 2, in other words from vectors to bivectors.
The geometric product is given by adding the inner and outer products:
a * b = ab + a^b
The inner product can be generalised from vectors to multivectors as follows:
aK = ½ (aK + (-1)k+1Ka)
Where k is the grade of K. The (-1)k factor alternates the sign as follows:
grade k | (-1)k | (-1)k+1 |
0 (scalar) | 1 | -1 |
1 (vector) | -1 | 1 |
2 (bivector) | 1 | -1 |
3 (trivector) | -1 | 1 |
So when calculating the inner product terms the result will be of type given by the following table:
a.e | a.ex | a.ey | a.ez | a.exy | a.ezx | a.eyz | a.exyz | |
b.e | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
b.ex | ex | e | 0 | 0 | 0 | 0 | exyz | eyz |
b.ey | ey | 0 | e | 0 | 0 | exyz | 0 | ezx |
b.ez | ez | 0 | 0 | e | exyz | 0 | 0 | exy |
b.exy | 0 | -ey | ex | 0 | 0 | eyz | -ezx | 0 |
b.ezx | 0 | ez | 0 | -ex | -eyz | 0 | exy | 0 |
b.eyz | 0 | 0 | -ez | ey | ezx | -exy | 0 | 0 |
b.exyz | exyz | eyz | ezx | exy | -ez | -ey | -ex | -e |
The outer product can be generalised from vectors to multivectors as follows:
a^K = ½ (aK + (-1)kKa)
So when calculating the outer product terms the result will be of type given by the following table:
^ | a.e | a.ex | a.ey | a.ez | a.exy | a.ezx | a.eyz | a.exyz |
b.e | e | ex | ey | ez | exy | ezx | eyz | exyz |
b.ex | 0 | 0 | exy | -ezx | ey | -ez | 0 | 0 |
b.ey | 0 | -exy | 0 | eyz | -ex | 0 | ez | 0 |
b.ez | 0 | ezx | -eyz | 0 | 0 | ex | -ey | 0 |
b.exy | exy | 0 | 0 | exyz | -e | 0 | 0 | -ez |
b.ezx | ezx | 0 | exyz | 0 | 0 | -e | 0 | -ey |
b.eyz | eyz | exyz | 0 | 0 | 0 | 0 | -e | -ex |
b.exyz | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
So multipying out each term gives the following result:
e = | a.e * b.e | - a.exy * b.exy | - a.ezx * b.ezx | - a.eyz * b.eyz |
ex = | a.ex * b.e | - a.exy * b.ey | + a.ezx * b.ez | - a.exyz * b.eyz |
ey = | a.ey * b.e | + a.exy * b.ex | - a.eyz * b.ez | - a.exyz * b.ezx |
ez = | a.ez * b.e | - a.ezx * b.ex | + a.eyz * b.ey | - a.exyz * b.exy |
exy = | a.exy * b.e | + a.ey * b.ex | - a.ex * b.ey | + a.e * b.exy |
ezx = | a.ezx * b.e | - a.ez * b.ex | + a.ex * b.ez | + a.e * b.ezx |
eyz = | a.eyz * b.e | + a.ez * b.ey | - a.ey * b.ez | + a.e * b.eyz |
exyz = | a.exyz * b.e | + a.ez * b.exy | + a.ey * b.ezx | + a.ex * b.eyz |
Another approach is to derive the inner and outer products from the geometric product:
a*b |
b.e | b.e1 | b.e2 | b.e3 | b.e12 | b.e31 | b.e23 | b.e123 |
a.e | 1 | e1 | e2 | e3 | e12 | e31 | e23 | e123 |
a.e1 | e1 | 1 | e12 | -e31 | e2 | -e3 | e123 | e23 |
a.e2 | e2 | -e12 | 1 | e23 | -e1 | e123 | e3 | e31 |
a.e3 | e3 | e31 | -e23 | 1 | e123 | e1 | -e2 | e12 |
a.e12 | e12 | -e2 | e1 | e123 | -1 | e23 | -e31 | -e3 |
a.e31 | e31 | e3 | e123 | -e1 | -e23 | -1 | e12 | -e2 |
a.e23 | e23 | e123 | -e3 | e2 | e31 | -e12 | -1 | -e1 |
a.e123 | e123 | e23 | e31 | e12 | -e3 | -e2 | -e1 | -1 |
If a and b are vectors then:
a•b = (a*b + b*a)/2
a^b = (a*b - b*a)/2
a*b = a•b + a^b
So we can fill in the vector part of the table:
a^b |
b.e | b.e1 | b.e2 | b.e3 | b.e12 | b.e31 | b.e23 | b.e123 |
a.e | ||||||||
a.e1 | 0 | e12 | -e31 | |||||
a.e2 | -e12 | 0 | e23 | |||||
a.e3 | e31 | -e23 | 0 | |||||
a.e12 | ||||||||
a.e31 | ||||||||
a.e23 | ||||||||
a.e123 |
There are corresponding equations for multiplying vectors by any general multivector:
a•Br = 0.5 ( a*Br -(-1)r Br*a) = (-1)r+1Br•a
a^Br = 0.5 ( a*Br +(-1)r Br*a) = (-1)rBr^a
a*B = a•B + a^B
A*b = A •b + A^b
Where:
So this allows us to fill in the terms containing vectors
a^b |
b.e | b.e1 | b.e2 | b.e3 | b.e12 | b.e31 | b.e23 | b.e123 |
a.e | e1 | e2 | e3 | |||||
a.e1 | e1 | 0 | e12 | -e31 | 0 | 0 | e123 | 0 |
a.e2 | e2 | -e12 | 0 | e23 | 0 | e123 | 0 | 0 |
a.e3 | e3 | e31 | -e23 | 0 | e123 | 0 | 0 | 0 |
a.e12 | 0 | 0 | e123 | |||||
a.e31 | 0 | e123 | 0 | |||||
a.e23 | e123 | 0 | 0 | |||||
a.e123 | 0 | 0 | 0 |
I don't know how to derive the remaining terms from the geometric product, I think the remaining terms must be zero?
Using the same methods we can derive the results for inner product.
a•b |
b.e | b.e1 | b.e2 | b.e3 | b.e12 | b.e31 | b.e23 | b.e123 |
a.e | 0 | 0 | 0 | |||||
a.e1 | 0 | 1 | 0 | 0 | e2 | -e3 | 0 | e23 |
a.e2 | 0 | 0 | 1 | 0 | -e1 | 0 | e3 | e31 |
a.e3 | 0 | 0 | 0 | 1 | 0 | e1 | -e2 | e12 |
a.e12 | -e2 | e1 | 0 | |||||
a.e31 | e3 | 0 | -e1 | |||||
a.e23 | 0 | -e3 | e2 | |||||
a.e123 | e23 | e31 | e12 |
An alternative type of inner product.
A|B is a blade representing the complement (within the subspace B) of the orthogonal projection of A onto B it is linier in A and B; and it coincides with the usual inner product ab of Vn when computed for vectors a & b
This can be derived from the following rules:
scalars | = |
vector times scalar | a = 0 |
scalar times vector | b= b |
vectors | ab= ab |
vector and element | a(b^B)= (ab)^B - b ^ (aB) |
distribution | (A^B)C = A(BC ) |
a.e | a.ex | a.ey | a.ez | a.exy | a.ezx | a.eyz | a.exyz | |
b.e | e | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
b.ex | ex | e | 0 | 0 | 0 | 0 | 0 | 0 |
b.ey | ey | 0 | e | 0 | 0 | 0 | 0 | 0 |
b.ez | ez | 0 | 0 | e | 0 | 0 | 0 | 0 |
b.exy=b.ex^b.ey | 0 | ey |
-ex | 0 | -e | 0 | 0 | 0 |
b.ezx | 0 | -ez | 0 | ex | 0 | -e | 0 | 0 |
b.eyz | 0 | 0 | ez | -ey | 0 | 0 | -e | 0 |
b.exyz | 0 | eyz | ezx | exy | -ez | -ey | -ex | -e |
We don't tend to use the notation for division, since multivector multiplication is not commutative we need to be able to distinguish between [a][b]-1 and [b]-1[a]. So instead of a divide operation we tend to multiply by the inverse.
So the problem is, how to calculate the inverse of a multivector, this is discussed here.
metadata block |
|
see also: |
|
Correspondence about this page | |
Book Shop - Further reading. Where I can, I have put links to Amazon for books that are relevant to the subject, click on the appropriate country flag to get more details of the book or to buy it from them. |
|
Terminology and Notation Specific to this page here: |
|
This site may have errors. Don't use for critical systems.
Copyright (c) 1998-2023 Martin John Baker - All rights reserved - privacy policy.