30 #ifndef __POLYNOMIALS_H__ 31 #define __POLYNOMIALS_H__ 40 #ifdef _USE_LOCAL_GMP_ 54 template <
typename Type>
58 unsigned int iSize( iPolynomial.size( ) );
60 for(
unsigned int i( 0 ); i < iSize; i++ )
62 if( iPolynomial[i] != 0 )
66 cout << iPolynomial[i] << ( i ?
" * x" + string( i > 1 ?
"^" + to_string( i ) :
"" ) :
"" );
71 if( ( iPolynomial[i] != 1 && iPolynomial[i] != -1 ) || !i )
72 cout << ( iPolynomial[i] > 0 ?
" + " :
" - " ) <<
abs( iPolynomial[i] ) << ( i ?
" * x" + string( i > 1 ?
"^" + to_string( i ) :
"" ) :
"" );
74 cout << ( iPolynomial[i] > 0 ?
" + " :
" - " ) <<
"x" +
string( i > 1 ?
"^" + to_string( i ) :
"" );
84 template <
typename Type>
88 unsigned int iSize( iSymbol.size( ) );
91 for(
unsigned int i( 0 ); i < iSize; i++ )
95 for(
unsigned int j(0); j < iSymbol[i]; j++ )
97 cout << ( bFirst ?
"" :
"," ) << i;
110 template <
typename Type>
113 vector< Type > iPolynomialBackup( iPolynomial );
114 unsigned int iPolynomialDegree( iPolynomial.size( ) - 1 );
116 for(
unsigned int i( 1 ); i < iSymbol - 1; i++ )
117 iPolynomial.push_back( 0 );
118 iPolynomial.push_back( iPolynomial[ iPolynomialDegree ] );
120 if( iPolynomialDegree < iSymbol )
122 for(
unsigned int i( 1 ); i <= iPolynomialDegree; i++ )
123 iPolynomial[i] = iPolynomial[ i - 1 ] + iPolynomialBackup[i];
125 fill( iPolynomial.begin( ) + iPolynomialDegree + 1, iPolynomial.end( ) - iPolynomialDegree, iPolynomial[ iPolynomialDegree ] );
127 for(
unsigned int i( 1 ); i <= iPolynomialDegree ; i++ )
128 iPolynomial[ iPolynomialDegree + iSymbol - i - 1 ] = iPolynomial[ iPolynomialDegree + iSymbol - i ] + iPolynomialBackup[ iPolynomialDegree - i ];
132 for(
unsigned int i( 1 ); i < iSymbol; i++ )
133 iPolynomial[i] = iPolynomial[ i - 1 ] + iPolynomialBackup[i];
135 for(
unsigned int i( iSymbol ); i < iPolynomialDegree; i++ )
136 iPolynomial[i] = iPolynomial[i-1] - iPolynomialBackup[i-iSymbol] + iPolynomialBackup[i];
138 for(
unsigned int i( 1 ); i < iSymbol && i <= iPolynomialDegree ; i++ )
139 iPolynomial[ iPolynomialDegree + iSymbol - i - 1 ] = iPolynomial[ iPolynomialDegree + iSymbol - i ] + iPolynomialBackup[ iPolynomialDegree - i ];
143 template <
typename Type>
146 unsigned int iPolynomialDegree( iPolynomial.size( ) - 1 );
149 while( iPolynomial[ iPolynomialDegree ] == 0 )
152 vector< Type > iWorking( iPolynomial.begin( ), iPolynomial.begin( ) + iPolynomialDegree + 1 );
153 vector< Type > iQuotient;
158 if( iPolynomialDegree < iSymbol - 1 )
161 while( iPolynomialDegree >= iSymbol )
163 iTemp = iWorking[ iPolynomialDegree ];
164 iQuotient.insert( iQuotient.begin( ), iTemp );
166 for( i = 0; i < iSymbol; i++ )
167 iWorking[ iPolynomialDegree - i ] -= iTemp;
171 while( iWorking[ iPolynomialDegree ] == 0 && iPolynomialDegree >= 1 )
173 iQuotient.insert( iQuotient.begin( ), 0 );
178 if( iPolynomialDegree < iSymbol - 1 )
180 for( i = 0; i <= iPolynomialDegree; i++ )
182 if( iWorking[i] != 0 )
187 iTemp = iWorking[ iPolynomialDegree ];
188 iQuotient.insert( iQuotient.begin( ), iTemp );
190 for( i = 0; i < iPolynomialDegree; i++ )
192 if( iWorking[i] != iTemp )
196 iPolynomial = iQuotient;
208 template <
typename Type>
211 unsigned int dN( iNumerator.size( ) - 1 ), dD( iDenominator.size( ) - 1 );
213 if( dN < dD || ( dD == 0 && iDenominator[0] != 0 ) )
216 vector< Type > iWorking( iNumerator ), iQuotient;
223 if( iWorking[ dN ] % iDenominator[ dD ] != 0 )
226 iTemp = iWorking[ dN ] / iDenominator[ dD ];
227 iQuotient.insert( iQuotient.begin( ), iTemp );
229 for( i = 0; i <= dD; i++ )
230 iWorking[dN - i] -= iTemp * iDenominator[dD - i];
234 while( iWorking[ dN ] == 0 && dN >= 1 && dN >= dD )
236 iQuotient.insert( iQuotient.begin( ), 0 );
241 for( i = 0; i <= dN; i++ )
243 if( iWorking[i] != 0 )
247 iNumerator = iQuotient;
bool dividePolynomialBySymbol(vector< Type > &iPolynomial, const unsigned int &iSymbol)
Definition: polynomials.h:144
T abs(const T &r)
Definition: rational.h:98
void polynomialDisplay(const vector< Type > &iPolynomial)
Definition: polynomials.h:55
void symbolDisplay(const vector< Type > &iSymbol)
Definition: polynomials.h:85
bool dividePolynomialByPolynomial(vector< Type > &iNumerator, const vector< Type > &iDenominator)
Definition: polynomials.h:209
vector< vector< mpz_class > > iCyclotomicPolynomials
List of some cyclotomic polynomials (we want to be able to multiply/divide with the growth series so ...
Definition: polynomials.cpp:27
void polynomialDotSymbol(vector< Type > &iPolynomial, const unsigned int &iSymbol)
Definition: polynomials.h:111
Definition: polynomials.cpp:25