Skip to content

Commit

Permalink
new file: .junk/dot
Browse files Browse the repository at this point in the history
renamed:    try2pauliGA.nb -> .junk/try2pauliGA.nb
renamed:    try3pauli.nb -> .junk/try3pauli.nb
renamed:    tryPauliGA.nb -> .junk/tryPauliGA.nb
modified:   pauliGA.m
deleted:    pauliGASamples.txt
new file:   test/test.f
new file:   test/test.minus
new file:   test/test.q
new file:   test/test.s
modified:   testPauliCL30.nb
  • Loading branch information
Peeter Joot committed Dec 26, 2016
1 parent fbe0ae4 commit 38d4ee9
Show file tree
Hide file tree
Showing 11 changed files with 1,029 additions and 69 deletions.
32 changes: 32 additions & 0 deletions .junk/dot
@@ -0,0 +1,32 @@
grade /: grade[0, s_] . grade[k_, m_] := grade[k, s*m] ;
grade /: grade[k_, m_] . grade[0, s_] := grade[k, s*m] ;

grade /: (t_?trivectorQ) . m_grade := t m ;
grade /: m_grade . (t_?trivectorQ) := t m ;

grade /: (v1_?vectorQ) . grade[1, v2_] := symmetric[0, v1, grade[1, v2]] ;
grade /: (v_?vectorQ) . grade[2, b_] := antisymmetric[0, v, grade[2, b]] ;
grade /: (b_?bivectorQ) . grade[1, v_] := antisymmetric[0, b, grade[1, v]] ;
grade /: (b1_?bivectorQ) . grade[2, b2_] := symmetric[0, b1, grade[2, b2]] ;


Total[ g0 . v2, g1 . v2, g2 . v2, g3 . v2 ]
Total[ v1 . g0, v1 . g1, v1 . g2, v1 . g3 ]
Total[ m1 . g0, m1 . g1, m1 . g2, m1 . g3 ]
{{s . s, s . v, s . b, s . t, s . m}, {v . s, v . v, v . b, v . t, v . m}, {b . s, b . v, b . b, b . t, b . m}, {t . s, t . v, t . b, t . t, t . m}, {m . s, m . v, m . b, m . t, m . m}} // Grid

