Anforderungen  |   Konzepte  |   Entwurf  |   Entwicklung  |   Qualitätssicherung  |   Lebenszyklus  |   Steuerung
 
 
 
 


Quelle  pcgs.gd   Sprache: unbekannt

 
#############################################################################
##
##  This file is part of GAP, a system for computational discrete algebra.
##  This file's authors include Frank Celler.
##
##  Copyright of GAP belongs to its developers, whose names are too numerous
##  to list here. Please refer to the COPYRIGHT file for details.
##
##  SPDX-License-Identifier: GPL-2.0-or-later
##
##  This file contains the operations for polycyclic generating systems.
##

#############################################################################
##
#C  IsGeneralPcgs(<obj>)
##
##  <ManSection>
##  <Filt Name="IsGeneralPcgs" Arg='obj' Type='Category'/>
##
##  <Description>
##  The category of general pcgs. Each modulo pcgs is a general pcgs.
##  Relative orders are known for general pcgs, but it might not be possible
##  to compute exponent vectors or other elementary operations with respect
##  to a general pcgs. (For performance reasons immediate methods are always
##  ignored for Pcgs.)
##  </Description>
##  </ManSection>
##
DeclareCategory( "IsGeneralPcgs",
    IsHomogeneousList and IsDuplicateFreeList and IsConstantTimeAccessList
    and IsFinite and IsMultiplicativeElementWithInverseCollection
    and IsNoImmediateMethodsObject);

#############################################################################
##
#C  IsModuloPcgs(<obj>)
##
##  <#GAPDoc Label="IsModuloPcgs">
##  <ManSection>
##  <Filt Name="IsModuloPcgs" Arg='obj' Type='Category'/>
##
##  <Description>
##  The category of modulo pcgs. Note that each pcgs is a modulo pcgs for
##  the trivial subgroup.
##  </Description>
##  </ManSection>
##  <#/GAPDoc>
##
DeclareCategory("IsModuloPcgs",IsGeneralPcgs);

#############################################################################
##
#C  IsPcgs(<obj>)
##
##  <#GAPDoc Label="IsPcgs">
##  <ManSection>
##  <Filt Name="IsPcgs" Arg='obj' Type='Category'/>
##
##  <Description>
##  The category of pcgs.
##  <Example><![CDATA[
##  gap> G := Group((1,2,3,4),(1,2));;
##  gap> p := Pcgs(G);
##  Pcgs([ (3,4), (2,4,3), (1,4)(2,3), (1,3)(2,4) ])
##  gap> IsPcgs( p );
##  true
##  gap> p[1];
##  (3,4)
##  gap> G := Group((1,2,3,4,5),(1,2));;
##  gap> Pcgs(G);
##  fail
##  ]]></Example>
##  </Description>
##  </ManSection>
##  <#/GAPDoc>
##
DeclareCategory( "IsPcgs", IsModuloPcgs);


#############################################################################
##
#C  IsPcgsFamily
##
##  <ManSection>
##  <Filt Name="IsPcgsFamily" Arg='obj' Type='Category'/>
##
##  <Description>
##  </Description>
##  </ManSection>
##
DeclareCategory(
    "IsPcgsFamily",
    IsFamily );


#############################################################################
##
#R  IsPcgsDefaultRep
##
##  <ManSection>
##  <Filt Name="IsPcgsDefaultRep" Arg='obj' Type='Representation'/>
##
##  <Description>
##  </Description>
##  </ManSection>
##
DeclareRepresentation(
    "IsPcgsDefaultRep",
    IsComponentObjectRep and IsAttributeStoringRep, [] );


#############################################################################
##
#O  PcgsByPcSequence( <fam>, <pcs> )
#O  PcgsByPcSequenceNC( <fam>, <pcs> )
##
##  <#GAPDoc Label="PcgsByPcSequence">
##  <ManSection>
##  <Oper Name="PcgsByPcSequence" Arg='fam, pcs'/>
##  <Oper Name="PcgsByPcSequenceNC" Arg='fam, pcs'/>
##
##  <Description>
##  constructs a pcgs for the elements family <A>fam</A> from the elements in
##  the list <A>pcs</A>. The elements must lie in the family <A>fam</A>.
##  <Ref Oper="PcgsByPcSequence"/> and its <C>NC</C> variant will always
##  create a new pcgs which is not induced by any other pcgs
##  (cf. <Ref Oper="InducedPcgsByPcSequence"/>).
##  <Example><![CDATA[
##  gap> fam := FamilyObj( (1,2) );; # the family of permutations
##  gap> p := PcgsByPcSequence( fam, [(1,2),(1,2,3)] );
##  Pcgs([ (1,2), (1,2,3) ])
##  gap> RelativeOrders(p);
##  [ 2, 3 ]
##  gap> ExponentsOfPcElement( p, (1,3,2) );
##  [ 0, 2 ]
##  ]]></Example>
##  </Description>
##  </ManSection>
##  <#/GAPDoc>
##
DeclareOperation( "PcgsByPcSequence", [ IsFamily, IsList ] );
DeclareOperation( "PcgsByPcSequenceNC", [ IsFamily, IsList ] );


#############################################################################
##
#O  PcgsByPcSequenceCons( <req-filters>, <imp-filters>, <fam>, <pcs>,<attr> )
##
##  <ManSection>
##  <Oper Name="PcgsByPcSequenceCons"
##   Arg='req-filters, imp-filters, fam, pcs,attr'/>
##
##  <Description>
##  </Description>
##  </ManSection>
##
DeclareConstructor( "PcgsByPcSequenceCons",
    [ IsObject, IsObject, IsFamily, IsList,IsList ] );


#############################################################################
##
#A  PcGroupWithPcgs( <mpcgs> )
##
##  <#GAPDoc Label="PcGroupWithPcgs">
##  <ManSection>
##  <Attr Name="PcGroupWithPcgs" Arg='mpcgs'/>
##
##  <Description>
##  creates a new pc group <A>G</A> whose family pcgs is isomorphic to the
##  (modulo) pcgs <A>mpcgs</A>.
##  <Example><![CDATA[
##  gap> G := Group( (1,2,3), (3,4,1) );;
##  gap> PcGroupWithPcgs( Pcgs(G) );
##  <pc group of size 12 with 3 generators>
##  ]]></Example>
##  <P/>
##  If a pcgs is only given by a list of pc elements,
##  <Ref Oper="PcgsByPcSequence"/> can be used:
##  <Example><![CDATA[
##  gap> G:=Group((1,2,3,4),(1,2));;
##  gap> p:=PcgsByPcSequence(FamilyObj(One(G)),
##  > [ (3,4), (2,4,3), (1,4)(2,3), (1,3)(2,4) ]);
##  Pcgs([ (3,4), (2,4,3), (1,4)(2,3), (1,3)(2,4) ])
##  gap> PcGroupWithPcgs(p);
##  <pc group of size 24 with 4 generators>
##  gap> G := SymmetricGroup( 5 );
##  Sym( [ 1 .. 5 ] )
##  gap> H := Subgroup( G, [(1,2,3,4,5), (3,4,5)] );
##  Group([ (1,2,3,4,5), (3,4,5) ])
##  gap> modu := ModuloPcgs( G, H );
##  Pcgs([ (4,5) ])
##  gap> PcGroupWithPcgs(modu);
##  <pc group of size 2 with 1 generator>
##  ]]></Example>
##  </Description>
##  </ManSection>
##  <#/GAPDoc>
##
DeclareAttribute( "PcGroupWithPcgs", IsModuloPcgs );
DeclareSynonymAttr( "GroupByPcgs", PcGroupWithPcgs );


