Maths - 4D Clifford Algebra - Arithmetic

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:

scalar e          
vector e1 e2 e3 e4    
bivector e12 e31 e23 e14 e42 e34
tri-vector e123 e214 e143 e234    
quad-vector e1234            
scalar e          
vector e1 e2 e3 e4    
bivector e12 e31 e23 e14 e42 e34
tri-vector e123 e214 e143 e234    
quad-vector e1234            
=
scalar e          
vector e1 e2 e3 e4    
bivector e12 e31 e23 e14 e42 e34
tri-vector e123 e214 e143 e234    
quad-vector e1234            

Adding multi vectors numbers

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

Subtracting multi vectors numbers

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).

Multiplying 4D multivectors numbers (geometric product)

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:

  1. Write down the indices of both terms, the indices of the left hand multiplicand followed immediately by the indices of the right hand multiplicand without a space. If either of the terms is negative then put a negative sign in front, if both terms are negative then the composite is positive.
  2. If this contains any duplicate numbers, then swap any two numbers to make the duplicate numbers adjacent, every swap inverts the sign.
  3. Adjacent duplicate numbers can then be removed, repeat step 2 until all duplicate terms are removed.
  4. If the remaining numbers are not in the same order as the base values then swap any two numbers, as before every swap inverts the sign.
  5. If there are no numbers left the result is e (or -e if negative).

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]
=-e23 [rule 3]

e123424 = -e1232 [rule 2]

=e13 [rule 3]
=-e31 [rule 3]

e123434 = -e12 [rule 2]

e1234231 = -e1134232 [rule 2]

=-e34232 [rule 3]
=e343 [rule 3]=
-e4 [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]
=1 [rule 5]

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?

alternative method

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

Inner and Outer products

trasitions

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.

Outer 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

Inner product of vectors

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.

Inner and Outer Product

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 (a•b = b•a)

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:

a•b = ½ (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 = a•b + a^b

Inner Product

The inner product can be generalised from vectors to multivectors as follows:

a•K = ½ (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:

inner 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

 

Outer Product

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

Alternative way to derive Inner and Outer Product from Geometric Product

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        

 

Contraction inner product

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 a•b of Vn when computed for vectors a & b

This can be derived from the following rules:

scalars alphainnerbeta = alphabeta
vector times scalar ainnerbeta = 0
scalar times vector alphainnerb= alphab
vectors ainnerb= a•b
vector and element ainner(b^B)= (ainnerb)^B - b ^ (ainnerB)
distribution (A^B)innerC = Ainner(BinnerC )

 

  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

Division

We don't tend to use the divide 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.

flag flag flag flag flag flag Clifford Algebra to Geometric Calculus: A Unified Language for Mathematics and Physics (Fundamental Theories of Physics). This book is intended for mathematicians and physicists rather than programmers, it is very theoretical. It covers the algebra and calculus of multivectors of any dimension and is not specific to 3D modelling.

 

flag flag flag flag flag flag New Foundations for Classical Mechanics (Fundamental Theories of Physics). This is very good on the geometric interpretation of this algebra. It has lots of insights into the mechanics of solid bodies. I still cant work out if the position, velocity, etc. of solid bodies can be represented by a 3D multivector or if 4 or 5D multivectors are required to represent translation and rotation.

 

Terminology and Notation

Specific to this page here:

 

This site may have errors. Don't use for critical systems.

Copyright (c) 1998-2017 Martin John Baker - All rights reserved - privacy policy.