
D.4.2.6 is_injective
Procedure from library algebra.lib (see algebra_lib).
 Usage:
 is_injective(phi,pr[,c,s]); phi map, pr preimage ring, c int, s string
 Return:
  1 (type int) if phi is injective, 0 if not (if s is not given).
 If s is given, return a list l of size 2, l[1] int, l[2] ring:
l[1] is 1 if phi is injective, 0 if not
l[2] is a ring with variables x(1),...,x(n),y(1),...,y(m) if the
basering has n variables and the map m components, it contains the
ideal 'ker', depending only on the y(i), the kernel of the given map

 Note:
 Three differnt algorithms are used depending on c = 1,2,3.
If c is not given or c=0, a heuristically best method is chosen.
The basering may be a quotient ring. However, if the preimage ring is
a quotient ring, say pr = P/I, consider phi as a map from P and then
the algorithm returns 1 if the kernel of phi is 0 mod I.
To access to the ring l[2] and see ker you must give the ring a name,
e.g. def S=l[2]; setring S; ker;
 Display:
 The above comment is displayed if printlevel >= 0 (default).
Example:
 LIB "algebra.lib";
int p = printlevel;
ring r = 0,(a,b,c),ds;
ring s = 0,(x,y,z,u,v,w),dp;
ideal I = xw,u2w+1,yzv;
map phi = r,I; // a map from r to s:
is_injective(phi,r); // a,b,c > xw,u2w+1,yzv
==> 1
ring R = 0,(x,y,z),dp;
ideal i = x, y, x2y3;
map phi = R,i; // a map from R to itself, z > x2y3
list l = is_injective(phi,R,"");
==>
==> // The 2nd element of the list is a ring with variables x(1),...,x(n),
==> // y(1),...,y(m) if the basering has n variables and the map is
==> // F[1],...,F[m].
==> // It contains the ideal ker, the kernel of the given map y(i) > F[i].
==> // To access to the ring and see ker you must give the ring a name,
==> // e.g.:
==> def S = l[2]; setring S; ker;
==>
l[1];
==> 0
def S = l[2]; setring S;
ker;
==> ker[1]=y(2)^3y(1)^2+y(3)