#############################################################################
##
#A  GroupOfPcgs( <pcgs> )
##
##  <#GAPDoc Label="GroupOfPcgs">
##  <ManSection>
##  <Attr Name="GroupOfPcgs" Arg='pcgs'/>
##
##  <Description>
##  The group generated by <A>pcgs</A>.
##  </Description>
##  </ManSection>
##  <#/GAPDoc>
##
DeclareAttribute(
    "GroupOfPcgs",
    IsPcgs );


#############################################################################
##
#A  OneOfPcgs( <pcgs> )
##
##  <#GAPDoc Label="OneOfPcgs">
##  <ManSection>
##  <Attr Name="OneOfPcgs" Arg='pcgs'/>
##
##  <Description>
##  The identity of the group generated by <A>pcgs</A>.
##  <Example><![CDATA[
##  gap> G := Group( (1,2,3,4),(1,2) );; p := Pcgs(G);;
##  gap> RelativeOrders(p);
##  [ 2, 3, 2, 2 ]
##  gap> IsFiniteOrdersPcgs(p);
##  true
##  gap> IsPrimeOrdersPcgs(p);
##  true
##  gap> PcSeries(p);
##  [ Group([ (3,4), (2,4,3), (1,4)(2,3), (1,3)(2,4) ]),
##    Group([ (2,4,3), (1,4)(2,3), (1,3)(2,4) ]),
##    Group([ (1,4)(2,3), (1,3)(2,4) ]), Group([ (1,3)(2,4) ]), Group(())
##   ]
##  ]]></Example>
##  </Description>
##  </ManSection>
##  <#/GAPDoc>
##
DeclareAttribute(
    "OneOfPcgs",
    IsPcgs );


#############################################################################
##
#A  PcSeries( <pcgs> )
##
##  <#GAPDoc Label="PcSeries">
##  <ManSection>
##  <Attr Name="PcSeries" Arg='pcgs'/>
##
##  <Description>
##  returns the subnormal series determined by <A>pcgs</A>.
##  </Description>
##  </ManSection>
##  <#/GAPDoc>
##
DeclareAttribute( "PcSeries", IsPcgs );

#############################################################################
##
#P  IsPcgsElementaryAbelianSeries( <pcgs> )
##
##  <#GAPDoc Label="IsPcgsElementaryAbelianSeries">
##  <ManSection>
##  <Prop Name="IsPcgsElementaryAbelianSeries" Arg='pcgs'/>
##
##  <Description>
##  returns <K>true</K> if the pcgs <A>pcgs</A> refines an elementary abelian
##  series.
##  <Ref Attr="IndicesEANormalSteps"/> then gives the indices in the Pcgs,
##  at which the subgroups of this series start.
##  </Description>
##  </ManSection>
##  <#/GAPDoc>
##
DeclareProperty("IsPcgsElementaryAbelianSeries", IsPcgs );

#############################################################################
##
#A  PcgsElementaryAbelianSeries( <G> )
#A  PcgsElementaryAbelianSeries( [<G>,<N1>,<N2>,....])
##
##  <#GAPDoc Label="PcgsElementaryAbelianSeries">
##  <ManSection>
##  <Attr Name="PcgsElementaryAbelianSeries" Arg='G' Label="for a group"/>
##  <Attr Name="PcgsElementaryAbelianSeries" Arg='list'
##   Label="for a list of normal subgroups"/>
##
##  <Description>
##  computes a pcgs for <A>G</A> that refines an elementary abelian series.
##  <Ref Attr="IndicesEANormalSteps"/> gives the indices in the pcgs,
##  at which the normal subgroups of this series start.
##  The second variant returns a pcgs that runs through the normal subgroups
##  in the list <A>list</A>.
##  </Description>
##  </ManSection>
##  <#/GAPDoc>
##
DeclareAttribute( "PcgsElementaryAbelianSeries", IsGroup );

#############################################################################
##
#A  IndicesEANormalSteps(<pcgs>)
#A  IndicesEANormalStepsBounded(<pcgs>,<bound>)
##
##  <#GAPDoc Label="IndicesEANormalSteps">
##  <ManSection>
##  <Attr Name="IndicesEANormalSteps" Arg='pcgs'/>
##  <Func Name="IndicesEANormalStepsBounded" Arg='pcgs,bound'/>
##
##  <Description>
##  Let <A>pcgs</A> be a pcgs obtained as corresponding to a series of normal
##  subgroups with elementary abelian factors (for example from calling
##  <Ref Attr="PcgsElementaryAbelianSeries" Label="for a group"/>)
##  Then <Ref Attr="IndicesEANormalSteps"/> returns a sorted list of
##  integers, indicating the tails of <A>pcgs</A> which generate these normal
##  subgroup of <A>G</A>.
##  If <M>i</M> is an element of this list, <M>(g_i, \ldots, g_n)</M>
##  is a normal subgroup of <A>G</A>.  The list always starts with <M>1</M>
##  and ends with <M>n+1</M>.
##  (These indices form <E>one</E> series with elementary abelian
##  subfactors, not necessarily the most refined one.)
##  <P/>
##  The attribute <Ref Attr="EANormalSeriesByPcgs"/> returns the actual
##  series of subgroups.
##  <P/>
##  For arbitrary pcgs not obtained as belonging to a special series such a
##  set of indices not necessarily exists,
##  and <Ref Attr="IndicesEANormalSteps"/> is not
##  guaranteed to work in this situation.
##  <P/>
##  Typically, <Ref Attr="IndicesEANormalSteps"/> is set by
##  <Ref Attr="PcgsElementaryAbelianSeries" Label="for a group"/>.
##  <P/>
##  The variant <Ref Func="IndicesEANormalStepsBounded"/> will aim to ensure
##  that no factor will be larger than the given bound.
##  </Description>
##  </ManSection>
##  <#/GAPDoc>
##
DeclareAttribute( "IndicesEANormalSteps", IsPcgs );
DeclareGlobalFunction( "IndicesEANormalStepsBounded" );

#############################################################################
##
#A  EANormalSeriesByPcgs(<pcgs>)
##
##  <#GAPDoc Label="EANormalSeriesByPcgs">
##  <ManSection>
##  <Attr Name="EANormalSeriesByPcgs" Arg='pcgs'/>
##
##  <Description>
##  Let <A>pcgs</A> be a pcgs obtained as corresponding to a series of normal
##  subgroups with elementary abelian factors (for example from calling
##  <Ref Attr="PcgsElementaryAbelianSeries" Label="for a group"/>).
##  This attribute returns the actual series of normal subgroups,
##  corresponding to <Ref Attr="IndicesEANormalSteps"/>.
##  </Description>
##  </ManSection>
##  <#/GAPDoc>
##
DeclareAttribute("EANormalSeriesByPcgs",IsPcgs);

DeclareGlobalFunction( "BoundedRefinementEANormalSeries" );

