> < ^ Date: Wed, 12 Jun 1996 18:12:00 +0100 (MET)
> < ^ From: Heiko Theissen <heiko.theissen@math.rwth-aachen.de >
^ Subject: BUGFIX #13 (serious problem in 'PreImage')

This mail contains a bugfix for a serious problem in GAP 3.4.3.12.
You should apply this bugfix soon if you are using homomorphisms.
The problem is in 'PreImage' and causes it to fail for non surjective
group homomorphisms.

HOW TO APPLY

The problem is a serious problem, because if may cause a computation to
fail. Thus the bugfix has medium priority, and we recommend that you
apply it soon if you are using homomorphisms.

Before applying this bugfix you *must* already have applied bugfix12.

Go to the GAP directory (the directory with the 'lib/' subdirectory),
name this mail 'bugfix13.dif', and issue the command:

patch -p0 < bugfix13.dif

If 'patch' writes "I can't seem to find a patch in there" try 'patch -v'.
If 'patch -v' gives an error message or reports a version older than 2.1,
get 2.1 from 'ftp://FTP.Math.RWTH-Aachen.DE/pub/gap/utils/patch2_1.zoo'.

This bugfix changes only the library.
Thus you need not recompile the GAP kernel.

VERSION

GAP 3.4.3.12

DESCRIPTION

If one creates a non surjective group homomorphisms, then 'PreImage'
may fail and signal

Error, <elm> must lie in the preimage of <hom> in
map.operations.ImagesRepresentative( map, elm ) called from
...

COMMENT

This bugfix actually fixes two problems.

In the case where this problem first occured, the preimage of the map in
question was already known from the beginning. However it was stored in
the homomorphism record as '<hom>.preimage', whereas 'PreImage' looks for
the component '<hom>.preImage'. This bugfix changes all references to
'<hom>.preimage' to references to '<hom>.preImage' (and there are lots).

'PreImage' then calls 'PreImages' to compute the set of preimages of the
range. This fails because 'PreImages' tries to compute a preimage for
the generators of the range that are not in the image. This bugfix fixes
'PreImages' to intersect the images set with 'Image(<hom>)'.

CORRECT BEHAVIOUR

gap> G := Group( (1,2), (3,4) );;
gap> H := Group( (1,2), (5,6) );
gap> h := GroupHomomorphismByImages( G, H, [G.1], [H.1] );;
gap> PreImage( h );
Subgroup( Group( (1,2), (3,4) ), [ (1,2) ] )


PATCH
Prereq: 3.31.1.4
--- lib/aghomomo.g      1995/12/21 15:29:50
+++ lib/aghomomo.g      1996/06/11 16:47:50
@@ -2,13 +2,16 @@
 ##
 #A  aghomomo.g                  GAP library                      Frank Celler
 ##
-#A  @(#)$Id: 1.html,v 1.2 2004/04/21 15:06:55 felsch Exp $
+#A  @(#)$Id: 1.html,v 1.2 2004/04/21 15:06:55 felsch Exp $
 ##
 #Y  Copyright 1990-1992,  Lehrstuhl D fuer Mathematik,  RWTH Aachen,  Germany
 ##
 ##  This file contains functions for homomorphisms of aggroups.
 ##
 #H  $Log: 1.html,v $
 #H  Revision 1.2  2004/04/21 15:06:55  felsch
 #H  Corrected links in the Forum Archive pages.   VF
 #H
 #H  Revision 1.1.1.1  2004/04/20 13:39:39  felsch
 #H  The final GAP-Forum archive until 2003.
 #H
 #H  Revision 1.5  2003/06/12 19:20:33  gap
 #H  Further update. AH
 #H
 #H  Revision 1.4  2003/06/12 17:28:25  gap
 #H  Address updates by JN. AH
 #H
 #H  Revision 1.3  1997/08/15 11:19:33  gap
 #H  New forum setup. AH
 #H
 #H  Revision 1.2  1997/04/24 15:32:47  gap
 #H  These files were replaced by the versions in WWW. The content is basically the
 #H  same but the formatting has been much more friendly towards the HTML-Converter.
 #H  AH
 #H
 #H  Revision 1.1  1996/10/30 13:07:04  gap
 #H  added forum archive and translation files.
 #H
