/
polynomial.cc
75 lines (67 loc) · 1.9 KB
/
polynomial.cc
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
#include "polynomial.h"
#include "TeXout.h"
//#include <ostream>
#include <boost/format.hpp>
using std::vector;
template <typename Container>
static int ssize(Container v) {
/* Return signed size */
return v.size();
}
Polynomial binpolytopoly(vector<int> bp, Polynomial x) {
if (x.size() == 0) {
Rational xcoef[2]{0, 1};
x = Polynomial(xcoef, 1);
}
if (bp.empty())
return {};
Polynomial top{1};
int div{1};
Polynomial result(bp[0]);
for (int i = 1; i < ssize(bp); ++i) {
top *= x;
x -= 1;
div *= i;
result += Rational(bp[i],div)*top;
}
return result;
}
/* Write the binomial-basis polynomial in bp to the Stream os.
* bp.v must be nonempty. */
template <typename Stream>
static Stream& bpout(Stream& os, binpolyTeX bp, boost::format fmt) {
if (bp.v.size() == 1)
return os << bp.v[0];
int i = ssize(bp.v) - 1;
if (bp.v[i] == -1)
os << '-';
else if (bp.v[i] != 1)
os << bp.v[i];
os << (fmt % bp.varname % i).str();
for (--i; i > 0; --i) {
if (bp.v[i] > 1)
os << " + " << bp.v[i] << (fmt % bp.varname % i).str();
else if (bp.v[i] == 1)
os << " + " << (fmt % bp.varname % i).str();
else if (bp.v[i] == -1)
os << " - " << (fmt % bp.varname % i).str();
else if (bp.v[i] < -1)
os << " - " << -bp.v[i] << (fmt % bp.varname % i).str();
}
if (bp.v[0] > 0)
os << " + " << bp.v[0];
else if (bp.v[0] < 0)
os << " - " << -bp.v[0];
return os;
}
TeXout& operator<<(TeXout& tex, binpolyTeX bp) {
if (bp.v.empty())
return tex;
tex.usepackage("amsmath");
return bpout(tex, bp, boost::format("\binom{%1%}{%2%}"));
}
std::ostream& operator<<(std::ostream& os, binpolyTeX bp) {
if (bp.v.empty())
return os;
return bpout(os, bp, boost::format("(%1% C %2%)"));
}