#include "util/rational.h"
#include "util/vector.h"
#include <iostream>
rational horner_eval(const vector<rational>& coeffs, const rational& x) {
if (coeffs.empty()) return rational(0);
rational result = coeffs.back();
for (int i = coeffs.size() - 2; i >= 0; i--) {
result = result * x + coeffs[i];
}
return result;
}
void test_horner_basic_evaluation() {
std::cout << "test_horner_basic_evaluation\n";
vector<rational> coeffs;
coeffs.push_back(rational(5)); coeffs.push_back(rational(4)); coeffs.push_back(rational(3)); coeffs.push_back(rational(2));
rational x_val(2);
rational result = horner_eval(coeffs, x_val);
VERIFY(result == rational(41));
}
void test_horner_linear_polynomial() {
std::cout << "test_horner_linear_polynomial\n";
vector<rational> coeffs;
coeffs.push_back(rational(7)); coeffs.push_back(rational(3));
rational x_val(5);
rational result = horner_eval(coeffs, x_val);
VERIFY(result == rational(22));
}
void test_horner_constant_polynomial() {
std::cout << "test_horner_constant_polynomial\n";
vector<rational> coeffs;
coeffs.push_back(rational(42));
rational x_val(100);
rational result = horner_eval(coeffs, x_val);
VERIFY(result == rational(42));
}
void test_horner_zero_polynomial() {
std::cout << "test_horner_zero_polynomial\n";
vector<rational> coeffs;
coeffs.push_back(rational(0));
rational x_val(15);
rational result = horner_eval(coeffs, x_val);
VERIFY(result == rational(0));
}
void test_horner_negative_coefficients() {
std::cout << "test_horner_negative_coefficients\n";
vector<rational> coeffs;
coeffs.push_back(rational(-1)); coeffs.push_back(rational(3)); coeffs.push_back(rational(-2));
rational x_val(2);
rational result = horner_eval(coeffs, x_val);
VERIFY(result == rational(-3));
}
void test_horner_fractional_values() {
std::cout << "test_horner_fractional_values\n";
vector<rational> coeffs;
coeffs.push_back(rational(1, 3)); coeffs.push_back(rational(3, 4)); coeffs.push_back(rational(1, 2));
rational x_val(2, 3); rational result = horner_eval(coeffs, x_val);
VERIFY(result == rational(19, 18));
}
void test_horner_zero_evaluation_point() {
std::cout << "test_horner_zero_evaluation_point\n";
vector<rational> coeffs;
coeffs.push_back(rational(7)); coeffs.push_back(rational(2)); coeffs.push_back(rational(3)); coeffs.push_back(rational(5));
rational x_val(0);
rational result = horner_eval(coeffs, x_val);
VERIFY(result == rational(7));
}
void test_horner_high_degree() {
std::cout << "test_horner_high_degree\n";
vector<rational> coeffs;
for (int i = 0; i <= 5; i++) {
coeffs.push_back(rational(1));
}
rational x_val(1);
rational result = horner_eval(coeffs, x_val);
VERIFY(result == rational(6));
x_val = rational(-1);
result = horner_eval(coeffs, x_val);
VERIFY(result == rational(0));
}
void test_horner() {
test_horner_basic_evaluation();
test_horner_linear_polynomial();
test_horner_constant_polynomial();
test_horner_zero_polynomial();
test_horner_negative_coefficients();
test_horner_fractional_values();
test_horner_zero_evaluation_point();
test_horner_high_degree();
}
void tst_horner() {
test_horner();
}