#############################################################################
##
#P  IsPcgsCentralSeries( <pcgs> )
##
##  <#GAPDoc Label="IsPcgsCentralSeries">
##  <ManSection>
##  <Prop Name="IsPcgsCentralSeries" Arg='pcgs'/>
##
##  <Description>
##  returns <K>true</K> if the pcgs <A>pcgs</A> refines an central elementary
##  abelian series.
##  <Ref Attr="IndicesCentralNormalSteps"/> then gives the indices in the
##  pcgs, at which the subgroups of this series start.
##  </Description>
##  </ManSection>
##  <#/GAPDoc>
##
DeclareProperty("IsPcgsCentralSeries", IsPcgs );

#############################################################################
##
#A  PcgsCentralSeries( <G> )
##
##  <#GAPDoc Label="PcgsCentralSeries">
##  <ManSection>
##  <Attr Name="PcgsCentralSeries" Arg='G'/>
##
##  <Description>
##  computes a pcgs for <A>G</A> that refines a central elementary abelian
##  series.
##  <Ref Attr="IndicesCentralNormalSteps"/> gives the indices in the pcgs,
##  at which the normal subgroups of this series start.
##  </Description>
##  </ManSection>
##  <#/GAPDoc>
##
DeclareAttribute( "PcgsCentralSeries", IsGroup);

#############################################################################
##
#A  IndicesCentralNormalSteps(<pcgs>)
##
##  <#GAPDoc Label="IndicesCentralNormalSteps">
##  <ManSection>
##  <Attr Name="IndicesCentralNormalSteps" Arg='pcgs'/>
##
##  <Description>
##  Let <A>pcgs</A> be a pcgs obtained as corresponding to a series of normal
##  subgroups with central elementary abelian factors
##  (for example from calling <Ref Attr="PcgsCentralSeries"/>).
##  Then <Ref Attr="IndicesCentralNormalSteps"/> returns a sorted list of
##  integers, indicating the tails of <A>pcgs</A> which generate these normal
##  subgroups of <A>G</A>.
##  If <M>i</M> is an element of this list, <M>(g_i, \ldots, g_n)</M>
##  is a normal subgroup of <A>G</A>.
##  The list always starts with <M>1</M> and ends with <M>n+1</M>.
##  (These indices form <E>one</E> series with central elementary abelian
##  subfactors, not necessarily the most refined one.)
##  <P/>
##  The attribute <Ref Attr="CentralNormalSeriesByPcgs"/> returns the actual
##  series of subgroups.
##  <P/>
##  For arbitrary pcgs not obtained as belonging to a special series such a
##  set of indices not necessarily exists,
##  and <Ref Attr="IndicesCentralNormalSteps"/>
##  is not guaranteed to work in this situation.
##  <P/>
##  Typically, <Ref Attr="IndicesCentralNormalSteps"/> is set by
##  <Ref Attr="PcgsCentralSeries"/>.
##  </Description>
##  </ManSection>
##  <#/GAPDoc>
##
DeclareAttribute( "IndicesCentralNormalSteps", IsPcgs );

#############################################################################
##
#A  CentralNormalSeriesByPcgs(<pcgs>)
##
##  <#GAPDoc Label="CentralNormalSeriesByPcgs">
##  <ManSection>
##  <Attr Name="CentralNormalSeriesByPcgs" Arg='pcgs'/>
##
##  <Description>
##  Let <A>pcgs</A> be a pcgs obtained as corresponding to a series of normal
##  subgroups with central elementary abelian factors (for example from
##  calling <Ref Attr="PcgsCentralSeries"/>).
##  This attribute returns the actual series of normal subgroups,
##  corresponding to <Ref Attr="IndicesCentralNormalSteps"/>.
##  </Description>
##  </ManSection>
##  <#/GAPDoc>
##
DeclareAttribute("CentralNormalSeriesByPcgs",IsPcgs);

#############################################################################
##
#P  IsPcgsPCentralSeriesPGroup( <pcgs> )
##
##  <#GAPDoc Label="IsPcgsPCentralSeriesPGroup">
##  <ManSection>
##  <Prop Name="IsPcgsPCentralSeriesPGroup" Arg='pcgs'/>
##
##  <Description>
##  returns <K>true</K> if the pcgs <A>pcgs</A> refines a <M>p</M>-central
##  elementary abelian series for a <M>p</M>-group.
##  <Ref Attr="IndicesPCentralNormalStepsPGroup"/> then gives the indices in
##  the pcgs, at which the subgroups of this series start.
##  </Description>
##  </ManSection>
##  <#/GAPDoc>
##
DeclareProperty("IsPcgsPCentralSeriesPGroup", IsPcgs );

#############################################################################
##
#A  PcgsPCentralSeriesPGroup( <G> )
##
##  <#GAPDoc Label="PcgsPCentralSeriesPGroup">
##  <ManSection>
##  <Attr Name="PcgsPCentralSeriesPGroup" Arg='G'/>
##
##  <Description>
##  computes a pcgs for the <M>p</M>-group <A>G</A> that refines a
##  <M>p</M>-central elementary abelian series.
##  <Ref Attr="IndicesPCentralNormalStepsPGroup"/> gives the
##  indices in the pcgs, at which the normal subgroups of this series start.
##  </Description>
##  </ManSection>
##  <#/GAPDoc>
##
DeclareAttribute( "PcgsPCentralSeriesPGroup", IsGroup);

#############################################################################
##
#A  IndicesPCentralNormalStepsPGroup(<pcgs>)
##
##  <#GAPDoc Label="IndicesPCentralNormalStepsPGroup">
##  <ManSection>
##  <Attr Name="IndicesPCentralNormalStepsPGroup" Arg='pcgs'/>
##
##  <Description>
##  Let <A>pcgs</A> be a pcgs obtained as corresponding to a series of normal
##  subgroups with <M>p</M>-central elementary abelian factors
##  (for example from calling <Ref Attr="PcgsPCentralSeriesPGroup"/>).
##  Then <Ref Attr="IndicesPCentralNormalStepsPGroup"/> returns a sorted list
##  of integers, indicating the tails of <A>pcgs</A> which generate these
##  normal subgroups of <A>G</A>.
##  If <M>i</M> is an element of this list, <M>(g_i, \ldots, g_n)</M>
##  is a normal subgroup of <A>G</A>.
##  The list always starts with <M>1</M> and ends with <M>n+1</M>.
##  (These indices form <E>one</E> series with central elementary abelian
##  subfactors, not necessarily the most refined one.)
##  <P/>
##  The attribute <Ref Attr="PCentralNormalSeriesByPcgsPGroup"/> returns the
##  actual series of subgroups.
##  <P/>
##  For arbitrary pcgs not obtained as belonging to a special series such a
##  set of indices not necessarily exists, and
##  <Ref Attr="IndicesPCentralNormalStepsPGroup"/>
##  is not guaranteed to work in this situation.
##  <P/>
##  Typically, <Ref Attr="IndicesPCentralNormalStepsPGroup"/> is set by
##  <Ref Attr="PcgsPCentralSeriesPGroup"/>.
##  </Description>
##  </ManSection>
##  <#/GAPDoc>
##
DeclareAttribute( "IndicesPCentralNormalStepsPGroup", IsPcgs );

