This file is indexed.

/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)]