  
  [1X8 Derivations[0X
  
  A derivation d of a ring R is a map R -> R that obeys the product rule
  
  
       d(rs) = d(r)s + rd(s)
  
  
  for elements r, s in the field, and which is also distributive over addition
  in the ring
  
  
       d(r+s) = d(r) + d(s)
  
  
  
  [1X8.1 The [9XHAPDerivation[1X datatype[0X
  
  The  [9XHAPDerivation[0m  datatype represents a derivation of a polynomial ring R.
  Given  the  product and addition rules above, a derivation can be completely
  specified in terms of the images of the ring indeterminates. Consequently, a
  [9XHAPDerivation[0m is specified by providing:
  
  --    a polynomial ring R
  
  --    a  list  of  images,  under  the  derivation,  of  each  of the ring's
        indeterminates.
  
  Optionally, you can also provide
  
  --    a  set  of  relations  I  (which  is  assumed  to  be empty if none is
        provided).
  
  The  support  for  derivations  over  quotient  rings using [9XHAPDerivation[0m is
  limited.  The ring is always assumed to simply be the polynomial ring R, but
  when calculating the kernel and homology (see [2XKernelOfDerivation[0m ([14X8.5-2[0m) and
  [2XHomologyOfDerivation[0m  ([14X8.5-3[0m)),  any relations in I are also included in the
  result's  relations,  which  is  the equivalent of calculating the kernel of
  homology of the derivation R/I -> R/I.
  
  
  [1X8.2 Computing the kernel and homology of a derivation[0X
  
  Computing  the  kernel of a derivation is difficult in the general case, but
  for  polynomial  rings  over  F_p  we  have  a  novel  solution which allows
  derivations to be considered as module homomorphisms.
  
  Consider a ring R over GF(2). For any r in R,
  
  
       d(r^2) = d(rr) = d(r)r + rd(r) = 2d(r) = 0
  
  
  In  general,  for  a ring R = F_p[x_1, ..., x_n], the subring S = F_p[x_1^p,
  ...,  x_n^p]  is  in  the kernel of d. For this choice of S, R can always be
  written as a free S-module with 2^n generators.
  
  Consider now taking the derivation of sr where s in S and r in R,
  
  
       d(sr) = sd(r) + d(s)r = sd(r)
  
  
  since  s  is  in  the  kernel  of d. In other words, when R is written as an
  S-module, the derivation d behaves exactly as as an S-module homomorphism.
  
  The  [5XSingular[0m  computer  algebra  system  can  compute the kernels of module
  homomorphisms  over  polynomial  rings, and the [5Xsingular[0m package provides an
  interface  between [5XSingular[0m and [5XGAP[0m. The function [2XKernelOfDerivation[0m ([14X8.5-2[0m)
  constructs S, expresses d as an S-module homomorphism (as well as converting
  any ideal), and asks [5XSingular[0m for the kernel. [5XSingular[0m returns the result as
  a  set  of  module  generators,  which  are  then  reduced  to a set of ring
  generators and a presentation found. This makes further use of [5XSingular[0m, and
  the [10XHAPRingHomomorphism[0m datatype (see Chapter [14X7[0m).
  
  The homology of a derivation is defined to be
  
  
       Hom(d) = \ker (d) / im (d)
  
  
  Given  the  kernel of a derivation and the image (expressed as the images of
  the  module generators), the homology can be readily computed, as is done by
  [2XHomologyOfDerivation[0m   ([14X8.5-3[0m).   The   natural   presentation  obtained  by
  concatenating   the  kernel  relations  and  the  image  typically  contains
  redundancies   and  the  [2XHAPRingReductionHomomorphism[0m  ([14X7.2-4[0m)  is  used  to
  generate a nicer presentation involving fewer indeterminates and relations.
  
  
  [1X8.3 Construction function[0X
  
  
  [1X8.3-1 HAPDerivation construction functions[0X
  
  [2X> HAPDerivation( [0X[3XR[, I], images[0X[2X ) _________________________________[0Xoperation
  [2X> HAPDerivationNC( [0X[3XR, I, images[0X[2X ) _________________________________[0Xoperation
  [6XReturns:[0X  [9XHAPDerivation[0m
  
  Construct  a [9XHAPDerivation[0m object representing the derivation d where [3XR[0m is a
  polynomial  ring  and  [3Ximages[0m  is  the  list  of  the  images  of  the  ring
  indeterminates  under  the  derivation,  {d(x_1),  d(x_2),  ..., d(x_n)}. An
  optional  set  of  relations  [3XI[0m  can  also  be provided, which are passed to
  [2XKernelOfDerivation[0m  ([14X8.5-2[0m)  when calculating the kernel or homology of this
  derivation.  The  function  [9XHAPDerivation[0m  checks  that  the  arguments  are
  compatible, while the [10XNC[0m method performs no checks.
  
  
  [1X8.4 Data access function[0X
  
  [1X8.4-1 DerivationRing[0m
  
  [2X> DerivationRing( [0X[3Xd[0X[2X ) _____________________________________________[0Xattribute
  [6XReturns:[0X  Polynomial ring
  
  Returns the ring over which the derivation [3Xd[0m is defined.
  
  [1X8.4-2 DerivationImages[0m
  
  [2X> DerivationImages( [0X[3Xd[0X[2X ) ___________________________________________[0Xattribute
  [6XReturns:[0X  List of polynomials
  
  A  derivation  [3Xd[0m  over  a  (quotient) polynomial ring is defined by a set of
  images.  This  function  returns this list of images. The ith element of the
  list  is the image of indeterminate number i in that ring family. (Note that
  indeterminate  number  i  is  not  necessarily the ith indeterminate in that
  particular ring. See [14X'Reference: Indeterminates'[0m for more details.)
  
  [1X8.4-3 DerivationRelations[0m
  
  [2X> DerivationRelations( [0X[3Xd[0X[2X ) ________________________________________[0Xattribute
  [6XReturns:[0X  List of polynomials
  
  Returns  the  relations  of the quotient ring over which the derivation [3Xd[0m is
  defined.
  
  
  [1X8.4-4 Example: Constructing and accessing data of a [9XHAPDerivation[1X[0X
  
  We  demonstrate creating a [9XHAPDerivation[0m object and reading back its data by
  creating  a  derivation  d of the polynomial ring over the integers with two
  indeterminates, Z[x_1, x_2, x_3], which has the mapping d(x_1) = d(x_2) = 1,
  d(x_3) = 0.
  
  [4X---------------------------  Example  ----------------------------[0X
    [4Xgap> ring := PolynomialRing(Integers, 3);;[0X
    [4Xgap> d := HAPDerivation(ring, [One(ring), One(ring), Zero(ring)]);[0X
    [4X<Derivation>[0X
    [4Xgap> [0X
    [4Xgap> DerivationRing(d);[0X
    [4XIntegers[x_1,x_2,x_3][0X
    [4Xgap> DerivationImages(d);[0X
    [4X[ 1, 1, 0 ][0X
    [4Xgap> DerivationRelations(d);[0X
    [4X[  ][0X
  [4X------------------------------------------------------------------[0X
  
  
  [1X8.5 Image, kernel and homology functions[0X
  
  [1X8.5-1 ImageOfDerivation[0m
  
  [2X> ImageOfDerivation( [0X[3Xd, poly[0X[2X ) ____________________________________[0Xoperation
  [6XReturns:[0X  Polynomial
  
  Returns  the image of the polynomial [3Xpoly[0m under the derivation [3Xd[0m. ([3Xpoly[0m must
  be a polynomial in the derivation's ring.)
  
  [1X8.5-2 KernelOfDerivation[0m
  
  [2X> KernelOfDerivation( [0X[3Xd[, avoid][0X[2X ) ________________________________[0Xoperation
  [6XReturns:[0X  List
  
  Returns  a ring presentation S/J for the kernel of the derivation [3Xd[0m, where S
  is  a polynomial ring and J are a set of relations. This operation returns a
  list with the following elements:
  
  (1)   the new polynomial ring S
  
  (2)   a basis for the ideal, as a set of relations J
  
  (3)   the  ring  isomorphism  between  the  kernel  (i.e.  a  subring of the
        derivation's  ring)  and  the  new  ring.  This  is  given  using  the
        [9XHAPRingHomomorphism[0m type, for details of which see [14X7[0m
  
  An  optional parameter, [3Xavoid[0m, can be provided which lists indeterminates to
  avoid when creating the the new polynomial ring.
  
  [13XThis function is only available if the package [5Xsingular[0m[13X is available[0m.
  
  [1X8.5-3 HomologyOfDerivation[0m
  
  [2X> HomologyOfDerivation( [0X[3Xd[, avoid][0X[2X ) ______________________________[0Xoperation
  [6XReturns:[0X  List
  
  Returns  a ring presentation S/J for the homology of the derivation [3Xd[0m, where
  S  is  a  polynomial ring and J are a set of relations. Returns a polynomial
  ring  presentation  for  the homology ker(d)/im(d) of the derivation [3Xd[0m. This
  operation returns a list with the following elements:
  
  (1)   the new polynomial ring S
  
  (2)   a basis for the ideal, as a set of relations J
  
  (3)   the  ring  isomorphism  between  the  kernel  (i.e.  a  subring of the
        derivation's  ring)  and  the  new  ring.  This  is  given  using  the
        [9XHAPRingHomomorphism[0m type, for details of which see [14X7[0m
  
  An  optional parameter, [3Xavoid[0m, can be provided which lists indeterminates to
  avoid when creating the the new polynomial ring.
  
  
  [1X8.5-4 Example: Homology of a [9XHAPDerivation[1X[0X
  
  In  this example, we wish to calculate the homology of a derivation d on the
  ring  F_2[x,y,z]/(yx^2 + xy^2) where d(x) = d(y) = 0 and d(z) = yx^2 + xy^2.
  To  demonstrate some of the other functions, we also calculate the kernel of
  this derivation and the image of the element xz.
  
  [4X---------------------------  Example  ----------------------------[0X
    [4Xgap> ring := PolynomialRing(GF(2), 3);;[0X
    [4Xgap> x := ring.1;; y := ring.2;; z := ring.3;;[0X
    [4Xgap> d := HAPDerivation(ring, [x^2 + x*y + y^2],[0X
    [4X>                [Zero(ring), Zero(ring), x^2*y + x*y^2]);[0X
    [4X<Derivation>[0X
    [4Xgap> #[0X
    [4Xgap> ImageOfDerivation(d, x*z);[0X
    [4Xx_1^3*x_2+x_1^2*x_2^2[0X
    [4Xgap> KernelOfDerivation(d);[0X
    [4X[ GF(2)[x_7,x_8,x_9], [ x_7^2+x_7*x_8+x_8^2 ], <Ring homomorphism> ][0X
    [4Xgap> HomologyOfDerivation(d);[0X
    [4X[ GF(2)[x_4,x_5,x_6], [ x_4^2+x_4*x_5+x_5^2, x_5^3 ], <Ring homomorphism> ][0X
  [4X------------------------------------------------------------------[0X
  
  The  result  we  were  after,  the homology of d, can be read from the final
  result as follows. The first two entries in the list give the homology group
  as  a  quotient  ring:  the quotient of the polynomial ring F_2[x_6,x_7,x_8]
  with  the  two  relations (x_7^2+x_7x_8+x_8^2, x_8^3). The last entry in the
  list  gives  the new indeterminates in terms of the original indeterminates,
  and from this we know that it would be friendlier to write the result as
  
  
       F_2[x,y,e^2] / (x^2+xy+y^2, y^3)
  
  
  The kernel of the derivation can read from the result in a similar manner.
  
