Word FPGroup::randomIdentity_Classic( int length , float conj_param ) const { if( theRelators.size( )==0 ) return Word(); int ngens = numberOfGenerators( ); int nrels = theRelators.size( ); Word result; while( result.length()<length ) { while( result.length()<length ) { // generate conjugator int conj_length = 0; for( ; RandLib::ur.rand()<conj_param ; ++conj_length ); Word conjugator = Word::randomWord( numOfGenerators , conj_length ); Word rel( theRelators[RandLib::ur.irand( 0 , theRelators.size( )-1 )] ); rel = ( RandLib::ur.irand( 0 , 1 )==0 ? rel : rel.inverse( ) ); rel.cyclicallyPermute( RandLib::ur.irand( 0 , rel.length( )-1 ) ); result *= -conjugator * rel * conjugator; } } return result; }
void AbelianWordRep::printOn( ostream& ostr ) const { ostr << "["; for( int i = 0; i < numberOfGenerators(); ++i ) ostr << " " << i+1 << "^" << thePowers[i]; ostr << " ]"; }
Word FPGroup::randomIdentity_Stack( int length ) const { if( theRelators.size( )==0 ) return Word(); // 1. Construct a set of rules int ngens = numberOfGenerators( ); int nrels = theRelators.size( ); vector< pair< Word , Word > > rules; for( int r=0 ; r<nrels ; ++r ) { Word rel = theRelators[r]; for( int l=0 ; l<rel.length() ; ++l ) { rel = rel.cyclicallyPermute( 1 ); for( int p=0 ; p<=rel.length() ; ++p ) { Word left = rel.initialSegment( p ); Word right = rel.terminalSegment( p ); rules.push_back( pair< Word , Word >( left , right ) ); rules.push_back( pair< Word , Word >( -left , -right ) ); } } } for( int i=0 ; i<ngens ; ++i ) { rules.push_back( pair< Word , Word >( Generator( i+1 ) , Generator( -i-1 ) ) ); rules.push_back( pair< Word , Word >( Generator(-i-1 ) , Generator( i+1 ) ) ); } int rule_num = rules.size( ); // 2. Construct a word using the rules Word result; while( result.length() < length ) { while( result.length() < length ) { int rn = RandLib::ur.irand( 0 , rule_num-1 ); result = rules[rn].first * result * rules[rn].second; } } return result; }