EMath++
Classes for mathematical concepts
Loading...
Searching...
No Matches
emath.cpp
Go to the documentation of this file.
1
7#include <cassert>
8#include <iostream>
9#include "emath.h"
10using namespace emth;
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();
23}
29 //--------------------------------------
30 // CONSTRUCTORS
31 //--------------------------------------
32 // Default constructor
33 Monomial md;
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!");
36 // Normal constructor
37 Monomial mn(1, 1);
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!");
40 // Copy constructor
41 Monomial mc(mn);
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!");
44 // Move constructor
45 Monomial mm(Monomial(2,2));
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!");
48 //--------------------------------------
49 // ASSIGMENT
50 //--------------------------------------
51 // Copy assigment
52 mc = mm;
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!");
55 // Move assigment
56 mm = Monomial(3, 3);
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!");
59 //--------------------------------------
60 // COMPARISON
61 //--------------------------------------
62 const Monomial m1(1, 1), m2(2, 2);
63 // Equality
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!");
66 // Size
67 assert((m2 > m1) && (m2 > Monomial(1, 1)) && (Monomial(2, 2) > m1) && (Monomial(2, 2) > Monomial(1, 1)) && "Error on greater monomial operator!");
68 assert((m1 < m2) && (m1 < Monomial(2, 2)) && (Monomial(1, 1) < m2) && (Monomial(1, 1) < Monomial(2, 2)) && "Error on lesser monomial operator!");
69 assert((m2 >= m1 && m2 >= m2) && (m2 >= Monomial(1, 1) && m2 >= Monomial(2, 2)) && (Monomial(2, 2) >= m1 && Monomial(2, 2) >= m2) && (Monomial(2, 2) >= Monomial(1, 1) && Monomial(2, 2) >= Monomial(2, 2)) && "Error on greater or equal monomial operator!");
70 assert((m1 <= m2 && m1 <= m1) && (m1 <= Monomial(2, 2) && m1 <= Monomial(1, 1)) && (Monomial(1, 1) <= m2 && Monomial(1, 1) <= m1) && (Monomial(1, 1) <= Monomial(2, 2) && Monomial(1, 1) >= Monomial(1, 1)) && "Error on lesser or equal monomial operator!");
71 //--------------------------------------
72 // ARITHMETIC
73 //--------------------------------------
74 Monomial m3(3, 3), m4(4, 4), mn3(-3, -3), mn4(-4, -4);
75 // Addition
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!");
79 // Substraction
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!");
83 // Multiplication
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!");
86 // Division
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!");
90 // Modulus
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!");
94 //--------------------------------------
95 // STREAM
96 //--------------------------------------
97 std::stringstream ss, sss;
98 Monomial m5(5, 5), mn5(-5, -5);
99 assert(((ss << m5).str() == "5x^5") && ((sss << mn5).str() == "-5x^-5") && "Error on stream operator!");
100 //--------------------------------------
101 // MISC
102 //--------------------------------------
103 // Expression getter
104 assert((m5.get_expression() == "5x^5") && (mn5.get_expression() == "-5x^-5") && "Error on expression getter!");
105 // Value getter
106 assert((m5.get_value(2) == 160) && (mn5.get_value(2) == -0.15625) && "Error on value getter!");
107 // Well done!
108 std::cout << "Monomial tests passed!" << std::endl;
109 return 0;
110}
116 //--------------------------------------
117 // CONSTRUCTORS
118 //--------------------------------------
119 // Default constructor
120 Polynomial pd;
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!");
123 // Normal constructor
124 Polynomial pn(std::map<int, Monomial>({{1, Monomial(1, 1)}}));
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!");
128 // List constructor
129 Polynomial pl({Monomial(1, 1), Monomial(2, 2)});
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!");
135 // Vector constructor
136 Polynomial pv(std::vector<Monomial>({Monomial(1, 1), Monomial(2, 2)}));
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!");
142 // Copy constructor
143 Polynomial pc(pn);
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!");
147 // Move constructor
148 Polynomial pm(Polynomial(std::map<int, Monomial>({{2, Monomial(2, 2)}})));
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!");
152 //--------------------------------------
153 // ASSIGMENT
154 //--------------------------------------
155 // Copy assigment
156 pc = pm;
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!");
160 // Move assigment
161 pm = Polynomial(std::map<int, Monomial>({{3, Monomial(3, 3)}}));
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!");
165 //--------------------------------------
166 // COMPARISON
167 //--------------------------------------
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)}}));
169 // Equality
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!");
172 // Size
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!");
177 //--------------------------------------
178 // ARITHMETIC
179 //--------------------------------------
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)}}));
181 // Addition
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");
183 // Substraction
184 assert(pn1 - pn3 == Polynomial(std::map<int, Monomial>({{2, Monomial(2, 2)}, {3, Monomial(-3, 3)}})) && "Error on substraction operator: wrong results");
185 // Multiplication
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");
187 // Division
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");
189 // Modulus
190 assert(pn3 % pn1 == Polynomial(std::map<int, Monomial>({{1, Monomial(5, 1)}})) && "Error on modulus operator: wrong results");
191 //--------------------------------------
192 // STREAM
193 //--------------------------------------
194 std::stringstream ss;
195 const Polynomial ps(std::map<int, Monomial>({{0, Monomial(1, 0)}, {1, Monomial(1, 1)}, {2, Monomial(1, 2)}}));
196 assert(((ss << ps).str() == std::string("x^2 + x + 1")) && "Error on stream operator!"); //"x^2 + x + 1"
197 //--------------------------------------
198 // MISC
199 //--------------------------------------
200 // Expression getter
201 assert((ps.get_expression() == std::string("x^2 + x + 1")) && "Error on expression getter!");
202 // Value getter
203 assert((ps.get_value(1) == 3) && (ps.get_value(2) == 7) && "Error on value getter!");
204 //--------------------------------------
205 // CALCULUS
206 //--------------------------------------
207 const Polynomial prr(std::map<int, Monomial>({{0, Monomial(-1, 0)}, {2, Monomial(1, 2)}})); //"x^2 - 1"
208 const Polynomial prc(std::map<int, Monomial>({{0, Monomial(1, 0)}, {2, Monomial(1, 2)}})); //"x^2 + 1"
209 // Derivative getter
210 assert((ps.get_derivative() == Polynomial(std::map<int, Monomial>({{0, Monomial(1, 0)}, {1, Monomial(2, 1)}}))) && "Error on derivative getter!");
211 // Integral getter
212 assert((ps.get_integral() == Polynomial(std::map<int, Monomial>({{1, Monomial(1, 1)}, {2, Monomial(0.5, 2)}, {3, Monomial(1.0/3.0, 3)}}))) && "Error on integral getter!");
213 // Roots 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!");
216 // Well done!
217 std::cout << "Polynomial tests passed!" << std::endl;
218 return 0;
219}
224int main() {return test_monomial() + test_polynomial();}
Class for representing and operating monomials.
Definition: emath.h:187
int get_degree() const noexcept
Getter function for getting the degree of the Monomial.
Definition: emath.cpp:226
std::string get_expression() const noexcept
Getter function for getting the expression of the Monomial.
Definition: emath.cpp:241
double get_value(const double &x) const noexcept
Calculus function for getting the value of the Monomial at a point.
Definition: emath.cpp:247
double get_coeff() const noexcept
Getter function for getting the coefficient of the Monomial.
Definition: emath.cpp:221
Class for representing and operating polynomials.
Definition: emath.h:392
std::map< int, Monomial > get_monomials() const noexcept
Getter function for getting the monomials of the Polynomial.
Definition: emath.cpp:473
Polynomial get_derivative() const noexcept
Calculus function for getting the derivative of the Polynomial.
Definition: emath.cpp:515
double get_value(const double &x) const noexcept
Calculus function for getting the value of the Polynomial at a point.
Definition: emath.cpp:506
std::string get_expression() const noexcept
Getter function for getting the expression of the Polynomial.
Definition: emath.cpp:500
int get_degree() const noexcept
Getter function for getting the degree of the Polynomial.
Definition: emath.cpp:468
Polynomial get_integral() const noexcept
Calculus function for getting the integral of the Polynomial.
Definition: emath.cpp:526
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...
Definition: emath.cpp:538
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.
Definition: emath.cpp:18
int test_monomial()
Runs all the monomial class tests.
Definition: emath.cpp:28
int test_polynomial()
Runs all the polynomial class tests.
Definition: emath.cpp:115
int main()
Calls the monomial and polynomial tests.
Definition: emath.cpp:224