BeginPackage["Minkowski`", "Normalize`"] Minkowski::usage = "\n Minkowski[x], where x has head List, is a vector in Minkowski space.\n Such vectors can be added and multiplied by scalars.\n Dot, Cross and Normalize are suitably modified." Cross::usage = "\n Cross[x_,y_], where x and y are vectors in Minkowski space, gives their\n cross product." Begin["`private`"] Minkowski[x_List]+Minkowski[y_List] ^:= Minkowski[x+y] x_*Minkowski[y_List] ^:= Minkowski[x*y] (* here x is meant as a scalar *) Minkowski[{xs__,lastx_}].Minkowski[{ys__,lasty_}] ^:= {xs}.{ys} - lastx lasty Normalize::isotropic = "Cannot normalize ``" Normalize[x_Minkowski] := (Message[Normalize::isotropic,x];Null) /; x.x==0 Normalize[x_Minkowski] := x / Sqrt[Abs[x.x]] Unprotect[Cross] Cross[Minkowski[x_List],Minkowski[y_List]] := Minkowski[{1,1,-1} RotateLeft[RotateLeft[y] x - RotateLeft[x] y]] End[] EndPackage[]