AbelianEquationsSolver::AbelianEquationsSolver( const AbelianGroup& a , const VectorOf<Word>& v , int numOfVar ) : rawA( a ), A( FPGroup() ), rawSystem( v ), system( v.length() ), b( v.length() ), x( numOfVar ), torsion( numOfVar ), params( numOfVar ), numberOfVariables( numOfVar ), sysRank( 0 ), haveSol( -1 ) { FPGroup G( a.getFPGroup() ); VectorOf<Chars> q( G.numberOfGenerators() - numberOfVariables ); for( int i = numberOfVariables ; i < G.numberOfGenerators() ; i++ ) q[ i - numberOfVariables ] = (G.namesOfGenerators())[i]; if( G.getRelators().cardinality() ) { SetOf<Word> s = G.getRelators(); SetIterator<Word> I(s); SetOf<Word> news; while( !I.done() ) { Word w = I.value(); for( int j = 0 ; j < w.length() ; j++ ) { int p = Generator( w[j] ).hash(); if( p > 0 ) w[j] = Generator( p - numberOfVariables ); else w[j] = Generator( p + numberOfVariables ); } news.adjoinElement( w ); I.next(); } FPGroup G1( q , news ); A = AbelianGroup( G1 ); } else A = AbelianGroup( FPGroup(q) ); }