VectorOf<Word> SGOfFreeNilpotentGroupRep::normalClosureBasis() const { //@ep I have found that the process is slower with the full basis, // so I form it from the scratch. MalcevSet newBasis(theGenerators, theParentGroup.collector()); newBasis.makeNormalClosure(); // The basis is found. Now we try to reduce it to make further // processing easier. VectorOf<Word> basis = newBasis.getCommutatorWords(); // First, we reduce words in terms of basic commutators. // We could proceed without this step, but it helps // to reduce the second one greatly. FreeGroup F( theParentGroup.theHirschNumber() ); basis = F.nielsenBasis(basis); // Convert words in terms of basic commutators to group // generators. for(int i = 0; i < basis.length(); i++) { PolyWord pw = basis.val(i); basis[i] = theParentGroup.commutators().wordForm().toWord(pw); } // Now reduce this vector FreeGroup F1( theParentGroup.numberOfGenerators() ); basis = F1.nielsenBasis(basis); return basis; }
// put the words to the set MalcevSet::MalcevSet(const VectorOf<Word>& v, const NGCollector& nc) : isBasis(false), isNormal(dontknow), theCollector(nc) { for(int i = 0; i < v.length(); i++) addWord( v.val(i) ); }