1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82
|
// Copyright (C) 1997 The New York Group Theory Cooperative
// See magnus/doc/COPYRIGHT for the full notice.
//
// Contents: Declarations of classe WordEnumerator
//
// Principal Author: Alexei Myasnikov
//
// Status: in progress
//
// Revision History:
//
// Notes:
//
//
#ifndef _WORDENUMERATOR_H_
#define _WORDENUMERATOR_H_
#include "FreeGroup.h"
// ------------------------ VectorEnumerator -------------------
class VectorEnumerator
{
public:
VectorEnumerator( int n = 2) :
current(0) {
if ( n < 2)
error("VectorEnumerator( int n = 2) :"
" length of vectors can not be less than 2");
lengthOfVectors = n;
}
// Iteration functions
void reset(int c = 0) { current = c; }
void next() { current++; }
VectorOf<Integer> vector() const {
return getVectorOf( current );
}
// Coding functions
VectorOf<Integer> getVectorOf ( Integer c ) const;
Integer getNumberOfVector(VectorOf<Integer> v) const;
int vectorsLength() const { return lengthOfVectors; }
private:
VectorOf<Integer> getPairOf ( Integer c ) const;
Integer getNumberOfPair(const Integer& n,const Integer& m ) const{
return ((n + m)*(n + m + 1))/2 + m;
}
int current;
int lengthOfVectors;
};
// ------------------------ WordEnumerator -------------------
class WordEnumerator
{
public:
WordEnumerator( const FreeGroup& f, int n = 2):
ve( n ),
theGroup( f )
{ }
void reset(int c = 0) { ve.reset( c ); }
void next() { ve.next(); }
VectorOf<Word> getWords();
private:
FreeGroup theGroup;
VectorEnumerator ve;
};
#endif
|