+#H  Revision 3.31.1.5  1996/06/11  14:47:26  mschoene
+#H  fixed '.preimage' to '.preImage'
+#H
 #H  Revision 3.31.1.4  1995/12/05  15:01:25  mschoene
 #H  replaced 'Filtered( <list>, IsBound )' by 'Compacted( <list> )'
 #H
@@ -664,7 +667,7 @@
        prd  := GroupHomomorphismByImages( b.source, a.range, gens, imgs );
        prd.isMapping      := true;
        prd.isHomomorphism := true;
-        prd.preimage       := b.source;
+        prd.preImage       := b.source;
     else
        prd := MappingOps.CompositionMapping( a, b );
     fi;
@@ -828,7 +831,7 @@
              domain           := Mappings,
               generators       := gens,
               genimages        := imgs,
-             preimage         := D,
+             preImage         := D,
              image            := R.operations.Subgroup( Parent(R), imgs ),
               isGeneralMapping := true,
               operations       := AgGroupHomomorphismByImagesOps );
Prereq: 3.0
--- lib/alghomom.g      1995/12/21 15:29:56
+++ lib/alghomom.g      1996/06/11 16:48:26
@@ -2,7 +2,7 @@
 ##
 #A  alghomom.g                  GAP library                   Thomas Breuer ?
 ##
-#A  @(#)$Id: 1.html,v 1.2 2004/04/21 15:06:55 felsch Exp $
+#A  @(#)$Id: 1.html,v 1.2 2004/04/21 15:06:55 felsch Exp $
 ##
 #Y  Copyright 1990-1993,  Lehrstuhl D fuer Mathematik,  RWTH Aachen,  Germany
 ##
@@ -12,6 +12,9 @@
 ##  'grphomom.g'. (Avoid this!)
 ##
 #H  $Log: 1.html,v $
 #H  Revision 1.2  2004/04/21 15:06:55  felsch
 #H  Corrected links in the Forum Archive pages.   VF
 #H
 #H  Revision 1.1.1.1  2004/04/20 13:39:39  felsch
 #H  The final GAP-Forum archive until 2003.
 #H
 #H  Revision 1.5  2003/06/12 19:20:33  gap
 #H  Further update. AH
 #H
 #H  Revision 1.4  2003/06/12 17:28:25  gap
 #H  Address updates by JN. AH
 #H
 #H  Revision 1.3  1997/08/15 11:19:33  gap
 #H  New forum setup. AH
 #H
 #H  Revision 1.2  1997/04/24 15:32:47  gap
 #H  These files were replaced by the versions in WWW. The content is basically the
 #H  same but the formatting has been much more friendly towards the HTML-Converter.
 #H  AH
 #H
 #H  Revision 1.1  1996/10/30 13:07:04  gap
 #H  added forum archive and translation files.
 #H
+#H  Revision 3.0.1.1  1996/06/11  14:48:18  mschoene
+#H  fixed '.preimage' to '.preImage'
+#H
 #H  Revision 3.0  1994/05/19  13:20:43  sam
 #H  Initial Revision under RCS
 #H
@@ -570,9 +573,9 @@

     # enter useful information (precious little)
     if IsEqualSet( gens, G.generators )  then
-        hom.preimage    := G;
+        hom.preImage    := G;
     else
-        hom.preimage    := Parent(G).operations.Subalgebra( Parent(G), gens );
+        hom.preImage    := Parent(G).operations.Subalgebra( Parent(G), gens );
     fi;
     if IsEqualSet( imgs, H.generators )  then
         hom.image       := H;
@@ -658,7 +661,7 @@
     if not IsBound( hom.coKernel )  then
         hom.coKernel := hom.operations.CoKernel( hom );
     fi;
-    return hom.source = hom.preimage
+    return hom.source = hom.preImage
        and IsTrivial( hom.coKernel );
 end;

@@ -694,8 +697,8 @@

 AlgebraHomomorphismByImagesOps.ImagesSet := function( hom, elms )
     if IsAlgebra( elms )  and IsSubset( hom.source, elms )  then
-        if hom.preimage <> hom.source  then
-            elms := Intersection( hom.preimage, elms );
+        if hom.preImage <> hom.source  then
+            elms := Intersection( hom.preImage, elms );
         fi;
         if not IsBound( hom.coKernel )  then
             hom.coKernel := hom.operations.CoKernel( hom );