#############################################################################
##
#A  PCentralNormalSeriesByPcgsPGroup(<pcgs>)
##
##  <#GAPDoc Label="PCentralNormalSeriesByPcgsPGroup">
##  <ManSection>
##  <Attr Name="PCentralNormalSeriesByPcgsPGroup" Arg='pcgs'/>
##
##  <Description>
##  Let <A>pcgs</A> be a pcgs obtained as corresponding to a series of normal
##  subgroups with <M>p</M>-central elementary abelian factors
##  (for example from calling <Ref Attr="PcgsPCentralSeriesPGroup"/>).
##  This attribute returns the actual series of normal subgroups,
##  corresponding to <Ref Attr="IndicesPCentralNormalStepsPGroup"/>.
##  </Description>
##  </ManSection>
##  <#/GAPDoc>
##
DeclareAttribute("PCentralNormalSeriesByPcgsPGroup",IsPcgs);

#############################################################################
##
#P  IsPcgsChiefSeries( <pcgs> )
##
##  <#GAPDoc Label="IsPcgsChiefSeries">
##  <ManSection>
##  <Prop Name="IsPcgsChiefSeries" Arg='pcgs'/>
##
##  <Description>
##  returns <K>true</K> if the pcgs <A>pcgs</A> refines a chief series.
##  <Ref Attr="IndicesChiefNormalSteps"/> then gives the indices in the pcgs,
##  at which the subgroups of this series start.
##  </Description>
##  </ManSection>
##  <#/GAPDoc>
##
DeclareProperty("IsPcgsChiefSeries", IsPcgs );

#############################################################################
##
#A  PcgsChiefSeries( <G> )
##
##  <#GAPDoc Label="PcgsChiefSeries">
##  <ManSection>
##  <Attr Name="PcgsChiefSeries" Arg='G'/>
##
##  <Description>
##  computes a pcgs for <A>G</A> that refines a chief series.
##  <Ref Attr="IndicesChiefNormalSteps"/> gives the indices in the pcgs,
##  at which the normal subgroups of this series start.
##  </Description>
##  </ManSection>
##  <#/GAPDoc>
##
DeclareAttribute( "PcgsChiefSeries", IsGroup );

#############################################################################
##
#A  IndicesChiefNormalSteps(<pcgs>)
##
##  <#GAPDoc Label="IndicesChiefNormalSteps">
##  <ManSection>
##  <Attr Name="IndicesChiefNormalSteps" Arg='pcgs'/>
##
##  <Description>
##  Let <A>pcgs</A> be a pcgs obtained as corresponding to a chief series
##  for example from calling <Ref Attr="PcgsChiefSeries"/>).
##  Then <Ref Attr="IndicesChiefNormalSteps"/> returns a sorted list of
##  integers, indicating the tails of <A>pcgs</A> which generate these normal
##  subgroups of <A>G</A>.
##  If <M>i</M> is an element of this list, <M>(g_i, \ldots, g_n)</M>
##  is a normal subgroup of <A>G</A>.
##  The list always starts with <M>1</M> and ends with <M>n+1</M>.
##  (These indices form <E>one</E> series with elementary abelian
##  subfactors, not necessarily the most refined one.)
##  <P/>
##  The attribute <Ref Attr="ChiefNormalSeriesByPcgs"/> returns the actual
##  series of subgroups.
##  <P/>
##  For arbitrary pcgs not obtained as belonging to a special series such a
##  set of indices not necessarily exists,
##  and <Ref Attr="IndicesChiefNormalSteps"/> is not
##  guaranteed to work in this situation.
##  <P/>
##  Typically, <Ref Attr="IndicesChiefNormalSteps"/> is set by
##  <Ref Attr="PcgsChiefSeries"/>.
##  </Description>
##  </ManSection>
##  <#/GAPDoc>
##
DeclareAttribute( "IndicesChiefNormalSteps", IsPcgs );

#############################################################################
##
#A  ChiefNormalSeriesByPcgs(<pcgs>)
##
##  <#GAPDoc Label="ChiefNormalSeriesByPcgs">
##  <ManSection>
##  <Attr Name="ChiefNormalSeriesByPcgs" Arg='pcgs'/>
##
##  <Description>
##  Let <A>pcgs</A> be a pcgs obtained as corresponding to a chief series
##  (for example from calling
##  <Ref Attr="PcgsChiefSeries"/>). This attribute returns the actual series
##  of normal subgroups,
##  corresponding to <Ref Attr="IndicesChiefNormalSteps"/>.
##
##  <Example><![CDATA[
##  gap> g:=Group((1,2,3,4),(1,2));;
##  gap> p:=PcgsElementaryAbelianSeries(g);
##  Pcgs([ (3,4), (2,4,3), (1,4)(2,3), (1,3)(2,4) ])
##  gap> IndicesEANormalSteps(p);
##  [ 1, 2, 3, 5 ]
##  gap> g:=Group((1,2,3,4),(1,5)(2,6)(3,7)(4,8));;
##  gap> p:=PcgsCentralSeries(g);
##  Pcgs([ (1,5)(2,6)(3,7)(4,8), (5,6,7,8), (5,7)(6,8),
##    (1,4,3,2)(5,6,7,8), (1,3)(2,4)(5,7)(6,8) ])
##  gap> IndicesCentralNormalSteps(p);
##  [ 1, 2, 4, 5, 6 ]
##  gap> q:=PcgsPCentralSeriesPGroup(g);
##  Pcgs([ (1,5)(2,6)(3,7)(4,8), (5,6,7,8), (5,7)(6,8),
##    (1,4,3,2)(5,6,7,8), (1,3)(2,4)(5,7)(6,8) ])
##  gap> IndicesPCentralNormalStepsPGroup(q);
##  [ 1, 3, 5, 6 ]
##  ]]></Example>
##  </Description>
##  </ManSection>
##  <#/GAPDoc>
##
DeclareAttribute("ChiefNormalSeriesByPcgs",IsPcgs);

#############################################################################
##
#A  IndicesNormalSteps( <pcgs> )
##
##  <#GAPDoc Label="IndicesNormalSteps">
##  <ManSection>
##  <Attr Name="IndicesNormalSteps" Arg='pcgs'/>
##
##  <Description>
##  returns the indices of <E>all</E> steps in the pc series,
##  which are normal in the group defined by the pcgs.
##  <P/>
##  (In general, this function yields a slower performance than the more
##  specialized index functions for elementary abelian series etc.)
##  </Description>
##  </ManSection>
##  <#/GAPDoc>
##
DeclareAttribute( "IndicesNormalSteps", IsPcgs );

#############################################################################
##
#A  NormalSeriesByPcgs( <pcgs> )
##
##  <#GAPDoc Label="NormalSeriesByPcgs">
##  <ManSection>
##  <Attr Name="NormalSeriesByPcgs" Arg='pcgs'/>
##
##  <Description>
##  returns the subgroups the pc series, which are normal in
##  the group defined by the pcgs.
##  <P/>
##  (In general, this function yields a slower performance than the more
##  specialized index functions for elementary abelian series etc.)
##  </Description>
##  </ManSection>
##  <#/GAPDoc>
##
DeclareAttribute( "NormalSeriesByPcgs", IsPcgs);

