/usr/share/axiom-20170501/src/algebra/OCT.spad is in axiom-source 20170501-3.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 | )abbrev domain OCT Octonion
++ Author: R. Wisbauer, J. Grabmeier
++ Date Created: 05 September 1990
++ Date Last Updated: 20 September 1990
++ References: I.L Kantor, A.S. Solodovnikov:
++ Hypercomplex Numbers, Springer Verlag Heidelberg, 1989,
++ ISBN 0-387-96980-2
++ Description:
++ Octonion implements octonions (Cayley-Dixon algebra) over a
++ commutative ring, an eight-dimensional non-associative
++ algebra, doubling the quaternions in the same way as doubling
++ the complex numbers to get the quaternions
++ the main constructor function is octon which takes 8
++ arguments: the real part, the i imaginary part, the j
++ imaginary part, the k imaginary part, (as with quaternions)
++ and in addition the imaginary parts E, I, J, K.
--)boot $noSubsumption := true
Octonion(R) : SIG == CODE where
R : CommutativeRing
QR ==> Quaternion R
SIG ==> Join(OctonionCategory R, FullyRetractableTo QR) with
octon : (QR,QR) -> %
++ octon(qe,qE) constructs an octonion from two quaternions
++ using the relation O = Q + QE.
CODE ==> add
Rep := Record(e: QR,E: QR)
0 == [0,0]
1 == [1,0]
a,b,c,d,f,g,h,i : R
p,q : QR
x,y : %
real x == real (x.e)
imagi x == imagI (x.e)
imagj x == imagJ (x.e)
imagk x == imagK (x.e)
imagE x == real (x.E)
imagI x == imagI (x.E)
imagJ x == imagJ (x.E)
imagK x == imagK (x.E)
octon(a,b,c,d,f,g,h,i) == [quatern(a,b,c,d)$QR,quatern(f,g,h,i)$QR]
octon(p,q) == [p,q]
coerce(q) == [q,0$QR]
retract(x):QR ==
not(zero? imagE x and zero? imagI x and zero? imagJ x and zero? imagK x)=>
error "Cannot retract octonion to quaternion."
quatern(real x, imagi x,imagj x, imagk x)$QR
retractIfCan(x):Union(QR,"failed") ==
not(zero? imagE x and zero? imagI x and zero? imagJ x and zero? imagK x)=>
"failed"
quatern(real x, imagi x,imagj x, imagk x)$QR
x * y == [x.e*y.e-(conjugate y.E)*x.E, y.E*x.e + x.E*(conjugate y.e)]
|