-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathPolynomial.cpp
109 lines (90 loc) · 3.16 KB
/
Polynomial.cpp
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
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
#include "Polynomial.h"
void Polynomial::removeNullCoefficients(){
map <Monomial, ZZ_p>::iterator it = coef.begin();
while ( it != coef.end() ) {
if ( (*it).second == to_ZZ_p(0) ) coef.erase( it++ );
else it++;
}
}
// Begin input output
bool Polynomial::readStream(istream &in) {
bool first = true;
ZZ_p c;
bool ImplicitOne;
while ( readStream_(c, in , first, ImplicitOne) ) {
first = false;
Monomial mon;
in >> mon; // Potrebbe essere vuoto
if( ImplicitOne and mon.empty() ) {
// Vuol dire che ha praticamente letto solo il segno
break;
}
coef[mon] += c;
}
removeNullCoefficients();
return true;
}
void Polynomial::writeStream(ostream &out) const{
bool empty = true;
bool first = true;
vector < pair <Monomial, ZZ_p> > PrintOrder(coef.begin(), coef.end());
sort(PrintOrder.begin(),PrintOrder.end(), PrintCmpTerm);
for (vector < pair <Monomial, ZZ_p> >::iterator mon = PrintOrder.begin();mon!=PrintOrder.end();mon++ ) {
ZZ_p c = mon->second;
Monomial U = mon->first;
if ( c == to_ZZ_p(0) ) continue;
empty = false;
if ( U.empty() ) {
writeStream(c, out, first, false);
//c.writeStream(out, first, false);
//out << "+";
//if(c!=to_ZZ_p(1)) out<<c;
}
else{
writeStream(c, out, first, true);
//out<<"+";
//c.writeStream(out, first, true);
//if(c!=to_ZZ_p(1)) out<<c;
U.writeStream(out, true); //here U is always non empty
}
first = false;
}//end for
if ( empty ) out << "0";
}
void Polynomial::writeStreamWithGruppedMonomials(ostream &out, const vector <Monomial> &gruppingCoefficients) const{
Polynomial rest(*this);
for(unsigned int i=0;i<gruppingCoefficients.size();i++){
// decompose Polynomial into sum of two parts:
// one is divisible by monomial and second having no one monomial divisible by
if(i!=0) out <<"+";
Polynomial withMonom = rest.extractPartDivisibleBy(gruppingCoefficients[i]);
out<<gruppingCoefficients[i];
out<<"("<<withMonom<<")";
rest = rest - withMonom;
}
out<<rest;
}
void Polynomial::writeStream(ZZ_p &val, ostream &out, bool ImplicitSign, bool ImplicitOne) const{
if ( !ImplicitSign) out << '+';
if ( ImplicitOne ) {
if ( val != to_ZZ_p(1) ) out << val;
}
else out << val;
}
// Begin external functions
Polynomial pow(Polynomial &P, unsigned int e){
if ( e == 0 ) return Polynomial ("1");
if ( e == 1 ) return P;
Polynomial Q = pow(P, e / 2);
if ( e % 2 ) return P * Q * Q;
return Q * Q;
}
// S-polynomial
Polynomial SPolynomial(Polynomial const &P, Polynomial const &Q){
Monomial leadingLcm = lcm(P.leadingMonomial(), Q.leadingMonomial());
Monomial coefP = leadingLcm / P.leadingMonomial();
Monomial coefQ = leadingLcm / Q.leadingMonomial();
Polynomial coefP2 = Polynomial(coefP) / P.leadingCoefficient();
Polynomial coefQ2 = Polynomial(coefQ) / Q.leadingCoefficient();
return coefP2*P-coefQ2*Q;
}