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