This file is indexed.

/usr/share/axiom-20170501/src/algebra/AUTOMOR.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 AUTOMOR Automorphism
++ Author: Manuel Bronstein
++ Date Created: 31 January 1994
++ Date Last Updated: 31 January 1994
++ References:
++ Bron95 On radical solutions of linear ordinary differential equations
++ Abra01 On Solutions of Linear Functional Systems
++ Muld95 Primitives: Orepoly and Lodo
++ Description:
++ Automorphism R is the multiplicative group of automorphisms of R.
-- In fact, non-invertible endomorphism are allowed as partial functions.
-- This domain is noncanonical in that f*f^{-1} will be the identity
-- function but won't be equal to 1.

Automorphism(R) : SIG == CODE where
  R : Ring

  SIG ==> Join(Group, Eltable(R, R)) with

      morphism : (R -> R) -> %
        ++ morphism(f) returns the non-invertible morphism given by f.

      morphism : (R -> R, R -> R) -> %
        ++ morphism(f, g) returns the invertible morphism given by f, where
        ++ g is the inverse of f..

      morphism : ((R, Integer) -> R) -> %
        ++ morphism(f) returns the morphism given by \spad{f^n(x) = f(x,n)}.

  CODE ==> add

      err:   R -> R
      ident: (R, Integer) -> R
      iter:  (R -> R, NonNegativeInteger, R) -> R
      iterat: (R -> R, R -> R, Integer, R) -> R
      apply: (%, R, Integer) -> R
 
      Rep := ((R, Integer) -> R)
 
      1 == ident

      err r == error "Morphism is not invertible"

      ident(r, n) == r

      f = g == EQ(f, g)$Lisp

      elt(f, r) == apply(f, r, 1)

      inv f  == (r1:R, i2:Integer):R +-> apply(f, r1, - i2)

      f ** n == (r1:R, i2:Integer):R +-> apply(f, r1, n * i2)

      coerce(f:%):OutputForm == message("R -> R")

      morphism(f:(R, Integer) -> R):% == f

      morphism(f:R -> R):% == morphism(f, err)

      morphism(f, g) == (r1:R, i2:Integer):R +-> iterat(f, g, i2, r1)

      apply(f, r, n) == (g := f pretend ((R, Integer) -> R); g(r, n))
 
      iterat(f, g, n, r) ==
          n < 0 => iter(g, (-n)::NonNegativeInteger, r)
          iter(f, n::NonNegativeInteger, r)
 
      iter(f, n, r) ==
          for i in 1..n repeat r := f r
          r
 
      f * g ==
        f = g => f**2
        (r1:R, i2:Integer):R +-> 
          iterat((u1:R):R +-> f g u1, 
                 (v1:R):R +-> (inv g)(inv f) v1, 
                 i2, r1)