#############################################################################
##
#P  IsPrimeOrdersPcgs( <pcgs> )
##
##  <#GAPDoc Label="IsPrimeOrdersPcgs">
##  <ManSection>
##  <Prop Name="IsPrimeOrdersPcgs" Arg='pcgs'/>
##
##  <Description>
##  tests whether the relative orders of <A>pcgs</A> are prime numbers.
##  Many algorithms require a pcgs to have this property.
##  The operation <Ref Attr="IsomorphismRefinedPcGroup"/>
##  can be of help here.
##  </Description>
##  </ManSection>
##  <#/GAPDoc>
##
DeclareProperty( "IsPrimeOrdersPcgs", IsGeneralPcgs );
InstallTrueMethod( IsGeneralPcgs, IsPrimeOrdersPcgs );

#############################################################################
##
#P  IsFiniteOrdersPcgs( <pcgs> )
##
##  <#GAPDoc Label="IsFiniteOrdersPcgs">
##  <ManSection>
##  <Prop Name="IsFiniteOrdersPcgs" Arg='pcgs'/>
##
##  <Description>
##  tests whether the relative orders of <A>pcgs</A> are all finite.
##  </Description>
##  </ManSection>
##  <#/GAPDoc>
##
DeclareProperty( "IsFiniteOrdersPcgs", IsGeneralPcgs );
InstallTrueMethod( IsGeneralPcgs, IsFiniteOrdersPcgs );

#############################################################################
##
#A  RefinedPcGroup( <G> )
##
##  <#GAPDoc Label="RefinedPcGroup">
##  <ManSection>
##  <Attr Name="RefinedPcGroup" Arg='G'/>
##
##  <Description>
##  returns the range of the <Ref Attr="IsomorphismRefinedPcGroup"/> value of
##  <A>G</A>.
##  </Description>
##  </ManSection>
##  <#/GAPDoc>
##
DeclareAttribute( "RefinedPcGroup", IsPcGroup );

#############################################################################
##
#A  IsomorphismRefinedPcGroup( <G> )
##
##  <#GAPDoc Label="IsomorphismRefinedPcGroup">
##  <ManSection>
##  <Attr Name="IsomorphismRefinedPcGroup" Arg='G'/>
##
##  <Description>
##  <Index Subkey="pc group">isomorphic</Index>
##  returns an isomorphism from <A>G</A> onto an isomorphic pc group
##  whose family pcgs is a prime order pcgs.
##  </Description>
##  </ManSection>
##  <#/GAPDoc>
##
DeclareAttribute( "IsomorphismRefinedPcGroup", IsGroup );

#############################################################################
##
#A  RelativeOrders( <pcgs> )
##
##  <#GAPDoc Label="RelativeOrders:pcgs">
##  <ManSection>
##  <Attr Name="RelativeOrders" Arg='pcgs'/>
##
##  <Description>
##  <Index Subkey="of a pcgs" Key="RelativeOrders">
##  <C>RelativeOrders</C></Index>
##  returns the list of relative orders of the pcgs <A>pcgs</A>.
##  </Description>
##  </ManSection>
##  <#/GAPDoc>
##
DeclareAttribute( "RelativeOrders", IsGeneralPcgs );

#############################################################################
##
#O  DepthOfPcElement( <pcgs>, <elm> )
##
##  <#GAPDoc Label="DepthOfPcElement">
##  <ManSection>
##  <Oper Name="DepthOfPcElement" Arg='pcgs, elm'/>
##
##  <Description>
##  returns the depth of the element <A>elm</A> with respect to <A>pcgs</A>.
##  </Description>
##  </ManSection>
##  <#/GAPDoc>
##
DeclareOperation( "DepthOfPcElement", [ IsModuloPcgs, IsObject ] );

#############################################################################
##
#O  DifferenceOfPcElement( <pcgs>, <left>, <right> )
##
##  <ManSection>
##  <Oper Name="DifferenceOfPcElement" Arg='pcgs, left, right'/>
##
##  <Description>
##  </Description>
##  </ManSection>
##
DeclareOperation( "DifferenceOfPcElement", [ IsPcgs, IsObject, IsObject ] );

#############################################################################
##
#O  ExponentOfPcElement( <pcgs>, <elm>, <pos> )
##
##  <#GAPDoc Label="ExponentOfPcElement">
##  <ManSection>
##  <Oper Name="ExponentOfPcElement" Arg='pcgs, elm, pos'/>
##
##  <Description>
##  returns the <A>pos</A>-th exponent of <A>elm</A> with respect to
##  <A>pcgs</A>.
##  </Description>
##  </ManSection>
##  <#/GAPDoc>
##
DeclareOperation( "ExponentOfPcElement",
                  [ IsModuloPcgs, IsObject, IsPosInt ] );

#############################################################################
##
#O  ExponentsOfPcElement( <pcgs>, <elm>[, <posran>] )
##
##  <#GAPDoc Label="ExponentsOfPcElement">
##  <ManSection>
##  <Oper Name="ExponentsOfPcElement" Arg='pcgs, elm[, posran]'/>
##
##  <Description>
##  returns the exponents of <A>elm</A> with respect to <A>pcgs</A>.
##  The three argument version returns the exponents in the positions
##  given in <A>posran</A>.
##  </Description>
##  </ManSection>
##  <#/GAPDoc>
##
DeclareOperation( "ExponentsOfPcElement",
    [ IsModuloPcgs, IsObject ] );

#############################################################################
##
#O  ExponentsOfConjugate( <pcgs>, <i>, <j> )
##
##  <#GAPDoc Label="ExponentsOfConjugate">
##  <ManSection>
##  <Oper Name="ExponentsOfConjugate" Arg='pcgs, i, j'/>
##
##  <Description>
##  returns the exponents of
##  <C><A>pcgs</A>[<A>i</A>]^<A>pcgs</A>[<A>j</A>]</C> with respect to
##  <A>pcgs</A>. For the family pcgs or pcgs induced by it (see section
##  <Ref Sect="Subgroups of Polycyclic Groups - Induced Pcgs"/>), this
##  might be faster than computing the element and computing its exponent
##  vector.
##  </Description>
##  </ManSection>
##  <#/GAPDoc>
##
DeclareOperation( "ExponentsOfConjugate",
    [ IsModuloPcgs, IsPosInt,IsPosInt ] );

#############################################################################
##
#O  ExponentsOfRelativePower( <pcgs>, <i> )
##
##  <#GAPDoc Label="ExponentsOfRelativePower">
##  <ManSection>
##  <Oper Name="ExponentsOfRelativePower" Arg='pcgs, i'/>
##
##  <Description>
##  For <M>p = <A>pcgs</A>[<A>i</A>]</M> this function returns the
##  exponent vector with respect to <A>pcgs</A> of the element <M>p^e</M>
##  where <M>e</M> is the relative order of <A>p</A> in <A>pcgs</A>.
##  For the family pcgs or pcgs induced by it (see section
##  <Ref Sect="Subgroups of Polycyclic Groups - Induced Pcgs"/>), this
##  might be faster than computing the element and computing its exponent
##  vector.
##  </Description>
##  </ManSection>
##  <#/GAPDoc>
##
DeclareOperation( "ExponentsOfRelativePower",
    [ IsModuloPcgs, IsPosInt ] );

