27 void normalize(Container<Number>& p,
const Number& epsilon = std::numeric_limits<Number>::epsilon()) {
29 return p.push_back(0);
31 auto p_start = std::find_if(p.begin(), p.end(), [&epsilon](Number v) { return std::abs(v) > epsilon; });
32 if (p_start == p.end()) {
35 if (p_start > p.begin()) {
36 p.erase(p.begin(), p_start);
56 Container<Number>
mul(
const Container<Number>& p1,
const Container<Number>& p2) {
57 if (p1.empty() || p2.empty()) {
60 Container<Number> result(p1.size() + p2.size() - 1);
61 for (
SizeT i = 0; i < p1.size(); ++i) {
62 for (
SizeT j = 0; j < p2.size(); ++j) {
63 result[i+j] += p1[i] * p2[j];
90 std::pair<Container<Number>,Container<Number>>
div(
const Container<Number>& dividend,
const Container<Number>& divisor,
const Number& epsilon = std::numeric_limits<Number>::epsilon()) {
91 const auto divisor_start = std::find_if(divisor.begin(), divisor.end(), [&epsilon](Number v) { return std::abs(v) > epsilon; });
93 if (divisor_start == divisor.end() || dividend.size() < divisor.size()) {
94 return {{}, dividend};
97 const auto divisor_start_idx = divisor_start - divisor.begin();
99 const auto n = dividend.size();
100 const auto m = divisor.size() - divisor_start_idx;
102 Container<Number> quotient(n - m + 1, 0);
103 Container<Number> remainder = dividend;
105 for (
SizeT i = 0; i <= n - m; ++i) {
106 const Number factor = remainder[i] / divisor[divisor_start_idx];
107 quotient[i] = factor;
108 for (
SizeT j = 0; j < m; ++j) {
109 remainder[i+j] -= factor * divisor[divisor_start_idx+j];
113 remainder.erase(remainder.begin(), remainder.end() - m + 1);
114 return {quotient, remainder};
void normalize(Container< Number > &p, const Number &epsilon=std::numeric_limits< Number >::epsilon())
Normalizes a polynomial by removing leading zero coefficients.
Definition poly.h:27
std::pair< Container< Number >, Container< Number > > div(const Container< Number > ÷nd, const Container< Number > &divisor, const Number &epsilon=std::numeric_limits< Number >::epsilon())
Divides one polynomial by another.
Definition poly.h:90