@---------------------------------------------------------------------------
@---------------------------------------------------------------------------
@ FILE: autgrp.c
@---------------------------------------------------------------------------
@---------------------------------------------------------------------------
@
@-------------------------------------------------------------------------
@ bravais_TYP *autgrp(Fo, Foanz, SV, Erz, Erzanz, options)
@ matrix_TYP **Fo, **Erz, *SV;
@ int Foanz, Erzanz, *options;
@
@ The functions 'autgrp' calculates generators and the order of the group
@ G := {g in GL_n(Z) | g^{tr} * Fo[i] * g = Fo[i], 1<= i<= Foanz}
@ returned via a pointer to 'bravais_TYP'.
@
@ The arguments of autgrp are:
@ matrix_TYP	**Fo:		a set of n times n matrices,
@				the first must be positiv definite
@ int	 	Foanz:		the number of the matrices given in 'Fo'.
@ matrix_TYP	**Erz:		if already element of G are known,
@				they can be used for calculating generators
@				for the whole group.
@				The matrices of known elements can be given 
@				to the function by the pointer 'Erz'.
@ int		Erzanz:		The number of matrices given in 'Erz"
@ matrix_TYP	*SV:		The rows of the matrix 'SV' must be the vectors
@				x in Z^n with x * F[0] * x^{tr} <= m, where
@				m is the maximal diagonal entry of the Matrix
@				F[0]
@ int		*options:	see below.
@
@ options is a pointer to integer (of length 6)
@ The possible options are encoded in the following way:
@ options[0]:	The depth, up to wich scalar product combinations
@		shall be calculated. The value should be small.
@		options[0] > 0 should be used only, if the automorphismn
@		group is expected to be small (with respect to the number
@		of shortest vectors).
@ options[1]:	The n-point stabiliser with respect to different basis
@		will be calculated.
@ options[2]:	If options[2] = 1, additional output is written to the
@               file AUTO.tmp
@ options[3]:   If options[3] = 1, Bacher polynomials are used. 
@		If options[3] = 2, Bacher polynomial are used up to a deepth
@		                   specified in options[4].
@		If options[3] = 3, Bacher polynomials are used, using 
@		                   combinations of vectors having the scalar
@		                   product specified in options[5]
@		options[3] = 4 is the combination of options[3] = 2 and
@                              options[3] = 3.
@ options[4]:	A natural number number  or zero (if options[3] = 2 or 4)
@ options[5]:	An integral number (if options[3] = 3 or 4)
@
@	It is possible to use NULL for options,
@	in this case option is assumed to be [0,0,0,0,0,0]
@-------------------------------------------------------------------------
@---------------------------------------------------------------------------
@ bravais_TYP *perfect_normal_autgrp(Fo, SV, Erz, Erzanz, options,
@                                    P, Panz, Pbase, Pdim)
@ matrix_TYP *Fo, **Erz, *SV, **P, **Pbase;
@ int Erzanz, *options, Panz, Pdim;
@
@ The function 'perfect_normak_autgrp' calculates generators for
@ G = {g in GL_n(Z)| g^{tr} * Fo * g = Fo and
@                    g^{tr} Pbase[i] g is a matrix in P for 0<=i<Pdim}
@
@ The arguments are:
@ Fo:       a symmetric positive definite n by n-matrix.
@ SV:       the vectors x in GL_n(Z) (up to sign) with x Fo x^{tr} < k,
@           where k is the maximal diagonal entry of 'Fo'.
@ Erz:      matrices of elements of G (if known).
@ Erzanz:   the number of matrices in 'Erz'.
@ options:  the same as for  the function 'autgrp'.
@ P:        a set of matrices
@ Panz:     the number of matrices given in 'P'.
@ Pbase:    a set of matrices
@ Pdim:     the number of matrices given in 'Pbase'.
@
@ This function is designed to calculate the stabilizer of a perfect 
@ form 'Fo' in the normalizer of the group generated by the matrices
@ given in 'Erz'.
@ Then 'P' is the set of matrices given by the Voronoi-directions of 'Fo'
@ and 'Pbase' a maximal linearly independent subset of 'P'.
@
@---------------------------------------------------------------------------
@
@---------------------------------------------------------------------------
@---------------------------------------------------------------------------
@ FILE: isometry.c
@---------------------------------------------------------------------------
@---------------------------------------------------------------------------
@
@-------------------------------------------------------------------------
@ matrix_TYP *isometry(F1, F2, Fanz, SV1, SV2, Erz, Erzanz, options)
@ matrix_TYP **F1, **F2, *SV1, *SV2, **Erz;
@ int Fanz, Erzanz, *options;
@
@ The function 'isometry' calculates a matrix X such that
@    X * F1[i] *X^{tr} = F2[i] for 1<= i<= Foanz
@ returned via a pointer to 'matrix_TYP'.
@ If no such matrix exists the functions returns NULL
@
@ The arguments of isometry are:
@ matrix_TYP	**F1:		a set of n times n matrices,
@				the first must be positiv definite
@ matrix_TYP	**F2:		a set of n times n matrices,
@				the first must be positiv definite
@ int	 	Fanz:		the number of the matrices given in 'F1'.
@ matrix_TYP	*SV1:		The rows of the matrix 'SV1' must be the vectors
@				x in Z^n with x * F1[0] * x^{tr} <= m, where
@				m is the maximal diagonal entry of the Matrix
@				F1[0]
@ matrix_TYP	*SV2:		The rows of the matrix 'SV2' must be the vectors
@				x in Z^n with x * F2[0] * x^{tr} <= m, where
@				m is the maximal diagonal entry of the Matrix
@				F.[0]
@ int		*options:	see below.
@ matrix_TYP	**Erz:		if already elements with g^{tr}F1[i]g = F2[i]
@                               are known, the can be used for calculating
@                               the isometry.
@				The matrices of known elements can be given 
@				to the function by the pointer 'Erz'.
@ int		Erzanz:		The number of matrices given in 'Erz"
@ int		*options:	see below.
@
@ options is a pointer to integer (of length 6)
@ The possible options are encoded in the following way:
@ options[0]:	The depth, up to wich scalar product combinations
@		shall be calculated. The value should be small.
@		options[0] > 0 should be used only, if the automorphismn
@		group is expected to be small (with respect to the number
@		of shortest vectors).
@ options[1]:	The n-point stabiliser with respect to different basis
@		will be calculated.
@ options[2]:	If options[2] = 1, additional output is written to the
@               file AUTO.tmp
@ options[3]:   If options[3] = 1, Bacher polynomials are used. 
@		If options[3] = 2, Bacher polynomial are used up to a deepth
@		                   specified in options[4].
@		If options[3] = 3, Bacher polynomials are used, using 
@		                   combinations of vectors having the scalar
@		                   product specified in options[5]
@		options[3] = 4 is the combination of options[3] = 2 and
@                              options[3] = 3.
@ options[4]:	A natural number number  or zero (if options[3] = 2 or 4)
@ options[5]:	An integral number (if options[3] = 3 or 4)
@
@	It is possible to use NULL for options,
@	in this case option is assumed to be [0,0,0,0,0,0]
@-------------------------------------------------------------------------
@-------------------------------------------------------------------------
@ matrix_TYP *perfect_normal_isometry(F1, F2, SV1, SV2, Erz, Erzanz,
@                                     options, P, Panz, Pbase, Pdim)
@ matrix_TYP *F1, *F2, *SV1, *SV2, **Erz, **P, **Pbase;
@ int Erzanz, *options, Panz, Pdim;
@
@ The function 'perfect_normal_isometry' calculates a matrix X with
@                X * F1 * X^{tr} = F2 and
@    X^{-1} * Pbase[i] * X^{-tr} is a matrix in P for 0<= i< Pdim
@
@
@ The arguments are:
@ F1:       a symmetric positive definite n by n-matrix.
@ F2:       a symmetric positive definite n by n-matrix.
@ SV1:      the vectors x in GL_n(Z) (up to sign) with xF1x^{tr} < k,
@           where k is the maximal diagonal entry of 'F1'.
@ SV2:      the vectors x in GL_n(Z) (up to sign) with xF2x^{tr} < k,
@           where k is the maximal diagonal entry of 'F1'.
@ Erz:      matrices of elements of Aut(F2) (if known).
@ Erzanz:   the number of matrices in 'Erz'.
@ options:  the same as for  the function 'isometry'.
@ P:        a set of matrices
@ Panz:     the number of matrices given in 'P'.
@ Pbase:    a set of matrices
@ Pdim:     the number of matrices given in 'Pbase'.
@
@ This function is designed to calculate  an isometry of two
@ G-perfect forms that is in the normalizer of a group G (the
@ generators of G are the matrices 'Erz').
@ Then 'P' is the set of matrices given by the Voronoi-directions of 'F1'
@ and 'Pbase' a maximal linearly independent subset of the 
@ Voronoi-directions of 'F2'.
@
@---------------------------------------------------------------------------
@
@---------------------------------------------------------------------------
@---------------------------------------------------------------------------
@ FILE:  pr_aut.c
@---------------------------------------------------------------------------
@---------------------------------------------------------------------------
@
@---------------------------------------------------------------------------
@---------------------------------------------------------------------------
@ FILE: pr_isom.c
@---------------------------------------------------------------------------
@---------------------------------------------------------------------------
@
@-------------------------------------------------------------------------
@ matrix_TYP *pr_isom(F1, F2, Fanz, Erz, Erzanz, options)
@ matrix_TYP **F1, **F2, **Erz;
@ int Fanz, Erzanz, *options;
@
@ The function 'isometry' calculates a matrix X such that
@    X * F1[i] *X^{tr} = F2[i] for 1<= i<= Foanz
@ returned via a pointer to 'matrix_TYP'.
@ If no such matrix exists the functions returns NULL
@ 'pr_aut' applies a pair_reduction to F1[0] and then
@ uses then the function isometry to calculate an isometry
@ for the reduced form
@
@ The arguments of isometry are:
@ matrix_TYP	**F1:		a set of n times n matrices,
@				the first must be positiv definite
@ matrix_TYP	**F2:		a set of n times n matrices,
@				the first must be positiv definite
@ int	 	Fanz:		the number of the matrices given in 'F1'.
@ int		*options:	see below.
@ matrix_TYP	**Erz:		if already elements with g^{tr}F1[i]g = F2[i]
@                               are known, the can be used for calculating
@                               the isometry.
@				The matrices of known elements can be given 
@				to the function by the pointer 'Erz'.
@ int		Erzanz:		The number of matrices given in 'Erz"
@ int		*options:	see below.
@
@ options is a pointer to integer (of length 6)
@ The possible options are encoded in the following way:
@ options[0]:	The depth, up to wich scalar product combinations
@		shall be calculated. The value should be small.
@		options[0] > 0 should be used only, if the automorphismn
@		group is expected to be small (with respect to the number
@		of shortest vectors).
@ options[1]:	The n-point stabiliser with respect to different basis
@		will be calculated.
@ options[2]:	If options[2] = 1, additional output is written to the
@               file AUTO.tmp
@ options[3]:   If options[3] = 1, Bacher polynomials are used. 
@		If options[3] = 2, Bacher polynomial are used up to a deepth
@		                   specified in options[4].
@		If options[3] = 3, Bacher polynomials are used, using 
@		                   combinations of vectors having the scalar
@		                   product specified in options[5]
@		options[3] = 4 is the combination of options[3] = 2 and
@                              options[3] = 3.
@ options[4]:	A natural number number  or zero (if options[3] = 2 or 4)
@ options[5]:	An integral number (if options[3] = 3 or 4)
@
@	It is possible to use NULL for options,
@	in this case option is assumed to be [0,0,0,0,0,0]
@-------------------------------------------------------------------------