#############################################################################
##
#O  ExponentsOfCommutator( <pcgs>, <i>, <j> )
##
##  <#GAPDoc Label="ExponentsOfCommutator">
##  <ManSection>
##  <Oper Name="ExponentsOfCommutator" Arg='pcgs, i, j'/>
##
##  <Description>
##  returns the exponents of the commutator
##  <C>Comm( </C><M><A>pcgs</A>[<A>i</A>], <A>pcgs</A>[<A>j</A>]</M><C> )</C>
##  with respect to <A>pcgs</A>. For the family pcgs or pcgs induced by it,
##  (see section <Ref Sect="Subgroups of Polycyclic Groups - Induced Pcgs"/>),
##  this might be faster than computing the element and computing its
##  exponent vector.
##  </Description>
##  </ManSection>
##  <#/GAPDoc>
##
DeclareOperation( "ExponentsOfCommutator",
    [ IsModuloPcgs, IsPosInt,IsPosInt ] );


#############################################################################
##
#O  LeadingExponentOfPcElement( <pcgs>, <elm> )
##
##  <#GAPDoc Label="LeadingExponentOfPcElement">
##  <ManSection>
##  <Oper Name="LeadingExponentOfPcElement" Arg='pcgs, elm'/>
##
##  <Description>
##  returns the leading exponent of <A>elm</A> with respect to <A>pcgs</A>.
##  </Description>
##  </ManSection>
##  <#/GAPDoc>
##
DeclareOperation( "LeadingExponentOfPcElement",
    [ IsModuloPcgs, IsObject ] );

#############################################################################
##
#O  DepthAndLeadingExponentOfPcElement( <pcgs>, <elm> )
##
##  <#GAPDoc Label="DepthAndLeadingExponentOfPcElement">
##  <ManSection>
##  <Oper Name="DepthAndLeadingExponentOfPcElement" Arg='pcgs, elm'/>
##
##  <Description>
##  returns a list containing the depth of <A>elm</A> and the leading
##  exponent of <A>elm</A> with respect to <A>pcgs</A>. (This is sometimes
##  faster than asking separately.)
##  </Description>
##  </ManSection>
##  <#/GAPDoc>
##
DeclareOperation( "DepthAndLeadingExponentOfPcElement",
    [ IsModuloPcgs, IsObject ] );


#############################################################################
##
#O  PcElementByExponents( <pcgs>, <list> )
#O  PcElementByExponentsNC( <pcgs>[, <basisind>], <list> )
##
##  <#GAPDoc Label="PcElementByExponents">
##  <ManSection>
##  <Func Name="PcElementByExponents" Arg='pcgs, list'/>
##  <Oper Name="PcElementByExponentsNC" Arg='pcgs[, basisind], list'/>
##
##  <Description>
##  returns the element corresponding to the exponent vector <A>list</A>
##  with respect to <A>pcgs</A>.
##  The exponents in <A>list</A> must be in the range of permissible
##  exponents for <A>pcgs</A>.
##  <E>It is not guaranteed that <Ref Func="PcElementByExponents"/> will
##  reduce the exponents modulo the relative orders</E>.
##  (You should use the operation <Ref Func="LinearCombinationPcgs"/>
##  for this purpose.)
##  The <C>NC</C> version does not check that the lengths of the lists
##  fit together and does not check the exponent range.
##  <P/>
##  The three argument version gives exponents only w.r.t. the generators
##  in <A>pcgs</A> indexed by <A>basisind</A>.
##  </Description>
##  </ManSection>
##  <#/GAPDoc>
##
DeclareGlobalFunction("PcElementByExponents");
DeclareOperation( "PcElementByExponentsNC",
    [ IsModuloPcgs, IsList ] );

#############################################################################
##
#O  LinearCombinationPcgs( <pcgs>, <list>[, <one>] )
##
##  <#GAPDoc Label="LinearCombinationPcgs">
##  <ManSection>
##  <Func Name="LinearCombinationPcgs" Arg='pcgs, list[, one]'/>
##
##  <Description>
##  returns the product <M>\prod_i <A>pcgs</A>[i]^{{<A>list</A>[i]}}</M>.
##  In contrast to <Ref Func="PcElementByExponents"/> this permits negative
##  exponents.
##  <A>pcgs</A> might be a list of group elements.
##  In this case, an appropriate identity element
##  <A>one</A> must be given.
##  <A>list</A> can be empty.
##  <Example><![CDATA[
##  gap> G := Group( (1,2,3,4),(1,2) );; P := Pcgs(G);;
##  gap> g := PcElementByExponents(P, [0,1,1,1]);
##  (1,2,3)
##  gap> ExponentsOfPcElement(P, g);
##  [ 0, 1, 1, 1 ]
##  ]]></Example>
##  </Description>
##  </ManSection>
##  <#/GAPDoc>
##
DeclareGlobalFunction("LinearCombinationPcgs");

#############################################################################
##
#F  PowerPcgsElement( <pcgs>, <i>, <exp> )
##
##  <ManSection>
##  <Func Name="PowerPcgsElement" Arg='pcgs, i, exp'/>
##
##  <Description>
##  returns the power <C><A>pcgs</A>[<A>i</A>]^<A>exp</A></C>.
##  <A>exp</A> may be negative.
##  The function caches the results which can be advantageous in particular
##  if the pcgs is not family.
##  </Description>
##  </ManSection>
##
DeclareGlobalFunction("PowerPcgsElement");

#############################################################################
##
#F  LeftQuotientPowerPcgsElement( <pcgs>, <i>, <exp>, <elm> )
##
##  <ManSection>
##  <Func Name="LeftQuotientPowerPcgsElement" Arg='pcgs, i, exp, elm'/>
##
##  <Description>
##  returns the left quotient of <A>elm</A> by the power
##  <C><A>pcgs</A>[<A>i</A>]^<A>exp</A></C>.
##  </Description>
##  </ManSection>
##
DeclareGlobalFunction("LeftQuotientPowerPcgsElement");


#############################################################################
##
#O  SumOfPcElement( <pcgs>, <left>, <right> )
##
##  <ManSection>
##  <Oper Name="SumOfPcElement" Arg='pcgs, left, right'/>
##
##  <Description>
##  returns the element in the span of <A>pcgs</A> whose coefficients are
##  the sums of the coefficients of <A>left</A> and <A>right</A>
##  with respect to <A>pcgs</A>.
##  </Description>
##  </ManSection>
##
DeclareOperation(
    "SumOfPcElement",
    [ IsModuloPcgs, IsObject, IsObject ] );

#############################################################################
##
#O  ReducedPcElement( <pcgs>, <x>, <y> )
##
##  <#GAPDoc Label="ReducedPcElement">
##  <ManSection>
##  <Oper Name="ReducedPcElement" Arg='pcgs, x, y'/>
##
##  <Description>
##  reduces the element <A>x</A> by dividing off (from the left) a power of
##  <A>y</A> such that the leading coefficient of the result with respect to
##  <A>pcgs</A> becomes zero.
##  The elements <A>x</A> and <A>y</A> therefore have to have the same depth.
##  </Description>
##  </ManSection>
##  <#/GAPDoc>
##
DeclareOperation( "ReducedPcElement", [ IsModuloPcgs, IsObject, IsObject ] );


