-
Notifications
You must be signed in to change notification settings - Fork 0
/
polynomial.cpp
125 lines (107 loc) · 4.1 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
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
#ifndef __POLYNOMIAL_CPP_
#define __POLYNOMIAL_CPP_
/*****************************************************************************\
* This file is part of DynGB. *
* *
* DynGB is free software: you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation, either version 2 of the License, or *
* (at your option) any later version. *
* *
* DynGB is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with DynGB. If not, see <http://www.gnu.org/licenses/>. *
\*****************************************************************************/
#include "polynomial.hpp"
Polynomial_Iterator::~Polynomial_Iterator() {}
Polynomial_Ring & Abstract_Polynomial::base_ring() const { return R; }
const Prime_Field & Abstract_Polynomial::ground_field() const {
return R.ground_field();
}
unsigned Abstract_Polynomial::number_of_variables() const {
return R.number_of_variables();
}
bool Abstract_Polynomial::can_reduce(Abstract_Polynomial &other) const
{ return leading_monomial() | other.leading_monomial(); }
void Abstract_Polynomial::set_strategy(Poly_Strategy_Data * psd) { strat = psd; }
void Abstract_Polynomial::print(ostream & os) const { os << *this; }
void Abstract_Polynomial::println(ostream & os) const {
print(); os << endl;
}
ostream & operator << (ostream & os, const Abstract_Polynomial & p) {
if (p.is_zero())
os << "0 ";
else {
Polynomial_Iterator * pi = p.new_iterator();
while (!pi->fellOff()) {
if (pi->currMonomial().is_one() or not pi->currCoeff().is_one())
os << pi->currCoeff() << " * ";
//os << pi->currMonomial();
if (not pi->currMonomial().is_one())
pi->currMonomial().print(false, os, p.base_ring().name_list());
pi->moveRight();
if (!pi->fellOff()) os << " + ";
}
delete pi;
}
return os;
}
Mutable_Polynomial::~Mutable_Polynomial() { }
void Mutable_Polynomial::multiply_by_scalar(const Prime_Field_Element &a) {
Mutable_Polynomial_Iterator * pi = new_mutable_iterator();
while (!pi->fellOff()) {
Prime_Field_Element b = pi->currCoeff() * a;
pi->set_currCoeff(b);
pi->moveRight();
}
delete pi;
}
void Mutable_Polynomial::multiply_by_monomial(const Monomial &t) {
Mutable_Polynomial_Iterator * pi = new_mutable_iterator();
while (!pi->fellOff()) {
Monomial b = pi->currMonomial();
b *= t;
pi->set_currMonomial(b);
pi->moveRight();
}
delete pi;
}
void Mutable_Polynomial::reduce_by(const Abstract_Polynomial &p) {
while (p.can_reduce(*this)) {
Monomial u = leading_monomial();
u /= p.leading_monomial();
Prime_Field_Element a = leading_coefficient();
a *= p.leading_coefficient().inverse();
add_polynomial_multiple(a, u, p, true);
}
}
DEG_TYPE Abstract_Polynomial::standard_degree() const {
DEG_TYPE d = 0;
Polynomial_Iterator * pi = new_iterator();
while (not pi->fellOff()) {
if (pi->currMonomial().total_degree() > d)
d = pi->currMonomial().total_degree();
pi->moveRight();
}
delete pi;
return d;
}
DEG_TYPE Abstract_Polynomial::weighted_degree(const WT_TYPE * w) const {
if (w == nullptr) return standard_degree();
else {
DEG_TYPE d = 0;
Polynomial_Iterator * pi = new_iterator();
while (not pi->fellOff()) {
if (pi->currMonomial().weighted_degree(w) > d)
d = pi->currMonomial().weighted_degree(w);
pi->moveRight();
}
delete pi;
return d;
}
}
#endif