@@ -778,7 +781,7 @@
             # enter useful information
             prd.isMapping       := true;
             prd.isHomomorphism  := true;
-            prd.preimage        := hom2.source;
+            prd.preImage        := hom2.source;
             prd.elements := ShallowCopy( hom2.elements );
             prd.images := List( [ 1 .. Length( prd.elements ) ],
                                 i -> hom1.images[
Prereq: 3.23.1.10
--- lib/fpgrp.g 1995/12/21 15:30:12
+++ lib/fpgrp.g 1996/06/11 16:48:47
@@ -2,13 +2,16 @@
 ##
 #A  fpgrp.g                     GAP library                  Martin Schoenert
 ##
-#H  @(#)$Id: 1.html,v 1.2 2004/04/21 15:06:55 felsch Exp $
+#H  @(#)$Id: 1.html,v 1.2 2004/04/21 15:06:55 felsch Exp $
 ##
 #Y  Copyright 1990-1992,  Lehrstuhl D fuer Mathematik,  RWTH Aachen,  Germany
 ##
 ##  This file contains the  functions dealing with finitely presented groups.
 ##
 #H  $Log: 1.html,v $
 #H  Revision 1.2  2004/04/21 15:06:55  felsch
 #H  Corrected links in the Forum Archive pages.   VF
 #H
 #H  Revision 1.1.1.1  2004/04/20 13:39:39  felsch
 #H  The final GAP-Forum archive until 2003.
 #H
 #H  Revision 1.5  2003/06/12 19:20:33  gap
 #H  Further update. AH
 #H
 #H  Revision 1.4  2003/06/12 17:28:25  gap
 #H  Address updates by JN. AH
 #H
 #H  Revision 1.3  1997/08/15 11:19:33  gap
 #H  New forum setup. AH
 #H
 #H  Revision 1.2  1997/04/24 15:32:47  gap
 #H  These files were replaced by the versions in WWW. The content is basically the
 #H  same but the formatting has been much more friendly towards the HTML-Converter.
 #H  AH
 #H
 #H  Revision 1.1  1996/10/30 13:07:04  gap
 #H  added forum archive and translation files.
 #H
+#H  Revision 3.23.1.11  1996/06/11  14:48:40  mschoene
+#H  fixed '.preimage' to '.preImage'
+#H
 #H  Revision 3.23.1.10  1995/11/25  22:42:44  mschoene
 #H  allowed list of names as only argument of 'FreeGroup' (3.28 -> 3.29)
 #H
@@ -1852,9 +1855,9 @@

     # enter usefull information (precious little)
     if IsEqualSet( gens, G.generators )  then
-        hom.preimage    := G;
+        hom.preImage    := G;
     else
-        hom.preimage    := Parent(G).operations.Subgroup( Parent(G), gens );
+        hom.preImage    := Parent(G).operations.Subgroup( Parent(G), gens );
     fi;
     if IsSubsetSet( imgs, H.generators )  then
         hom.image       := H;
@@ -1883,7 +1886,7 @@
 end;

 FpGroupHomomorphismByImagesOps.IsMapping := function ( hom )
-    return hom.source = hom.preimage
+    return hom.source = hom.preImage
        and ForAll( hom.source.relators,
                    rel -> MappedWord( rel, hom.generators, hom.genimages )
                           = hom.range.identity );
Prereq: 3.85.1.5
--- lib/group.g 1995/12/21 15:30:14
+++ lib/group.g 1996/06/11 16:51:33
@@ -2,7 +2,7 @@
 ##
 #A  group.g                     GAP library                      Frank Celler
 ##
-#H  @(#)$Id: 1.html,v 1.2 2004/04/21 15:06:55 felsch Exp $
+#H  @(#)$Id: 1.html,v 1.2 2004/04/21 15:06:55 felsch Exp $
 ##
 #Y  Copyright 1990-1992,  Lehrstuhl D fuer Mathematik,  RWTH Aachen,  Germany
 ##
@@ -21,6 +21,9 @@
 ##  'grphomom.g', 'grpprods.g' and 'operatio.g'.
 ##
 #H  $Log: 1.html,v $
 #H  Revision 1.2  2004/04/21 15:06:55  felsch
 #H  Corrected links in the Forum Archive pages.   VF
 #H
 #H  Revision 1.1.1.1  2004/04/20 13:39:39  felsch
 #H  The final GAP-Forum archive until 2003.
 #H
 #H  Revision 1.5  2003/06/12 19:20:33  gap
 #H  Further update. AH
 #H
 #H  Revision 1.4  2003/06/12 17:28:25  gap
 #H  Address updates by JN. AH
 #H
 #H  Revision 1.3  1997/08/15 11:19:33  gap
 #H  New forum setup. AH
 #H
 #H  Revision 1.2  1997/04/24 15:32:47  gap
 #H  These files were replaced by the versions in WWW. The content is basically the
 #H  same but the formatting has been much more friendly towards the HTML-Converter.
 #H  AH
 #H
 #H  Revision 1.1  1996/10/30 13:07:04  gap
 #H  added forum archive and translation files.
 #H
+#H  Revision 3.85.1.6  1996/06/11  14:51:24  mschoene
+#H  fixed '.preimage' to '.preImage'
+#H
 #H  Revision 3.85.1.5  1995/03/02  14:31:48  vfelsch
 #H  bug fixed in 'IsomorphismTypeFiniteSimpleGroup'
 #H
@@ -3911,7 +3914,7 @@
     P.bijection.isEpimorphism   := true;
     P.bijection.isIsomorphism   := true;
     P.bijection.image           := G;
-    P.bijection.preimage        := P;
+    P.bijection.preImage        := P;
     P.bijection.kernel          := TrivialSubgroup( P );

     # return the permutation group
Prereq: 3.33.1.4
--- lib/grphomom.g      1995/12/21 15:30:18
+++ lib/grphomom.g      1996/06/11 16:50:55
@@ -3,13 +3,22 @@
 #A  grphomom.g                  GAP library                      Frank Celler
 #A                                                         & Martin Schoenert
 ##
-#A  @(#)$Id: 1.html,v 1.2 2004/04/21 15:06:55 felsch Exp $
+#A  @(#)$Id: 1.html,v 1.2 2004/04/21 15:06:55 felsch Exp $
 ##
 #Y  Copyright 1990-1992,  Lehrstuhl D fuer Mathematik,  RWTH Aachen,  Germany
 ##
 ##  This file contains dispatcher and default functions for grp homomorphism.
 ##
 #H  $Log: 1.html,v $
 #H  Revision 1.2  2004/04/21 15:06:55  felsch
 #H  Corrected links in the Forum Archive pages.   VF
 #H
 #H  Revision 1.1.1.1  2004/04/20 13:39:39  felsch
 #H  The final GAP-Forum archive until 2003.
 #H
 #H  Revision 1.5  2003/06/12 19:20:33  gap
 #H  Further update. AH
 #H
 #H  Revision 1.4  2003/06/12 17:28:25  gap
 #H  Address updates by JN. AH
 #H
 #H  Revision 1.3  1997/08/15 11:19:33  gap
 #H  New forum setup. AH
 #H
 #H  Revision 1.2  1997/04/24 15:32:47  gap
 #H  These files were replaced by the versions in WWW. The content is basically the
 #H  same but the formatting has been much more friendly towards the HTML-Converter.
 #H  AH
 #H
 #H  Revision 1.1  1996/10/30 13:07:04  gap
 #H  added forum archive and translation files.
 #H
+#H  Revision 3.33.1.7  1996/06/11  14:50:50  mschoene
+#H  fixed '.preimage' to '.preImage'
+#H
+#H  Revision 3.33.1.6  1996/06/11  08:48:43  htheisse
+#H  'GHO.ImagesSet' now looks at 'isMapping' before calling 'CoKernel'
+#H
+#H  Revision 3.33.1.5  1996/06/10  13:33:40  mschoene
+#H  fixed 'GHO.ImagesSet' and 'GHO.PreImagesSet' to intersect
+#H
 #H  Revision 3.33.1.4  1995/12/11  11:03:19  mschoene
 #H  changed 'CompositionGH' and 'IdentityGH' to inherit from 'GHOps'
 #H
@@ -425,8 +434,21 @@
 ##
 GroupHomomorphismOps.ImagesSet := function ( hom, elms )
     if IsGroup( elms )  and IsSubset( hom.source, elms )  then
-        return Parent( hom.range ).operations.Subgroup( Parent( hom.range ),
-                        List( elms.generators, gen -> Image( hom, gen ) ) );
+       if PreImage(hom) <> hom.source  then
+            elms := Intersection( PreImage(hom), elms );
+        fi;
+        if not IsBound( hom.coKernel )  then
+            if IsBound( hom.isMapping ) and hom.isMapping  then
+                hom.coKernel := TrivialSubgroup( hom.range );
+            else
+                hom.coKernel := hom.operations.CoKernel( hom );
+            fi;
+        fi;
+        return Closure( hom.coKernel,
+                    Parent( hom.range ).operations.Subgroup(
+                        Parent( hom.range ),
+                        List( elms.generators,
+                            gen -> ImagesRepresentative( hom, gen ) ) ) );
     else
         return MappingOps.ImagesSet( hom, elms );
     fi;
@@ -449,6 +471,9 @@
 ##
 GroupHomomorphismOps.PreImagesSet := function ( hom, elms )
     if IsGroup( elms )  and IsSubset( hom.range, elms )  then
+        if Image(hom) <> hom.range  then
+            elms := Intersection( Image(hom), elms );
+        fi;
         return Closure( KernelGroupHomomorphism( hom ),
                     Parent( hom.source ).operations.Subgroup(
                         Parent( hom.source ),
@@ -938,9 +963,9 @@

     # enter usefull information (precious little)
     if IsEqualSet( Difference( gens, [ G.identity ] ), G.generators )  then
-        hom.preimage    := G;
+        hom.preImage    := G;
     else
-        hom.preimage    := Parent(G).operations.Subgroup( Parent(G), gens );
+        hom.preImage    := Parent(G).operations.Subgroup( Parent(G), gens );
     fi;
     if IsEqualSet( Difference( imgs, [ H.identity ] ), H.generators )  then
         hom.image       := H;
@@ -1030,7 +1055,7 @@
     if not IsBound( hom.coKernel )  then
         hom.coKernel := hom.operations.CoKernel( hom );
     fi;
-    return hom.source = hom.preimage
+    return hom.source = hom.preImage
        and IsTrivial( hom.coKernel );
 end;

@@ -1080,8 +1105,8 @@

 GroupHomomorphismByImagesOps.ImagesSet := function ( hom, elms )
     if IsGroup( elms )  and IsSubset( hom.source, elms )  then
-        if hom.preimage <> hom.source  then
-            elms := Intersection( hom.preimage, elms );
+        if hom.preImage <> hom.source  then
+            elms := Intersection( hom.preImage, elms );
         fi;
         if not IsBound( hom.coKernel )  then
             hom.coKernel := hom.operations.CoKernel( hom );
@@ -1160,7 +1185,7 @@
             # enter useful information
             prd.isMapping       := true;
             prd.isHomomorphism  := true;
-            prd.preimage        := hom2.source;
+            prd.preImage        := hom2.source;


            # note the images only, if they were already neccessary for hom1
Prereq: 3.16.1.2
--- lib/mapping.g       1995/12/21 15:30:22
+++ lib/mapping.g       1996/06/11 16:50:28
@@ -3,13 +3,16 @@
 #A  mapping.g                   GAP library                  Martin Schoenert
 #A                                                             & Frank Celler
 ##
-#A  @(#)$Id: 1.html,v 1.2 2004/04/21 15:06:55 felsch Exp $
+#A  @(#)$Id: 1.html,v 1.2 2004/04/21 15:06:55 felsch Exp $
 ##
 #Y  Copyright 1990-1992,  Lehrstuhl D fuer Mathematik,  RWTH Aachen,  Germany
 ##
 ##  This  file  contains  the  functions  that  mainly  deal  with  mappings.
 ##
 #H  $Log: 1.html,v $
 #H  Revision 1.2  2004/04/21 15:06:55  felsch
 #H  Corrected links in the Forum Archive pages.   VF
 #H
 #H  Revision 1.1.1.1  2004/04/20 13:39:39  felsch
 #H  The final GAP-Forum archive until 2003.
 #H
 #H  Revision 1.5  2003/06/12 19:20:33  gap
 #H  Further update. AH
 #H
 #H  Revision 1.4  2003/06/12 17:28:25  gap
 #H  Address updates by JN. AH
 #H
 #H  Revision 1.3  1997/08/15 11:19:33  gap
 #H  New forum setup. AH
 #H
 #H  Revision 1.2  1997/04/24 15:32:47  gap
 #H  These files were replaced by the versions in WWW. The content is basically the
 #H  same but the formatting has been much more friendly towards the HTML-Converter.
 #H  AH
 #H
 #H  Revision 1.1  1996/10/30 13:07:04  gap
 #H  added forum archive and translation files.
 #H
+#H  Revision 3.16.1.3  1996/06/11  14:50:23  mschoene
+#H  fixed '.preimage' to '.preImage'
+#H
 #H  Revision 3.16.1.2  1995/12/11  12:03:58  mschoene
 #H  allowed 'MappingByFunction' with inverse function
 #H
@@ -937,10 +940,10 @@
     inv.source          := map.range;
     inv.range           := map.source;
     if IsBound( map.image )  then
-        inv.preimge     := map.image;
+        inv.preImage    := map.image;
     fi;
-    if IsBound( map.preimage )  then
-        inv.image       := map.preimage;
+    if IsBound( map.preImage )  then
+        inv.image       := map.preImage;
     fi;

     # maybe we know that this mapping is single valued
Prereq: 3.22.1.8
--- lib/permhomo.g      1996/06/11 16:23:33
+++ lib/permhomo.g      1996/06/11 16:49:41
@@ -3,13 +3,16 @@
 #A  permhomo.g                  GAP library                  Martin Schoenert
 #A                                                                & Udo Polis
 ##
-#A  @(#)$Id: 1.html,v 1.2 2004/04/21 15:06:55 felsch Exp $
+#A  @(#)$Id: 1.html,v 1.2 2004/04/21 15:06:55 felsch Exp $
 ##
 #Y  Copyright 1990-1992,  Lehrstuhl D fuer Mathematik,  RWTH Aachen,  Germany
 ##
 ##  This file contains functions that implement homomorphisms for permgroups.
 ##
 #H  $Log: 1.html,v $
 #H  Revision 1.2  2004/04/21 15:06:55  felsch
 #H  Corrected links in the Forum Archive pages.   VF
 #H
 #H  Revision 1.1.1.1  2004/04/20 13:39:39  felsch
 #H  The final GAP-Forum archive until 2003.
 #H
 #H  Revision 1.5  2003/06/12 19:20:33  gap
 #H  Further update. AH
 #H
 #H  Revision 1.4  2003/06/12 17:28:25  gap
 #H  Address updates by JN. AH
 #H
 #H  Revision 1.3  1997/08/15 11:19:33  gap
 #H  New forum setup. AH
 #H
 #H  Revision 1.2  1997/04/24 15:32:47  gap
 #H  These files were replaced by the versions in WWW. The content is basically the
 #H  same but the formatting has been much more friendly towards the HTML-Converter.
 #H  AH
 #H
 #H  Revision 1.1  1996/10/30 13:07:04  gap
 #H  added forum archive and translation files.
 #H
+#H  Revision 3.22.1.9  1996/06/11  14:49:34  mschoene
+#H  fixed '.preimage' to '.preImage'
+#H
 #H  Revision 3.22.1.8  1996/06/10  13:06:45  mschoene
 #H  fixed 'PGHBIO.CoKernel', it is a normal subgroup of the image
 #H
@@ -133,9 +136,9 @@

     # enter useful information (precious little)
     if IsEqualSet( Difference(gens,[G.identity]), G.generators )  then
-        hom.preimage    := G;
+        hom.preImage    := G;
     else
-        hom.preimage    := Parent(G).operations.Subgroup( Parent(G), gens );
+        hom.preImage    := Parent(G).operations.Subgroup( Parent(G), gens );
     fi;
     if IsEqualSet( Difference(imgs,[H.identity]), H.generators )  then
         hom.image       := H;
@@ -227,7 +230,7 @@
     size := Length( hom.orbit );

# create new elements until we have reached the size
- while size <> Size( hom.preimage ) do
+ while size <> Size( hom.preImage ) do

         # make a new element from the generators
         elm := rnd[rni];
@@ -512,8 +515,8 @@

 PermGroupHomomorphismByImagesOps.ImagesSet := function ( hom, elms )
     if IsGroup( elms )  and IsSubset( hom.source, elms )  then
-        if hom.preimage <> hom.source  then
-            elms := Intersection( hom.preimage, elms );
+        if hom.preImage <> hom.source  then
+            elms := Intersection( hom.preImage, elms );
         fi;
         if not IsBound( hom.coKernel )  then
             hom.coKernel := hom.operations.CoKernel( hom );
@@ -599,7 +602,7 @@
             # enter useful information
             prd.isMapping       := true;
             prd.isHomomorphism  := true;
-            prd.preimage        := hom2.source;
+            prd.preImage        := hom2.source;

             # copy the stabilizer chain and update the images of the sgs
             gens := [ prd.source.identity ];
@@ -698,10 +701,10 @@
     fi;

# get the degree of the preimage and image
- if hom.preimage.generators = [] then
+ if hom.preImage.generators = [] then
sourcedeg := 0;
else
- sourcedeg := PermGroupOps.LargestMovedPoint( hom.preimage );
+ sourcedeg := PermGroupOps.LargestMovedPoint( hom.preImage );
fi;
if hom.image.generators = [] then
rangedeg := 0;
@@ -734,10 +737,10 @@
and IsBound( hom.source.stabChainOptions.random )
then
options.randomsource := hom.source.stabChainOptions.random;
- elif IsBound( hom.preimage.stabChainOptions )
- and IsBound( hom.preimage.stabChainOptions.random )
+ elif IsBound( hom.preImage.stabChainOptions )
+ and IsBound( hom.preImage.stabChainOptions.random )
then
- options.randomsource := hom.preimage.stabChainOptions.random;
+ options.randomsource := hom.preImage.stabChainOptions.random;
elif IsBound( StabChainOptions.random ) then
options.randomsource := StabChainOptions.random;
else
@@ -779,12 +782,12 @@

         if IsBound( hom.source.size ) then
             options.size := hom.source.size;
-        elif IsBound( hom.preimage.size ) then
-            options.size := hom.preimage.size;
+        elif IsBound( hom.preImage.size ) then
+            options.size := hom.preImage.size;
         elif IsBound( hom.source.stabChain ) then
             options.size := Size( hom.source );
-        elif IsBound( hom.preimage.stabChain ) then
-            options.size := Size( hom.preimage );
+        elif IsBound( hom.preImage.stabChain ) then
+            options.size := Size( hom.preImage );
         fi;
         if not IsBound( options.size ) then
             if IsBound( Parent(hom.source).size ) then
@@ -797,14 +800,14 @@
           and IsBound( hom.source.stabChainOptions.knownBase )
         then
             options.knownBase := hom.source.stabChainOptions.knownBase;
-        elif  IsBound( hom.preimage.stabChainOptions )
-          and IsBound( hom.preimage.stabChainOptions.knownBase )
+        elif  IsBound( hom.preImage.stabChainOptions )
+          and IsBound( hom.preImage.stabChainOptions.knownBase )
         then
-            options.knownBase := hom.preimage.stabChainOptions.knownBase;
+            options.knownBase := hom.preImage.stabChainOptions.knownBase;
         elif IsBound( hom.source.stabChain ) then
             options.knownBase := Base( hom.source );
-        elif IsBound( hom.preimage.stabChain ) then
-            options.knownBase := Base( hom.preimage );
+        elif IsBound( hom.preImage.stabChain ) then
+            options.knownBase := Base( hom.preImage );
         elif IsBound( Parent(hom.source).stabChainOptions )
           and IsBound( Parent(hom.source).stabChainOptions.knownBase )
         then
@@ -818,14 +821,14 @@

         if IsBound( hom.source.size ) then
             options.limitsource := hom.source.size;
-        elif IsBound( hom.preimage.size ) then
-            options.limitsource := hom.preimage.size;
+        elif IsBound( hom.preImage.size ) then
+            options.limitsource := hom.preImage.size;
         elif IsBound( Parent(hom.source).size ) then
             options.limitsource := Parent(hom.source).size;
         elif IsBound( hom.source.stabChain ) then
             options.limitsource := Size( hom.source );
-        elif IsBound( hom.preimage.stabChain ) then
-            options.limitsource := Size( hom.preimage );
+        elif IsBound( hom.preImage.stabChain ) then
+            options.limitsource := Size( hom.preImage );
         elif IsBound( Parent(hom.source).stabChain ) then
             options.limitsource := Size( Parent(hom.source) );
         fi;
@@ -834,10 +837,10 @@
           and IsBound( hom.source.stabChainOptions.knownBase )
         then
             options.knownBasesource := hom.source.stabChainOptions.knownBase;
-        elif  IsBound( hom.preimage.stabChainOptions )
-          and IsBound( hom.preimage.stabChainOptions.knownBase )
+        elif  IsBound( hom.preImage.stabChainOptions )
+          and IsBound( hom.preImage.stabChainOptions.knownBase )
         then
-            options.knownBasesource := hom.preimage.stabChainOptions.knownBase;
+            options.knownBasesource := hom.preImage.stabChainOptions.knownBase;
         elif IsBound( Parent(hom.source).stabChainOptions )
           and IsBound( Parent(hom.source).stabChainOptions.knownBase )
         then
@@ -845,8 +848,8 @@
                 := Parent(hom.source).stabChainOptions.knownBase;
         elif IsBound( hom.source.stabChain ) then
             options.knownBasesource := Base( hom.source );
-        elif IsBound( hom.preimage.stabChain ) then
-            options.knownBasesource := Base( hom.preimage );
+        elif IsBound( hom.preImage.stabChain ) then
+            options.knownBasesource := Base( hom.preImage );
         elif IsBound( Parent(hom.source).stabChain ) then
             options.knownBasesource := Base( Parent(hom.source) );
         fi;
Prereq: 3.1.1.2
--- lib/sq.g    1995/12/21 15:30:42
+++ lib/sq.g    1996/06/11 16:50:12
@@ -3,7 +3,7 @@
 #A  sq.g                        GAP library                      Frank Celler
 #A                                                           Alexander Wegner
 ##
-#A  @(#)$Id: 1.html,v 1.2 2004/04/21 15:06:55 felsch Exp $
+#A  @(#)$Id: 1.html,v 1.2 2004/04/21 15:06:55 felsch Exp $
 ##
 #Y  Copyright 1990-1992,  Lehrstuhl D fuer Mathematik,  RWTH Aachen,  Germany
 ##
@@ -11,6 +11,9 @@
 ##  groups.
 ##
 #H  $Log: 1.html,v $
 #H  Revision 1.2  2004/04/21 15:06:55  felsch
 #H  Corrected links in the Forum Archive pages.   VF
 #H
 #H  Revision 1.1.1.1  2004/04/20 13:39:39  felsch
 #H  The final GAP-Forum archive until 2003.
 #H
 #H  Revision 1.5  2003/06/12 19:20:33  gap
 #H  Further update. AH
 #H
 #H  Revision 1.4  2003/06/12 17:28:25  gap
 #H  Address updates by JN. AH
 #H
 #H  Revision 1.3  1997/08/15 11:19:33  gap
 #H  New forum setup. AH
 #H
 #H  Revision 1.2  1997/04/24 15:32:47  gap
 #H  These files were replaced by the versions in WWW. The content is basically the
 #H  same but the formatting has been much more friendly towards the HTML-Converter.
 #H  AH
 #H
 #H  Revision 1.1  1996/10/30 13:07:04  gap
 #H  added forum archive and translation files.
 #H
+#H  Revision 3.1.1.3  1996/06/11  14:50:08  mschoene
+#H  fixed '.preimage' to '.preImage'
+#H
 #H  Revision 3.1.1.2  1994/10/07  13:10:39  fceller
 #H  added 'SQOps.AgGroup'
 #H
@@ -126,7 +129,7 @@
         a.naturalHomomorphism.isMapping := true;
         a.naturalHomomorphism.isSurjective := true;
         a.naturalHomomorphism.image := a;
-        a.naturalHomomorphism.preimage := Q.source;
+        a.naturalHomomorphism.preImage := Q.source;
     fi;
     a.sqSource := Q.source;
     return a;
END OF  bugfix13.dif ________________________________________________________

> < [top]