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.