コード例 #1
0
ファイル: FPGroup.cpp プロジェクト: dpantele/crag
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;
}
コード例 #2
0
ファイル: AbelianWord.C プロジェクト: koudonojinchuu/magnus
void AbelianWordRep::printOn( ostream& ostr ) const
{
  ostr << "[";
  for( int i = 0; i < numberOfGenerators(); ++i )
    ostr << " " << i+1 << "^" << thePowers[i];
  ostr << " ]";
}
コード例 #3
0
ファイル: FPGroup.cpp プロジェクト: dpantele/crag
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;
}