#############################################################################
##
#O  RelativeOrderOfPcElement( <pcgs>, <elm> )
##
##  <#GAPDoc Label="RelativeOrderOfPcElement">
##  <ManSection>
##  <Oper Name="RelativeOrderOfPcElement" Arg='pcgs, elm'/>
##
##  <Description>
##  The relative order of <A>elm</A> with respect to the prime order pcgs
##  <A>pcgs</A>.
##  </Description>
##  </ManSection>
##  <#/GAPDoc>
##
DeclareOperation(
    "RelativeOrderOfPcElement",
    [ IsModuloPcgs, IsObject ] );


#############################################################################
##
#O  HeadPcElementByNumber( <pcgs>, <elm>, <dep> )
##
##  <#GAPDoc Label="HeadPcElementByNumber">
##  <ManSection>
##  <Oper Name="HeadPcElementByNumber" Arg='pcgs, elm, dep'/>
##
##  <Description>
##  returns an element in the span of <A>pcgs</A> whose exponents for indices
##  <M>1</M> to <A>dep</A><M>-1</M> with respect to <A>pcgs</A> are the same
##  as those of <A>elm</A>, the remaining exponents are zero.
##  This can be used to obtain more
##  <Q>simple</Q> elements if only representatives in a factor are required.
##  </Description>
##  </ManSection>
##  <#/GAPDoc>
##
DeclareOperation( "HeadPcElementByNumber",
    [ IsModuloPcgs, IsObject, IsInt ] );

#############################################################################
##
#O  CleanedTailPcElement( <pcgs>, <elm>, <dep> )
##
##  <#GAPDoc Label="CleanedTailPcElement">
##  <ManSection>
##  <Oper Name="CleanedTailPcElement" Arg='pcgs, elm, dep'/>
##
##  <Description>
##  returns an element in the span of <A>pcgs</A> whose exponents for indices
##  <M>1</M> to <M><A>dep</A>-1</M> with respect to <A>pcgs</A> are the same
##  as those of <A>elm</A>, the remaining exponents are undefined.
##  This can be used to obtain more
##  <Q>simple</Q> elements if only representatives in a factor are required,
##  see <Ref Sect="Factor Groups of Polycyclic Groups - Modulo Pcgs"/>.
##  <P/>
##  The difference to <Ref Oper="HeadPcElementByNumber"/>
##  is that this function is guaranteed to zero out trailing
##  coefficients while <Ref Oper="CleanedTailPcElement"/> will only do this
##  if it can be done cheaply.
##  </Description>
##  </ManSection>
##  <#/GAPDoc>
##
DeclareOperation( "CleanedTailPcElement",
    [ IsModuloPcgs, IsObject, IsInt ] );


#############################################################################
##
#O  ExtendedIntersectionSumPcgs( <parent-pcgs>, <n>, <u>, <modpcgs> )
##
##  <ManSection>
##  <Oper Name="ExtendedIntersectionSumPcgs"
##   Arg='parent-pcgs, n, u, modpcgs'/>
##
##  <Description>
##  <E>@ The specification of this function is not clear. Do not use (or
##  document this function properly before using it</E>@.
##  The function returns a record whose entries are <E>not</E> pcgs but only
##  lists of pc elements (to avoid unnecessary creation of InducedPcgs)
##  If <A>modpcgs</A> is a tail if the <A>parent-pcgs</A>
##  it is sufficient to give the starting depth,
##  </Description>
##  </ManSection>
##
DeclareOperation( "ExtendedIntersectionSumPcgs",
    [ IsModuloPcgs, IsList, IsList, IsObject ] );


#############################################################################
##
#O  IntersectionSumPcgs( <parent-pcgs>, <n>, <u> )
##
##  <ManSection>
##  <Oper Name="IntersectionSumPcgs" Arg='parent-pcgs, n, u'/>
##
##  <Description>
##  <E>@ The specification of this function is not clear. Do not use (or
##  document this function properly before using it</E>@.
##  </Description>
##  </ManSection>
##
DeclareOperation( "IntersectionSumPcgs", [ IsModuloPcgs, IsList, IsList ] );


#############################################################################
##
#O  NormalIntersectionPcgs( <parent-pcgs>, <n>, <u> )
##
##  <ManSection>
##  <Oper Name="NormalIntersectionPcgs" Arg='parent-pcgs, n, u'/>
##
##  <Description>
##  <E>@ The specification of this function is not clear. Do not use (or
##  document this function properly before using it</E>@.
##  </Description>
##  </ManSection>
##
DeclareOperation( "NormalIntersectionPcgs", [ IsModuloPcgs, IsList, IsList ] );


#############################################################################
##
#O  SumPcgs( <parent-pcgs>, <n>, <u> )
##
##  <ManSection>
##  <Oper Name="SumPcgs" Arg='parent-pcgs, n, u'/>
##
##  <Description>
##  <E>@ The specification of this function is not clear. Do not use (or
##  document this function properly before using it</E>@.
##  </Description>
##  </ManSection>
##
DeclareOperation( "SumPcgs", [ IsModuloPcgs, IsList, IsList ] );


#############################################################################
##
#O  SumFactorizationFunctionPcgs( <parentpcgs>, <n>, <u>, <kerpcgs> )
##
##  <#GAPDoc Label="SumFactorizationFunctionPcgs">
##  <ManSection>
##  <Oper Name="SumFactorizationFunctionPcgs"
##   Arg='parentpcgs, n, u, kerpcgs'/>
##
##  <Description>
##  computes the sum and intersection of the lists <A>n</A> and <A>u</A> whose
##  elements form modulo pcgs induced by <A>parentpcgs</A> for two subgroups
##  modulo a kernel given by <A>kerpcgs</A>.
##  If <A>kerpcgs</A> is a tail if the <A>parent-pcgs</A> it is sufficient
##  to give the starting depth,
##  this can be more efficient than to construct an explicit pcgs.
##  The factor group modulo <A>kerpcgs</A> generated by <A>n</A> must be
##  elementary abelian and normal under <A>u</A>.
##  <P/>
##  The function returns a record with components
##  <List>
##  <Mark><C>sum</C></Mark>
##  <Item>
##    elements that form a modulo pcgs for the span of both subgroups.
##  </Item>
##  <Mark><C>intersection</C></Mark>
##  <Item>
##    elements that form a modulo pcgs for the intersection of
##    both subgroups.
##  </Item>
##  <Mark><C>factorization</C></Mark>
##  <Item>
##    a function that returns for an element <A>x</A> in the span
##    of <C>sum</C> a record with components <C>u</C> and <C>n</C>
##    that give its decomposition.
##  </Item>
##  </List>
##  <P/>
##  The record components <C>sum</C> and <C>intersection</C> are <E>not</E>
##  pcgs but only lists of pc elements (to avoid unnecessary creation of
##  induced pcgs).
##  </Description>
##  </ManSection>
##  <#/GAPDoc>
##
DeclareOperation(
    "SumFactorizationFunctionPcgs",
    [ IsModuloPcgs, IsList, IsList, IsObject ] );


#############################################################################
##
#F  EnumeratorByPcgs( <pcgs>, <poss> )
##
##  <ManSection>
##  <Func Name="EnumeratorByPcgs" Arg='pcgs, poss'/>
##
##  <Description>
##  </Description>
##  </ManSection>
##
DeclareOperation(
    "EnumeratorByPcgs",
    [ IsModuloPcgs ] );


