MODULE I4Extras; (* Vector operations specific to 4-dimensional vector spaces. Created in Feb. 19, 1997 by Marcus Vinicius A. Andrade. Based in R4Extras.m3 by J. Stolfi. *) IMPORT MPInt, I4; PROCEDURE Det(READONLY a, b, c, d: I4.T): MPInt.T = BEGIN WITH ab_01 = MPInt.Sub(MPInt.Mult(a[0],b[1]),MPInt.Mult(b[0],a[1])), ab_02 = MPInt.Sub(MPInt.Mult(a[0],b[2]),MPInt.Mult(b[0],a[2])), ab_12 = MPInt.Sub(MPInt.Mult(a[1],b[2]),MPInt.Mult(b[1],a[2])), ab_03 = MPInt.Sub(MPInt.Mult(a[0],b[3]),MPInt.Mult(b[0],a[3])), ab_13 = MPInt.Sub(MPInt.Mult(a[1],b[3]),MPInt.Mult(b[1],a[3])), ab_23 = MPInt.Sub(MPInt.Mult(a[2],b[3]),MPInt.Mult(b[2],a[3])), cd_01 = MPInt.Sub(MPInt.Mult(c[0],d[1]),MPInt.Mult(c[1],d[0])), cd_02 = MPInt.Sub(MPInt.Mult(c[0],d[2]),MPInt.Mult(c[2],d[0])), cd_12 = MPInt.Sub(MPInt.Mult(c[1],d[2]),MPInt.Mult(c[2],d[1])), cd_03 = MPInt.Sub(MPInt.Mult(c[0],d[3]),MPInt.Mult(c[3],d[0])), cd_13 = MPInt.Sub(MPInt.Mult(c[1],d[3]),MPInt.Mult(c[3],d[1])), cd_23 = MPInt.Sub(MPInt.Mult(c[2],d[3]),MPInt.Mult(c[3],d[2])), d = MPInt.Add(MPInt.Sub(MPInt.Mult(ab_01,cd_23),MPInt.Mult(ab_02,cd_13)), MPInt.Sub(MPInt.Sub(MPInt.Mult(ab_12,cd_03),MPInt.Mult(ab_03,cd_12)), MPInt.Add(MPInt.Mult(ab_13,cd_02),MPInt.Mult(ab_23,cd_01)))) DO RETURN d END END Det; PROCEDURE Cross(READONLY a, b, c: I4.T): I4.T = BEGIN WITH ab_01 = MPInt.Sub(MPInt.Mult(a[0],b[1]),MPInt.Mult(a[1],b[0])), ab_02 = MPInt.Sub(MPInt.Mult(a[0],b[2]),MPInt.Mult(a[2],b[0])), ab_12 = MPInt.Sub(MPInt.Mult(a[1],b[2]),MPInt.Mult(a[2],b[1])), ab_03 = MPInt.Sub(MPInt.Mult(a[0],b[3]),MPInt.Mult(a[3],b[0])), ab_13 = MPInt.Sub(MPInt.Mult(a[1],b[3]),MPInt.Mult(a[3],b[1])), ab_23 = MPInt.Sub(MPInt.Mult(a[2],b[3]),MPInt.Mult(a[3],b[2])), abc_012 = MPInt.Add(MPInt.Sub(MPInt.Mult(ab_01,c[2]),MPInt.Mult(ab_02,c[1])), MPInt.Mult(ab_12,c[0])), abc_013 = MPInt.Add(MPInt.Sub(MPInt.Mult(ab_01,c[3]),MPInt.Mult(ab_03,c[1])), MPInt.Mult(ab_13,c[0])), abc_023 = MPInt.Add(MPInt.Sub(MPInt.Mult(ab_02,c[3]),MPInt.Mult(ab_03,c[2])), MPInt.Mult(ab_23,c[0])), abc_123 = MPInt.Add(MPInt.Sub(MPInt.Mult(ab_12,c[3]),MPInt.Mult(ab_13,c[2])), MPInt.Mult(ab_23,c[1])) DO RETURN I4.T{MPInt.Neg(abc_123),abc_023,MPInt.Neg(abc_013),abc_012} END; END Cross; PROCEDURE GenerateOrtho(READONLY a: I4.T) : I4.T = VAR i : [0..4]; b : I4.T; BEGIN IF I4.IsAllZero(a) THEN RETURN a ELSE (* --- to avoid the generation of the DCenter --- *) i:=1; WHILE i<4 AND NOT MPInt.IsZero(a[i]) DO INC(i) END; IF i<4 THEN (* --- "a[i]" is zero --- *) b:=I4.Axis(i) ELSE (* ---- "a1,a2,a3" are all non zero --- *) b[0]:=MPInt.Mult(a[1],MPInt.Neg(a[0])); b[1]:=MPInt.Add(MPInt.Add(MPInt.Mult(a[0],a[0]),MPInt.Mult(a[2],a[2])), MPInt.Mult(a[3],a[3])); b[2]:=MPInt.Mult(a[1],MPInt.Neg(a[2])); b[3]:=MPInt.Mult(a[1],MPInt.Neg(a[3])); END; RETURN b END END GenerateOrtho; BEGIN END I4Extras.