<Chapter>
	<Heading>Mal'cev collection
	</Heading>
	Let <M>G</M> be an infinite polycyclic group. It is well-known that
	there exist  a normal <M>T</M>-group <M>N</M> and a <M>T</M>-group 
	<M>C</M> such that <M>H=CN</M> is normal
	of finite index in <M>G</M> and  <M>H/N</M> is free abelian of finite 
	rank <Cite Key="Seg83"/>. 
	
	In this chapter we present an effective collection method for an infinite
	polycyclic group which is given by a polycyclic presentation 
	with respect to a polycyclic sequence <M>P</M> going through the normal
	series <M>1 \le N \le H \le G</M>.
	
	This polycyclic sequence <M>P</M> must be chosen as follows.
	Let <M>(n_1,\dots,n_l)</M> be a Mal'cev basis of <M>N</M> and let
	<M>(c_1N,\dots,c_k N)</M> be a basis for
	the free abelian group <M>CN/N</M>.
	Then <M>(c_1,\dots,c_k,n_1,\dots,n_l)</M>
	is a polycyclic sequence for <M>H=CN</M>. Further there exists
	<M>f_1,\dots, f_j \in G</M> such that <M>(f_1 H, \dots, f_j H)</M> is
	a polycyclic sequence for <M>G/H</M>. Now we set
	
	<Display>P = (f_1,\dots,f_j, c_1, \dots , c_k, n_1, \dots, n_l )</Display>
	
	<Section>
		<Heading>The main functions
		</Heading>
		
		<ManSection>
		<Func Name="MalcevCollectorConstruction" Arg="G, inds, C, CC, N, NN"/>
		<Description>
		Returns a Mal'cev collector for the infinite polycyclically
		presented group <M>G</M>. The group <M>G</M> must be given
		with respect to a polycyclic sequence <M>(g_1,\dots,g_r, c_{r+1},
		\dots, c_{r+s}, n_{r+s+1}, \dots, n_{r+s+t})</M>
		with the following properties:
		<List>
			<Item>
			(a) <M>(n_{r+s+1}, \dots, n_{r+s+t})</M> is a Mal'cev basis for 
			the <M>T</M>-group <M>N \leq G</M>,
			</Item>
			<Item>
			(b) <M>(c_{r+1}N, \dots, c_{r+s}N)</M> is a basis for the 
			free-abelian group <M>CN/N</M> where <M>C \leq G</M> is a 
			<M>T</M>-group generated by <M>c_{r+1}, \dots, c_{r+s}</M>,
			</Item>
			<Item>
			(c) <M>(g_1 CN, \dots, g_r CN)</M> is a polycyclic sequence for 
			the finite group <M>G/CN</M>.
			</Item>
		</List>
		
		The list <A>inds</A> is equal to 
		<M>[ [1,\dots,r],[r+1,\dots,r+s],[r+s+1,\dots,r+s+t]]</M>. 
		The group <M>CC</M> is isomorphic to <M>C</M> via 
		<A>CC</A>!.bijection 
		and given by a polycyclic presentation with respect 
		to a Mal'cev basis starting with <M>c_{r+1}, \dots, c_{r+s}</M>.
		The  group <M>NN</M> is isomorphic to <M>N</M> via 
		<A>NN</A>!.bijection.
		and given by a polycyclic presentation with respect 
		to the Mal'cev basis <M>( n_{r+s+1}, \dots, n_{r+s+t})</M>.
		</Description>
	</ManSection>
	
	<ManSection>
		<Func Name="GUARANA.Tr_n_O1" Arg="n" />
		<Func Name="GUARANA.Tr_n_O2" Arg="n" />
		<Description>
		for a positive integer <A>n</A> 
		these functions construct polycyclically presented groups 
		that can be used to test the Mal'cev collector.
		They return a list which can be used as input for the function
		MalcevCollectorConstruction.
		The constructed groups are isomorphic to triangular matrix groups
		of dimension <A>n</A> over the ring <M>O_1</M>, respectively 
		<M>O_2</M>.
		The ring <M>O_1</M>, respectively <M>O_2</M>, is the maximal order
		of <M>\Q(\theta_i)</M> where <M>\theta_1</M>, respectively
		<M>\theta_2</M>, is a zero of the polynomial 
		<M>p_1(x) = x^2-3</M>, respectively 
		<M>p_2(x)=x^3 -x^2 +4</M>.
		</Description>
	</ManSection>
	
	<ManSection>
		<Func Name="GUARANA.F_2c_Aut1" Arg="c" />
		<Func Name="GUARANA.F_3c_Aut1" Arg="c" />
		<Description>
		for a positive integer <A>c</A> 
		these functions construct polycyclically presented groups
		that can be used to test the Mal'cev collector.
		They return a list which can be used as input for the function
		MalcevCollectorConstruction.
		These groups are constructed as follows:
		Let <M>F_{n,c}</M> be the free nilpotent of class <M>c</M> group on
		<M>n</M> generators.
		An automorphism <M>\varphi</M> of the free group <M>F_n</M>
		naturally induces an automorphism
		<M>\bar{\varphi}</M> of <M>F_{n,c}</M>.
		We use the automorphism <M>\varphi_1</M> of <M>F_2</M>
		which maps <M>f_1</M> to <M>f_2^{-1}</M> and <M>f_2</M> to
		<M>f_1 f_2^3</M> and the automorphism <M>\varphi_2</M> of 
		<M>F_3</M> mapping <M>f_1</M> to <M>f_2^{-1}</M>, <M>f_2</M>
		to <M>f_3^{-1}</M> and <M>f_3</M> to <M>f_2^{-3}f_1^{-1}</M>
		for our construction.
		The returned group F_2c_Aut1, respectively F_3c_Aut2, is 
		isomorphic to the semidirect product 
		<M>\langle \varphi_1 \rangle \ltimes F_{2,c}</M>, respectively
		<M>\langle \varphi_2 \rangle \ltimes F_{3,c}</M>.
		</Description>
	</ManSection>
	
	<ManSection>
		<Func Name="MalcevGElementByExponents" Arg="malCol, exps" />
		<Description>
		For a Mal'cev collector <A>malCol</A> of a group <M>G</M> 
		and an exponent vector <A>exps</A> with integer
		entries, this functions returns the group element of <M>G</M>, which 
		has exponents <A>exps</A> with respect to the polycyclic sequence 
		underlying <A>malCol</A>.
		</Description>
	</ManSection>
	
	<ManSection>
		<Func Name="Random" Arg="malCol, range" />
		<Description>
		For a Mal'cev collector <A>malCol</A> this function returns the 
		output of MalcevGElementByExponents( <A>malCol</A>, <A>exps</A> ),
		where <A>exps</A> is an exponent vector whose entries are randomly
		chosen integers between -<A>range</A> and <A>range</A>.
		</Description>
	</ManSection>
	
	<ManSection>
		<Func Name="*" Arg="g, h" />
		<Description>
		Returns the product of group elements which are defined with respect 
		to a Mal'cev collector by the the function MalcevGElementByExponents.
		</Description>
	</ManSection>
	
	<ManSection>
		<Func Name="GUARANA.AverageRuntimeCollec" Arg="malCol, ranges, no" /> 
		<Description>
		For a Mal'cev collector <A>malCol</A>, a list of positive integers 
		<A>ranges</A> and a positive integer <A>no</A> 
		this function computes for each number <A>r</A> in <A>ranges</A> 
		the average runtime of <A>no</A> multiplications of 
		two random elements of <A>malCol</A> of range <A>r</A>, as
		generated by Random( <A>malCol</A>, <A>r</A> ). 
		</Description>
	</ManSection>
	
  </Section>

  <Section>
  	<Heading>An example application
  	</Heading>

		<Example>
		gap> ll := GUARANA.Tr_n_O1( 3 );
		[ Pcp-group with orders [ 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0 ],
		  [ [ 1 .. 3 ], [ 4 .. 6 ], [ 7 .. 12 ] ],
		  Pcp-group with orders [ 0, 0, 0, 0, 0, 0 ],
		  Pcp-group with orders [ 0, 0, 0, 0, 0, 0 ],
		  Pcp-group with orders [ 0, 0, 0 ], Pcp-group with orders [ 0, 0, 0 ] ]
		gap> malCol := MalcevCollectorConstruction( ll );
		&lt;&lt;Malcev collector&gt;&gt;
		  F : [ 2, 2, 2 ]
		  C : &lt;&lt;Malcev object of dimension 3&gt;&gt;
		  N : &lt;&lt;Malcev object of dimension 6&gt;&gt;
		
		gap> exps_g := [ 1, 1, 1, -3, -2, 1, -2, -1, 0, 3, -1,3 ];
		[ 1, 1, 1, -3, -2, 1, -2, -1, 0, 3, -1, 3 ]
		gap> exps_h := [ 1, 0, 1, -1, 0, 2, 0, 4, -1, 5, 9,-5 ];
		[ 1, 0, 1, -1, 0, 2, 0, 4, -1, 5, 9, -5 ]
		gap> g := MalcevGElementByExponents( malCol, exps_g );
		[ 1, 1, 1, -3, -2, 1, -2, -1, 0, 3, -1, 3 ]
		gap> h := MalcevGElementByExponents( malCol, exps_h );
		[ 1, 0, 1, -1, 0, 2, 0, 4, -1, 5, 9, -5 ]
		
		gap> k := g*h;
		[ 0, 1, 0, -4, -2, 3, -7, 0, -37, -16, -352, -212 ]
				
		gap> Random( malCol, 10 );
		[ 0, 0, 1, 9, 5, 5, 2, -2, 7, -10, 7, -6 ]
		
		</Example>

	</Section>

</Chapter>