#############################################################################
##
#O  ExtendedPcgs( <N>, <gens> )
##
##  <#GAPDoc Label="ExtendedPcgs">
##  <ManSection>
##  <Oper Name="ExtendedPcgs" Arg='N, gens'/>
##
##  <Description>
##  extends the pcgs <A>N</A> (induced w.r.t. <A>home</A>) to a new
##  induced pcgs by prepending <A>gens</A>.
##  No checks are performed that this really yields an induced pcgs.
##  </Description>
##  </ManSection>
##  <#/GAPDoc>
##
DeclareOperation( "ExtendedPcgs", [ IsModuloPcgs, IsList ] );


#############################################################################
##
#F  PcgsByIndependentGeneratorsOfAbelianGroup( <A> )
##
##  <ManSection>
##  <Func Name="PcgsByIndependentGeneratorsOfAbelianGroup" Arg='A'/>
##
##  <Description>
##  </Description>
##  </ManSection>
##
DeclareGlobalFunction( "PcgsByIndependentGeneratorsOfAbelianGroup" );

#############################################################################
##
#F  Pcgs_OrbitStabilizer( <pcgs>,<domain>,<pnt>,<oprs>,<opr> )
##
##  <#GAPDoc Label="Pcgs_OrbitStabilizer:pcgs">
##  <ManSection>
##  <Func Name="Pcgs_OrbitStabilizer" Arg='pcgs,domain,pnt,oprs,opr'/>
##
##  <Description>
##  runs a solvable group orbit-stabilizer algorithm on <A>pnt</A> with
##  <A>pcgs</A> acting via the images <A>oprs</A> and the operation function
##  <A>opr</A>.
##  The domain <A>domain</A> can be used to speed up search,
##  if it is not known, <K>false</K> can be given instead.
##  The function
##  returns a record with components <C>orbit</C>, <C>stabpcgs</C> and
##  <C>lengths</C>, the
##  latter indicating the lengths of the orbit whenever it got extended.
##  This can be used to recompute transversal elements.
##  This function should be used only inside algorithms when speed is
##  essential.
##  </Description>
##  </ManSection>
##  <#/GAPDoc>
##
DeclareGlobalFunction( "Pcgs_OrbitStabilizer" );
DeclareGlobalFunction( "Pcs_OrbitStabilizer" );
DeclareGlobalFunction( "Pcgs_OrbitStabilizer_Blist" );

##  <#GAPDoc Label="[1]{pcgs}">
##  The following functions are intended for working with factor groups
##  obtained by factoring out the tail of a pcgs.
##  They provide a way to map elements or induced pcgs quickly in the factor
##  (respectively to take preimages) without the need to construct a
##  homomorphism.
##  <P/>
##  The setup is always a pcgs <A>pcgs</A> of <A>G</A> and a pcgs
##  <A>fpcgs</A> of a factor group <M>H = <A>G</A>/<A>N</A></M>
##  which corresponds to a head of <A>pcgs</A>.
##  <P/>
##  No tests for validity of the input are performed.
##  <#/GAPDoc>
##

#############################################################################
##
#F  LiftedPcElement( <pcgs>, <fpcgs>, <elm> )
##
##  <#GAPDoc Label="LiftedPcElement">
##  <ManSection>
##  <Func Name="LiftedPcElement" Arg='pcgs, fpcgs, elm'/>
##
##  <Description>
##  returns a preimage in <A>G</A> of an element <A>elm</A> of <A>H</A>.
##  </Description>
##  </ManSection>
##  <#/GAPDoc>
##
DeclareGlobalFunction( "LiftedPcElement" );

#############################################################################
##
#F  ProjectedPcElement( <pcgs>, <fpcgs>, <elm> )
##
##  <#GAPDoc Label="ProjectedPcElement">
##  <ManSection>
##  <Func Name="ProjectedPcElement" Arg='pcgs, fpcgs, elm'/>
##
##  <Description>
##  returns the image in <A>H</A> of an element <A>elm</A> of <A>G</A>.
##  </Description>
##  </ManSection>
##  <#/GAPDoc>
##
DeclareGlobalFunction( "ProjectedPcElement" );

#############################################################################
##
#F  ProjectedInducedPcgs( <pcgs>, <fpcgs>, <ipcgs> )
##
##  <#GAPDoc Label="ProjectedInducedPcgs">
##  <ManSection>
##  <Func Name="ProjectedInducedPcgs" Arg='pcgs, fpcgs, ipcgs'/>
##
##  <Description>
##  <A>ipcgs</A> must be an induced pcgs with respect to <A>pcgs</A>.
##  This operation returns an induced pcgs with respect to <A>fpcgs</A>
##  consisting of the nontrivial images of <A>ipcgs</A>.
##  </Description>
##  </ManSection>
##  <#/GAPDoc>
##
DeclareGlobalFunction( "ProjectedInducedPcgs" );

#############################################################################
##
#F  LiftedInducedPcgs( <pcgs>, <fpcgs>, <ipcgs>, <ker> )
##
##  <#GAPDoc Label="LiftedInducedPcgs">
##  <ManSection>
##  <Func Name="LiftedInducedPcgs" Arg='pcgs, fpcgs, ipcgs, ker'/>
##
##  <Description>
##  <A>ipcgs</A> must be an induced pcgs with respect to <A>fpcgs</A>.
##  This operation returns an induced pcgs with respect to <A>pcgs</A>
##  consisting of the preimages of <A>ipcgs</A>,
##  appended by the elements in <A>ker</A> (assuming
##  there is a bijection of <A>pcgs</A> mod <A>ker</A> to <A>fpcgs</A>).
##  <A>ker</A> might be a simple element list.
##  </Description>
##  </ManSection>
##  <#/GAPDoc>
##
DeclareGlobalFunction( "LiftedInducedPcgs" );


#############################################################################
##
#F  PcgsByPcgs( <pcgs>, <decomp>, <family>, <images> )
##
##  <#GAPDoc Label="PcgsByPcgs">
##  <ManSection>
##  <Func Name="PcgsByPcgs" Arg='pcgs, decomp, family, images'/>
##
##  <Description>
##  Constructs a pcgs that will use another pcgs (via an isomorphism pc
##  group) to determine exponents. The assumption is that exponents will be
##  so expensive that a pc group collection is of neglegible cost.
##  <A>pcgs</A> is the list of pc elements
##  desired. <A>decomp</A> is another pcgs with respect to which we can
##  compute exponents. It corresponds to the family pcgs <A>family</A> of an
##  isomorphic pc group. In this pc group <A>images</A> are the images of
##  <A>pcgs</A>. Exponents will be computed by forming exponents with
##  respect to <A>decomp</A>, forming the image in the pc group, and then
##  computing exponents of this image by <A>images</A>.
##  </Description>
##  </ManSection>
##  <#/GAPDoc>
##
DeclareGlobalFunction( "PcgsByPcgs" );

[ Dauer der Verarbeitung: 0.11 Sekunden  (vorverarbeitet)  ]

                                                                                                                                                                                                                                                                                                                                                                                                     


Neuigkeiten

     Aktuelles
     Motto des Tages

Software

     Produkte
     Quellcodebibliothek

Aktivitäten

     Artikel über Sicherheit
     Anleitung zur Aktivierung von SSL

Muße

     Gedichte
     Musik
     Bilder

Jenseits des Üblichen ....

Besucherstatistik

Besucherstatistik

Monitoring

Montastic status badge