DotProduct[m_grade, v2_?bladeQ] :=
Module[{g0, g1, g2, g3}, {g0, g1, g2, g3} =
GradeSelection[m, #] & /@ (Range[4] - 1);
Total[DotProduct[g0, v2], DotProduct[g1, v2], DotProduct[g2, v2],
DotProduct[g3, v2]]]
DotProduct[v1_?bladeQ, m_grade] :=
Module[{g0, g1, g2, g3}, {g0, g1, g2, g3} =
GradeSelection[m, #] & /@ (Range[4] - 1);
Total[DotProduct[v1, g0], DotProduct[v1, g1], DotProduct[v1, g2],
DotProduct[v1, g3]]]
DotProduct[m1_grade, m2_grade] :=
Module[{g0, g1, g2, g3}, {g0, g1, g2, g3} =
GradeSelection[m2, #] & /@ (Range[4] - 1);
Total[DotProduct[m1, g0], DotProduct[m1, g1], DotProduct[m1, g2],
DotProduct[m1, g3]]]
File renamed without changes.
File renamed without changes.
File renamed without changes.
46 changes: 26 additions & 20 deletions pauliGA.m
Expand Up @@ -54,7 +54,14 @@
TODO:
3) Test!
3) Tests:
st * vb Scalars and trivectors can multiply vectors and bivectors in any order
vb1 ** vb1 Vectors and bivectors when multiplied have to use the NonCommutativeMultiply operator, but any grade object may also.
m1 . m2 Dot product. The functional form Dot[m1, m2] may also be used.
m1 ^ m2 Wedge product. Enter with m1 [Esc]^[Esc] m2. The functional form Wedge[m1, m2]
<m> Scalar selection. Enter with [Esc]<[Esc] m [Esc]>[Esc]. The functional form ScalarValue[m] may also be used. This returns the numeric (or expression) value of the scalar grade of the multivector, and not a grade[] object.
<m1,m2> Scalar product. Enter with [Esc]<[Esc] m1,m2 [Esc]>[Esc]. The functional form ScalarProduct[m1, m2] may also be used. This returns the numeric (or expression) value of the scalar product of the multivectors, and not a grade[] object.
4) How to get better formatted output by default without using one of TraditionalForm, DisplayForm, StandardForm ?
Expand Down Expand Up @@ -224,6 +231,24 @@
pauliGradeSelect3 := pauliGradeSelect[#, 3] &;
(*End["`Private`"]*)

ClearAll[GradeSelection, ScalarSelection, VectorSelection, \
BivectorSelection, TrivectorSelection]

GradeSelection::usage = "GradeSelection[m, k] selects the grade k elements from the multivector m. The selected result is represented internally as a grade[] type (so scalar selection is not just a number).";
GradeSelection[m_?scalarQ, 0] := m;
GradeSelection[m_?vectorQ, 1] := m;
GradeSelection[m_?bivectorQ, 2] := m;
GradeSelection[m_?trivectorQ, 3] := m;
GradeSelection[m_, k_Integer /; k >= 0 && k <= 3] :=
grade[k, pauliGradeSelect[m // Last, k]];
ScalarSelection::usage = "ScalarSelection[m] selects the grade 0 (scalar) elements from the multivector m. The selected result is represented internally as a grade[] type (not just a number or an expression).";
ScalarSelection := GradeSelection[#, 0] &;
VectorSelection::usage = "VectorSelection[m] selects the grade 1 (vector) elements from the multivector m. The selected result is represented internally as a grade[] type.";
VectorSelection := GradeSelection[#, 1] &;
BivectorSelection::usage = "BivectorSelection[m] selects the grade 2 (bivector) elements from the multivector m. The selected result is represented internally as a grade[] type.";
BivectorSelection := GradeSelection[#, 2] &;
TrivectorSelection::usage = "TrivectorSelection[m] selects the grade 3 (trivector) element from the multivector m if it exists. The selected result is represented internally as a grade[] type (not just an number or expression).";
TrivectorSelection := GradeSelection[#, 3] &;

(* Plus *)
grade /: (v1_?notGradeQ) + grade[k_, v2_] := Scalar[v1] + grade[k, v2] ;
Expand Down Expand Up @@ -261,25 +286,6 @@
grade /: (b1_?bivectorQ).grade[2, b2_] :=
symmetric[0, b1, grade[2, b2]];

ClearAll[GradeSelection, ScalarSelection, VectorSelection, \
BivectorSelection, TrivectorSelection]

GradeSelection::usage = "GradeSelection[m, k] selects the grade k elements from the multivector m. The selected result is represented internally as a grade[] type (so scalar selection is not just a number).";
GradeSelection[m_?scalarQ, 0] := m;
GradeSelection[m_?vectorQ, 1] := m;
GradeSelection[m_?bivectorQ, 2] := m;
GradeSelection[m_?trivectorQ, 3] := m;
GradeSelection[m_, k_Integer /; k >= 0 && k <= 3] :=
grade[k, pauliGradeSelect[m // Last, k]];
ScalarSelection::usage = "ScalarSelection[m] selects the grade 0 (scalar) elements from the multivector m. The selected result is represented internally as a grade[] type (not just a number or an expression).";
ScalarSelection := GradeSelection[#, 0] &;
VectorSelection::usage = "VectorSelection[m] selects the grade 1 (vector) elements from the multivector m. The selected result is represented internally as a grade[] type.";
VectorSelection := GradeSelection[#, 1] &;
BivectorSelection::usage = "BivectorSelection[m] selects the grade 2 (bivector) elements from the multivector m. The selected result is represented internally as a grade[] type.";
BivectorSelection := GradeSelection[#, 2] &;
TrivectorSelection::usage = "TrivectorSelection[m] selects the grade 3 (trivector) element from the multivector m if it exists. The selected result is represented internally as a grade[] type (not just an number or expression).";
TrivectorSelection := GradeSelection[#, 3] &;

(* Dot ; handle dot products where one or more factors is a \
multivector.
Fixme: there's probably a fancier "Mathematica" way to distribute the \
Expand Down
36 changes: 0 additions & 36 deletions pauliGASamples.txt

This file was deleted.

11 changes: 11 additions & 0 deletions test/test.f
@@ -0,0 +1,11 @@
Column[
(# // TraditionalForm) &/@ { s0, e1, e2, e3, b23, b31, b12, t123, m01, m02, m03, m12, m13, m23, m012, m013, m023, m123 }
]

Column[
(# // StandardForm) &/@ { s0, e1, e2, e3, b23, b31, b12, t123, m01, m02, m03, m12, m13, m23, m012, m013, m023, m123 }
]

Column[
(# // DisplayForm) &/@ { s0, e1, e2, e3, b23, b31, b12, t123, m01, m02, m03, m12, m13, m23, m012, m013, m023, m123 }
]
18 changes: 18 additions & 0 deletions test/test.minus
@@ -0,0 +1,18 @@
Assert[ -s0 == Scalar[-1] ] ;
Assert[ -e1 == Vector[-1, 1] ] ;
Assert[ -e2 == Vector[-1, 2] ] ;
Assert[ -e3 == Vector[-1, 3] ] ;
Assert[ -b23 == Bivector[-1, 2, 3] ] ;
Assert[ -b31 == Bivector[-1, 3, 1] ] ;
Assert[ -b12 == Bivector[-1, 1, 2] ] ;
Assert[ -t123 == Trivector[-1] ] ;
Assert[ -m01 == -s0 - e1 ] ;
Assert[ -m02 == -s0 - b23 ] ;
Assert[ -m03 == -s0 - t123 ] ;
Assert[ -m12 == -e1 - b23 ] ;
Assert[ -m13 == -e1 - t123 ] ;
Assert[ -m23 == -b23 - t123 ] ;
Assert[ -m012 == -s0 - e1 - b23 ] ;
Assert[ -m013 == -s0 - e1 - t123 ] ;
Assert[ -m023 == -s0 - b23 - t123 ] ;
Assert[ -m123 == -e1 - b23 - t123 ] ;
17 changes: 17 additions & 0 deletions test/test.q
@@ -0,0 +1,17 @@
{ Assert[bladeQ[#]] } &/@ { s0, e1, e2, e3, b23, b31, b12, t123 } ;
{ Assert[!bladeQ[#]] } &/@ { m01, m02, m03, m12, m13, m23, m012, m013, m023, m123 } ;
{ Assert[gradeAnyQ[#]] } &/@ { s0, e1, e2, e3, b23, b31, b12, t123, m01, m02, m03, m12, m13, m23, m012, m013, m023, m123 } ;
{ Assert[!gradeAnyQ[#]] } &/@ { 1, Sin[x], Exp[ I theta] } ;
{ Assert[!notGradeQ[#]] } &/@ { s0, e1, e2, e3, b23, b31, b12, t123, m01, m02, m03, m12, m13, m23, m012, m013, m023, m123 } ;
{ Assert[notGradeQ[#]] } &/@ { 1, Sin[x], Exp[ I theta] } ;
{ Assert[gradeQ[#, 0]], Assert[scalarQ[#]] } &/@ { s0 } ;
{ Assert[!gradeQ[#, 0]], Assert[!scalarQ[#]] } &/@ { e1, e2, e3, b23, b31, b12, t123, m01, m02, m03, m12, m13, m23, m012, m013, m023, m123 } ;
{ Assert[gradeQ[#, 1]], Assert[vectorQ[#]] } &/@ { e1, e2, e3 } ;
{ Assert[!gradeQ[#, 1]], Assert[!vectorQ[#]] } &/@ { s0, b23, b31, b12, t123, m01, m02, m03, m12, m13, m23, m012, m013, m023, m123 } ;
{ Assert[gradeQ[#, 2]], Assert[bivectorQ[#]] } &/@ { b23, b31, b12 } ;
{ Assert[!gradeQ[#, 2]], Assert[!bivectorQ[#]] } &/@ { s0, e1, e2, e3, t123, m01, m02, m03, m12, m13, m23, m012, m013, m023, m123 } ;
{ Assert[gradeQ[#, 3]], Assert[trivectorQ[#]] } &/@ { t123 } ;
{ Assert[!gradeQ[#, 3]], Assert[!trivectorQ[#]] } &/@ { s0, e1, e2, e3, b23, b31, b12, m01, m02, m03, m12, m13, m23, m012, m013, m023, m123 } ;
{ Assert[gradeQ[#, -1]] } &/@ { m01, m02, m03, m12, m13, m23, m012, m013, m023, m123 } ;
{ Assert[!gradeQ[#, -1]] } &/@ { s0, e1, e2, e3, b23, b31, b12, t123 } ;

13 changes: 13 additions & 0 deletions test/test.s
@@ -0,0 +1,13 @@
{ Assert[GradeSelection[#, 0] == s0], Assert[ScalarSelection[#] == s0] } & /@ { s0, m01, m02, m03, m013, m012, m023 } ;
{ Assert[GradeSelection[#, 0] == 0], Assert[ScalarSelection[#] == 0] } & /@ { e1, e2, e3, b23, b31, b12, t123, m12, m13, m23, m123 } ;

{ Assert[GradeSelection[#, 1] == e1], Assert[VectorSelection[#] == e1] } & /@ { e1, m01, m12, m13, m012, m013, m123 } ;
{ Assert[GradeSelection[#, 1] == 0], Assert[VectorSelection[#] == 0] } & /@ { s0, b23, b31, b12, t123, m02, m03, m23, m023 };

{ Assert[GradeSelection[#, 2] == b23], Assert[BivectorSelection[#] == b23] } & /@ { b23, m02, m12, m23, m023, m123, m012 };
{ Assert[GradeSelection[#, 2] == 0], Assert[BivectorSelection[#] == 0] } & /@ { s0, e1, e2, e3, t123, m01, m03, m13, m013 };

{ Assert[GradeSelection[#, 3] == t123], Assert[TrivectorSelection[#] == t123] } & /@ { t123, m03, m13, m23, m013, m023, m123 } ;
{ Assert[GradeSelection[#, 3] == 0], Assert[TrivectorSelection[#] == 0] } & /@ { s0, e1, e2, e3, b23, b31, b12, m01, m02, m12, m012 } ;


0 comments on commit 38d4ee9

Please sign in to comment.