18bool vequal(
const std::vector<std::complex<double>> v1,
const std::vector<std::complex<double>> v2,
bool t) {
19 std::vector<int> vv1, vv2, r;
20 for (
const auto& i: v1) {vv1.push_back((((t ? i.real() : i.imag()) >= 0) ? std::ceil(t ? i.real() : i.imag()) : std::floor(t ? i.real() : i.imag())));}
21 for (
const auto& i: v2) {vv2.push_back((((t ? i.real() : i.imag()) >= 0) ? std::ceil(t ? i.real() : i.imag()) : std::floor(t ? i.real() : i.imag())));}
22 set::sort(vv1); set::sort(vv2);
return set::sdiff(vv1, vv2).empty();
34 assert((md.
get_coeff() == 0) &&
"Error on default Monomial constructor: coeff is not default!");
35 assert((md.
get_degree() == 0) &&
"Error on default Monomial constructor: degree is not default!");
38 assert((mn.
get_coeff() == 1) &&
"Error on normal Monomial constructor: coeff is not coeff!");
39 assert((mn.
get_degree() == 1) &&
"Error on normal Monomial constructor: degree is not degree!");
42 assert((mc.
get_coeff() == 1) &&
"Error on copy Monomial constructor: coeff is not copy coeff!");
43 assert((mc.
get_degree() == 1) &&
"Error on copy Monomial constructor: degree is not copy degree!");
46 assert((mm.
get_coeff() == 2) &&
"Error on move Monomial constructor: coeff is not move coeff!");
47 assert((mm.
get_degree() == 2) &&
"Error on move Monomial constructor: degree is not move degree!");
53 assert((mc.
get_coeff() == 2) &&
"Error on copy assigment operator: coeff is not copy coeff!");
54 assert((mc.
get_degree() == 2) &&
"Error on copy assigment operator: degree is not copy degree!");
57 assert((mm.
get_coeff() == 3) &&
"Error on move assigment operator: coeff is not move coeff!");
58 assert((mm.
get_degree() == 3) &&
"Error on move assigment operator: degree is not move degree!");
64 assert((m1 == m1) && (m1 ==
Monomial(1, 1)) && (
Monomial(1, 1) == m1) && (
Monomial(1, 1) ==
Monomial(1, 1)) &&
"Error on equal operator: equal monomials are not diffent!");
65 assert((m1 != m2) && (m1 !=
Monomial(2, 2)) && (
Monomial(2, 2) != m1) && (
Monomial(1, 1) !=
Monomial(2, 2)) &&
"Error on equal operator: diffent monomials are not equal!");
74 Monomial m3(3, 3), m4(4, 4), mn3(-3, -3), mn4(-4, -4);
76 assert(((m3 + m4).get_coeff() == 3) && ((m3 + m4).get_degree() == 3) &&
"Error on addition operator: different degree monomials addition didnt return default value");
77 assert(((m3 + m3).get_coeff() == 6) && ((m3 + m3).get_degree() == 3) && ((
Monomial(3, 3) +
Monomial(3, 3)).get_coeff() == 6) && ((
Monomial(3, 3) +
Monomial(3, 3)).get_degree() == 3) &&
"Error on addition operator: positive values addition failed!");
78 assert(((mn3 + mn3).get_coeff() == -6) && ((mn3 + mn3).get_degree() == -3) && ((
Monomial(-3, -3) +
Monomial(-3, -3)).get_coeff() == -6) && ((
Monomial(-3, -3) +
Monomial(-3, -3)).get_degree() == -3) &&
"Error on addition operator: negative values addition failed!");
80 assert(((m3 - m4).get_coeff() == 3) && ((m3 - m4).get_degree() == 3) &&
"Error on substraction operator: different degree monomials substraction didnt return default value");
81 assert(((m3 - m3).get_coeff() == 0) && ((m3 - m3).get_degree() == 3) && ((
Monomial(3, 3) -
Monomial(3, 3)).get_coeff() == 0) && ((
Monomial(3, 3) -
Monomial(3, 3)).get_degree() == 3) &&
"Error on substraction operator: positive values substraction failed!");
82 assert(((mn3 - mn3).get_coeff() == 0) && ((mn3 - mn3).get_degree() == -3) && ((
Monomial(-3, -3) -
Monomial(-3, -3)).get_coeff() == 0) && ((
Monomial(-3, -3) -
Monomial(-3, -3)).get_degree() == -3) &&
"Error on substraction operator: negative values substraction failed!");
84 assert(((m3 * m4).get_coeff() == 12) && ((m3 * m4).get_degree() == 7) && ((
Monomial(3, 3) *
Monomial(4, 4)).get_coeff() == 12) && ((
Monomial(3, 3) *
Monomial(4, 4)).get_degree() == 7) &&
"Error on multiplication operator: positive values multiplication failed!");
85 assert(((mn3 * mn4).get_coeff() == 12) && ((mn3 * mn4).get_degree() == -7) && ((
Monomial(-3, -3) *
Monomial(-4, -4)).get_coeff() == 12) && ((
Monomial(-3, -3) *
Monomial(-4, -4)).get_degree() == -7) &&
"Error on multiplication operator: negative values multiplication failed!");
87 assert(((m3 /
Monomial(0, 0)).get_coeff() == 3) && ((m3 /
Monomial(0, 0)).get_degree() == 3) &&
"Error on division operator: divide by zero didnt return default value");
88 assert(((m3 / m4).get_coeff() == 0.75) && ((m3 / m4).get_degree() == -1) && ((
Monomial(3, 3) /
Monomial(4, 4)).get_coeff() == 0.75) && ((
Monomial(3, 3) /
Monomial(4, 4)).get_degree() == -1) &&
"Error on division operator: positive values division failed!");
89 assert(((mn3 / mn4).get_coeff() == 0.75) && ((mn3 / mn4).get_degree() == 1) && ((
Monomial(-3, -3) /
Monomial(-4, -4)).get_coeff() == 0.75) && ((
Monomial(-3, -3) /
Monomial(-4, -4)).get_degree() == 1) &&
"Error on division operator: negative values division failed!");
91 assert(((m3 %
Monomial(0, 0)).get_coeff() == 3) && ((m3 %
Monomial(0, 0)).get_degree() == 3) &&
"Error on modulus operator: divide by zero didnt return default value");
92 assert(((m4 % m3).get_coeff() == 1) && ((m4 % m3).get_degree() == 1) && ((
Monomial(4, 4) %
Monomial(3, 3)).get_coeff() == 1) && ((
Monomial(4, 4) %
Monomial(3, 3)).get_degree() == 1) &&
"Error on modulus operator: positive values modulus failed!");
93 assert(((mn4 % mn3).get_coeff() == -1) && ((mn4 % mn3).get_degree() == -1) && ((
Monomial(-4, -4) %
Monomial(-3, -3)).get_coeff() == -1) && ((
Monomial(-4, -4) %
Monomial(-3, -3)).get_degree() == -1) &&
"Error on modulus operator: negative values modulus failed!");
97 std::stringstream ss, sss;
99 assert(((ss << m5).str() ==
"5x^5") && ((sss << mn5).str() ==
"-5x^-5") &&
"Error on stream operator!");
104 assert((m5.get_expression() ==
"5x^5") && (mn5.
get_expression() ==
"-5x^-5") &&
"Error on expression getter!");
106 assert((m5.get_value(2) == 160) && (mn5.
get_value(2) == -0.15625) &&
"Error on value getter!");
108 std::cout <<
"Monomial tests passed!" << std::endl;
121 assert((pd.
get_monomials().crbegin()->second.get_coeff() == 0) &&
"Error on default Polynomial constructor: monomial coeff is not default!");
122 assert((pd.
get_monomials().crbegin()->second.get_degree() == 0) &&
"Error on default Polynomial constructor: monomial degree is not default!");
125 assert((pn.
get_monomials().crbegin()->second.get_coeff() == 1) &&
"Error on normal Polynomial constructor: monomial coeff is not coeff!");
126 assert((pn.
get_monomials().crbegin()->second.get_degree() == 1) &&
"Error on normal Polynomial constructor: monomial degree is not degree!");
127 assert((pn.
get_degree() == 1) &&
"Error on normal Polynomial constructor: polynomial degree is not degree!");
130 assert((pl.get_monomials().crbegin()->second.get_coeff() == 2) &&
"Error on list Polynomial constructor: last monomial coeff is not coeff!");
131 assert((pl.get_monomials().crbegin()->second.get_degree() == 2) &&
"Error on list Polynomial constructor: last monomial degree is not degree!");
132 assert((pl.get_monomials().cbegin()->second.get_coeff() == 1) &&
"Error on list Polynomial constructor: first monomial coeff is not coeff!");
133 assert((pl.get_monomials().cbegin()->second.get_degree() == 1) &&
"Error on list Polynomial constructor: first monomial degree is not degree!");
134 assert((pl.get_degree() == 2) &&
"Error on list Polynomial constructor: polynomial degree is not degree!");
137 assert((pv.
get_monomials().crbegin()->second.get_coeff() == 2) &&
"Error on vector Polynomial constructor: last monomial coeff is not coeff!");
138 assert((pv.
get_monomials().crbegin()->second.get_degree() == 2) &&
"Error on vector Polynomial constructor: last monomial degree is not degree!");
139 assert((pv.
get_monomials().cbegin()->second.get_coeff() == 1) &&
"Error on vector Polynomial constructor: first monomial coeff is not coeff!");
140 assert((pv.
get_monomials().cbegin()->second.get_degree() == 1) &&
"Error on vector Polynomial constructor: first monomial degree is not degree!");
141 assert((pv.
get_degree() == 2) &&
"Error on vector Polynomial constructor: polynomial degree is not degree!");
144 assert((pc.
get_monomials().crbegin()->second.get_coeff() == 1) &&
"Error on copy Polynomial constructor: coeff is not copy coeff!");
145 assert((pc.
get_monomials().crbegin()->second.get_degree() == 1) &&
"Error on copy Polynomial constructor: degree is not copy degree!");
146 assert((pc.
get_degree() == 1) &&
"Error on copy Polynomial constructor: polynomial degree is not copy degree!");
149 assert((pm.get_monomials().crbegin()->second.get_coeff() == 2) &&
"Error on move Polynomial constructor: coeff is not move coeff!");
150 assert((pm.get_monomials().crbegin()->second.get_degree() == 2) &&
"Error on move Polynomial constructor: degree is not move degree!");
151 assert((pm.get_degree() == 2) &&
"Error on move Polynomial constructor: polynomial degree is not move degree!");
157 assert((pc.
get_monomials().crbegin()->second.get_coeff() == 2) &&
"Error on copy assigment operator: coeff is not copy coeff!");
158 assert((pc.
get_monomials().crbegin()->second.get_degree() == 2) &&
"Error on copy assigment operator: degree is not copy degree!");
159 assert((pc.
get_degree() == 2) &&
"Error on copy assigment operator: polynomial degree is not copy degree!");
162 assert((pm.get_monomials().crbegin()->second.get_coeff() == 3) &&
"Error on move assigment operator: coeff is not move coeff!");
163 assert((pm.get_monomials().crbegin()->second.get_degree() == 3) &&
"Error on move assigment operator: degree is not move degree!");
164 assert((pm.get_degree() == 3) &&
"Error on move assigment operator: polynomial degree is not move degree!");
168 const Polynomial p2(std::map<int, Monomial>({{1,
Monomial(1, 1)}, {2,
Monomial(2, 2)}})), p4(std::map<int, Monomial>({{3,
Monomial(3, 3)}, {4,
Monomial(4, 4)}}));
170 assert((p2 == p2) && (p2 ==
Polynomial(std::map<int, Monomial>({{1,
Monomial(1, 1)}, {2,
Monomial(2, 2)}}))) && (
Polynomial(std::map<int, Monomial>({{1,
Monomial(1, 1)}, {2,
Monomial(2, 2)}})) == p2) && (
Polynomial(std::map<int, Monomial>({{1,
Monomial(1, 1)}, {2,
Monomial(2, 2)}})) ==
Polynomial(std::map<int, Monomial>({{1,
Monomial(1, 1)}, {2,
Monomial(2, 2)}}))) &&
"Error on equal operator: equal monomials are not diffent!");
171 assert((p2 != p4) && (p2 !=
Polynomial(std::map<int, Monomial>({{3,
Monomial(3, 3)}, {4,
Monomial(4, 4)}}))) && (
Polynomial(std::map<int, Monomial>({{3,
Monomial(3, 3)}, {4,
Monomial(4, 4)}})) != p2) && (
Polynomial(std::map<int, Monomial>({{1,
Monomial(1, 1)}, {2,
Monomial(2, 2)}})) !=
Polynomial(std::map<int, Monomial>({{3,
Monomial(3, 3)}, {4,
Monomial(4, 4)}}))) &&
"Error on equal operator: diffent monomials are not equal!");
173 assert((p4 > p2) && (p4 >
Polynomial(std::map<int, Monomial>({{1,
Monomial(1, 1)}, {2,
Monomial(2, 2)}}))) && (
Polynomial(std::map<int, Monomial>({{3,
Monomial(3, 3)}, {4,
Monomial(4, 4)}})) > p2) && (
Polynomial(std::map<int, Monomial>({{3,
Monomial(3, 3)}, {4,
Monomial(4, 4)}})) >
Polynomial(std::map<int, Monomial>({{1,
Monomial(1, 1)}, {2,
Monomial(2, 2)}}))) &&
"Error on greater monomial operator!");
174 assert((p2 < p4) && (p2 <
Polynomial(std::map<int, Monomial>({{3,
Monomial(3, 3)}, {4,
Monomial(4, 4)}}))) && (
Polynomial(std::map<int, Monomial>({{1,
Monomial(1, 1)}, {2,
Monomial(2, 2)}})) < p4) && (
Polynomial(std::map<int, Monomial>({{1,
Monomial(1, 1)}, {2,
Monomial(2, 2)}})) <
Polynomial(std::map<int, Monomial>({{3,
Monomial(3, 3)}, {4,
Monomial(4, 4)}}))) &&
"Error on lesser monomial operator!");
175 assert((p4 >= p2 && p4 >= p4) && (p4 >=
Polynomial(std::map<int, Monomial>({{1,
Monomial(1, 1)}, {2,
Monomial(2, 2)}})) && p4 >=
Polynomial(std::map<int, Monomial>({{3,
Monomial(3, 3)}, {4,
Monomial(4, 4)}}))) && (
Polynomial(std::map<int, Monomial>({{3,
Monomial(3, 3)}, {4,
Monomial(4, 4)}})) >= p2 &&
Polynomial(std::map<int, Monomial>({{3,
Monomial(3, 3)}, {4,
Monomial(4, 4)}})) >= p4) && (
Polynomial(std::map<int, Monomial>({{3,
Monomial(3, 3)}, {4,
Monomial(4, 4)}})) >=
Polynomial(std::map<int, Monomial>({{1,
Monomial(1, 1)}, {2,
Monomial(2, 2)}})) &&
Polynomial(std::map<int, Monomial>({{3,
Monomial(3, 3)}, {4,
Monomial(4, 4)}})) >=
Polynomial(std::map<int, Monomial>({{3,
Monomial(3, 3)}, {4,
Monomial(4, 4)}}))) &&
"Error on greater or equal monomial operator!");
176 assert((p2 <= p4 && p2 <= p2) && (p2 <=
Polynomial(std::map<int, Monomial>({{3,
Monomial(3, 3)}, {4,
Monomial(4, 4)}})) && p2 <= Polynomial(std::map<int, Monomial>({{1,
Monomial(1, 1)}, {2,
Monomial(2, 2)}}))) && (
Polynomial(std::map<int, Monomial>({{1,
Monomial(1, 1)}, {2,
Monomial(2, 2)}})) <= p4 &&
Polynomial(std::map<int, Monomial>({{1,
Monomial(1, 1)}, {2,
Monomial(2, 2)}})) <= p2) && (
Polynomial(std::map<int, Monomial>({{1,
Monomial(1, 1)}, {2,
Monomial(2, 2)}})) <=
Polynomial(std::map<int, Monomial>({{3,
Monomial(3, 3)}, {4,
Monomial(4, 4)}})) &&
Polynomial(std::map<int, Monomial>({{1,
Monomial(1, 1)}, {2,
Monomial(2, 2)}})) >=
Polynomial(std::map<int, Monomial>({{1,
Monomial(1, 1)}, {2,
Monomial(2, 2)}}))) &&
"Error on lesser or equal monomial operator!");
180 Polynomial pn1(std::map<int, Monomial>({{1,
Monomial(2, 1)}, {2,
Monomial(2, 2)}})), pn3(std::map<int, Monomial>({{1,
Monomial(2, 1)}, {3,
Monomial(3, 3)}}));
182 assert(pn1 + pn3 ==
Polynomial(std::map<int, Monomial>({{1,
Monomial(4, 1)}, {2,
Monomial(2, 2)}, {3,
Monomial(3, 3)}})) &&
"Error on addition operator: wrong results");
184 assert(pn1 - pn3 ==
Polynomial(std::map<int, Monomial>({{2,
Monomial(2, 2)}, {3,
Monomial(-3, 3)}})) &&
"Error on substraction operator: wrong results");
186 assert(pn1 * pn3 ==
Polynomial(std::map<int, Monomial>({{2,
Monomial(4, 2)}, {3,
Monomial(4, 3)}, {4,
Monomial(6, 4)}, {5,
Monomial(6, 5)}})) &&
"Error on multiplication operator: wrong results");
188 assert(pn3 / pn1 ==
Polynomial(std::map<int, Monomial>({{0,
Monomial(-1.5, 0)}, {1,
Monomial(1.5, 1)}})) &&
"Error on division operator: wrong results");
190 assert(pn3 % pn1 ==
Polynomial(std::map<int, Monomial>({{1,
Monomial(5, 1)}})) &&
"Error on modulus operator: wrong results");
194 std::stringstream ss;
196 assert(((ss << ps).str() == std::string(
"x^2 + x + 1")) &&
"Error on stream operator!");
201 assert((ps.
get_expression() == std::string(
"x^2 + x + 1")) &&
"Error on expression getter!");
214 assert(
vequal(prr.
get_roots(), std::vector<std::complex<double>>({{1, 0}, {-1, 0}}),
true) &&
"Error on real roots getter!");
215 assert(
vequal(prc.get_roots(), std::vector<std::complex<double>>({{0, 1}, {0, -1}}),
false) &&
"Error on complex roots getter!");
217 std::cout <<
"Polynomial tests passed!" << std::endl;
Class for representing and operating monomials.
int get_degree() const noexcept
Getter function for getting the degree of the Monomial.
std::string get_expression() const noexcept
Getter function for getting the expression of the Monomial.
double get_value(const double &x) const noexcept
Calculus function for getting the value of the Monomial at a point.
double get_coeff() const noexcept
Getter function for getting the coefficient of the Monomial.
Class for representing and operating polynomials.
std::map< int, Monomial > get_monomials() const noexcept
Getter function for getting the monomials of the Polynomial.
Polynomial get_derivative() const noexcept
Calculus function for getting the derivative of the Polynomial.
double get_value(const double &x) const noexcept
Calculus function for getting the value of the Polynomial at a point.
std::string get_expression() const noexcept
Getter function for getting the expression of the Polynomial.
int get_degree() const noexcept
Getter function for getting the degree of the Polynomial.
Polynomial get_integral() const noexcept
Calculus function for getting the integral of the Polynomial.
std::vector< std::complex< double > > get_roots() const noexcept
Calculus function for getting all the real and complex roots of the Polynomial using the Eigen librar...
This is the main header file for the emath library.
Englobes all the classes and functions of the emath library.
bool vequal(const std::vector< std::complex< double > > v1, const std::vector< std::complex< double > > v2, bool t)
Checks if two vectors with std::complex items have the same items, even if not in the same order.
int test_monomial()
Runs all the monomial class tests.
int test_polynomial()
Runs all the polynomial class tests.
int main()
Calls the monomial and polynomial tests.