Usage:
<double_dual1 M A N f
N is set equal to the double dual into A,
Hom(M,Hom (M, A)) of M over whatever ring
M is defined. f is set to the natural map from
M to N (that is, from the free module giving
the generators of M to the one giving the generators
of N.
Parameters:
M,A modules
Output values:
N = Hom(M,Hom (M, A))
f : M --> N the natural map
The A-torsion submodule of M (=the intersection
of the kernels of all maps from M to A)
is the kernel of the map f;
it can be computed by a call of the form
<kernel f M N Atorsion
type Atorsion
In case A is the ring over which M is defined, use
<double_dual instead (note that A does not appear in the
argument list of <double_dual)
Explanation:
(Notation: Let
m: GM /to FM be a presentation of M.
a: GA /to FA be a presentation of A.
ma: ** \to FMA be a presentation of (M,A) -- that is, Hom(M,A)
N = maa: ** \to FMAA be a presentation of ((M,A),A).
f_ma: FMA \to (FM,FA) be the map inducing the natural (M,A) \to (FM,A)
f_maa: FMAA \to (FMA,FA) be the map inducing the natural map
((M,A),A) to (FMA,A)
taut: FM \to ((FM,FA),FA) be the tautological map.)
T the map (f_ma^* \tensor FA)
The desired map f is then the map FM \to FMAA obtained by lifting the
composite s = (T)(taut) along f_maa.