00001 // Copyright (C) 2007 Alexander Ushakov 00002 // Contents: Definition of class ThompsonGroupFNormalForm 00003 // 00004 // Principal Authors: Alexander Ushakov 00005 // 00006 // Revision History: 00007 // 00008 00009 00010 #ifndef _ThompsonGroupFNormalForm_H_ 00011 #define _ThompsonGroupFNormalForm_H_ 00012 00013 00014 #include "Word.h" 00015 00016 00017 //---------------------------------------------------------------------------// 00018 //------------------------- ThompsonGroupFNormalForm ------------------------// 00019 //---------------------------------------------------------------------------// 00020 00021 00023 00029 class ThompsonGroupFNormalForm : protected Word 00030 { 00032 // // 00033 // Constructors // 00034 // // 00036 00037 public: 00038 00039 ThompsonGroupFNormalForm( ); 00040 00041 ThompsonGroupFNormalForm( const Word& w ); 00042 00043 00045 // // 00046 // Operators // 00047 // // 00049 00050 public: 00051 00052 bool operator== ( const ThompsonGroupFNormalForm& nf ) const { 00053 return (Word)*this==(Word)nf; 00054 } 00055 00056 00058 inline ThompsonGroupFNormalForm& operator *= ( const ThompsonGroupFNormalForm& nf ) { 00059 list< int > unit1 = getList( ); 00060 list< int > unit2 = nf.getList( ); 00061 list< Generator > new_unit = mergeUnits( unit1 , unit2 ); 00062 *this = removeBadPairs( new_unit ); 00063 return *this; 00064 } 00065 00066 00068 inline ThompsonGroupFNormalForm operator * ( const ThompsonGroupFNormalForm& nf ) const { 00069 list< int > unit1 = getList( ); 00070 list< int > unit2 = nf.getList( ); 00071 list< Generator > new_unit = mergeUnits( unit1 , unit2 ); 00072 return removeBadPairs( new_unit ); 00073 } 00074 00076 inline ThompsonGroupFNormalForm operator - ( ) const { 00077 return ThompsonGroupFNormalForm( -(Word)*this ); 00078 } 00079 00081 // // 00082 // Accessors // 00083 // // 00085 00086 public: 00087 00088 00090 // // 00091 // Internal functions // 00092 // // 00094 00095 private: 00096 00098 static Word semiNormalFormFor( const Word& w ); 00099 00101 static list< int > mergeUnits( list< int >& unit1 , list< int >& unit2 ); 00102 00104 static int nextOperation( int n1 , int n2 , int n3 , int n4 ); 00105 00107 static Word removeBadPairs( const Word& w ); 00108 00109 00111 // // 00112 // I/O // 00113 // // 00115 00116 friend ostream& operator << ( ostream& os , const ThompsonGroupFNormalForm& nf ); 00117 00118 00120 // // 00121 // Data members // 00122 // // 00124 00125 private: 00126 00127 00128 00129 }; 00130 00131 00132 #endif