3 <meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
4 <title>Polynomials</title>
5 <link rel="stylesheet" href="../math.css" type="text/css">
6 <meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
7 <link rel="home" href="../index.html" title="Math Toolkit 2.11.0">
8 <link rel="up" href="../poly.html" title="Chapter 11. Polynomials and Rational Functions">
9 <link rel="prev" href="../poly.html" title="Chapter 11. Polynomials and Rational Functions">
10 <link rel="next" href="rational.html" title="Polynomial and Rational Function Evaluation">
12 <body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
13 <table cellpadding="2" width="100%"><tr>
14 <td valign="top"><img alt="Boost C++ Libraries" width="277" height="86" src="../../../../../boost.png"></td>
15 <td align="center"><a href="../../../../../index.html">Home</a></td>
16 <td align="center"><a href="../../../../../libs/libraries.htm">Libraries</a></td>
17 <td align="center"><a href="http://www.boost.org/users/people.html">People</a></td>
18 <td align="center"><a href="http://www.boost.org/users/faq.html">FAQ</a></td>
19 <td align="center"><a href="../../../../../more/index.htm">More</a></td>
22 <div class="spirit-nav">
23 <a accesskey="p" href="../poly.html"><img src="../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../poly.html"><img src="../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../index.html"><img src="../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="rational.html"><img src="../../../../../doc/src/images/next.png" alt="Next"></a>
26 <div class="titlepage"><div><div><h2 class="title" style="clear: both">
27 <a name="math_toolkit.polynomials"></a><a class="link" href="polynomials.html" title="Polynomials">Polynomials</a>
28 </h2></div></div></div>
30 <a name="math_toolkit.polynomials.h0"></a>
31 <span class="phrase"><a name="math_toolkit.polynomials.synopsis"></a></span><a class="link" href="polynomials.html#math_toolkit.polynomials.synopsis">Synopsis</a>
33 <pre class="programlisting"><span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">math</span><span class="special">/</span><span class="identifier">tools</span><span class="special">/</span><span class="identifier">polynomial</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span>
35 <pre class="programlisting"><span class="keyword">namespace</span> <span class="identifier">boost</span> <span class="special">{</span> <span class="keyword">namespace</span> <span class="identifier">math</span> <span class="special">{</span>
36 <span class="keyword">namespace</span> <span class="identifier">tools</span> <span class="special">{</span>
38 <span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">T</span><span class="special">></span>
39 <span class="keyword">class</span> <span class="identifier">polynomial</span>
40 <span class="special">{</span>
41 <span class="keyword">public</span><span class="special">:</span>
42 <span class="comment">// typedefs:</span>
43 <span class="keyword">typedef</span> <span class="keyword">typename</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">vector</span><span class="special"><</span><span class="identifier">T</span><span class="special">>::</span><span class="identifier">value_type</span> <span class="identifier">value_type</span><span class="special">;</span>
44 <span class="keyword">typedef</span> <span class="keyword">typename</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">vector</span><span class="special"><</span><span class="identifier">T</span><span class="special">>::</span><span class="identifier">size_type</span> <span class="identifier">size_type</span><span class="special">;</span>
46 <span class="comment">// construct:</span>
47 <span class="identifier">polynomial</span><span class="special">(){}</span>
48 <span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">U</span><span class="special">></span>
49 <span class="identifier">polynomial</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">U</span><span class="special">*</span> <span class="identifier">data</span><span class="special">,</span> <span class="keyword">unsigned</span> <span class="identifier">order</span><span class="special">);</span>
50 <span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">I</span><span class="special">></span>
51 <span class="identifier">polynomial</span><span class="special">(</span><span class="identifier">I</span> <span class="identifier">first</span><span class="special">,</span> <span class="identifier">I</span> <span class="identifier">last</span><span class="special">);</span>
52 <span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">U</span><span class="special">></span>
53 <span class="keyword">explicit</span> <span class="identifier">polynomial</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">U</span><span class="special">&</span> <span class="identifier">point</span><span class="special">,</span>
54 <span class="keyword">typename</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">enable_if</span><span class="special"><</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">is_convertible</span><span class="special"><</span><span class="identifier">U</span><span class="special">,</span> <span class="identifier">T</span><span class="special">></span> <span class="special">>::</span><span class="identifier">type</span><span class="special">*</span> <span class="special">=</span> <span class="number">0</span><span class="special">);</span>
55 <span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">Range</span><span class="special">></span>
56 <span class="keyword">explicit</span> <span class="identifier">polynomial</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">Range</span><span class="special">&</span> <span class="identifier">r</span><span class="special">,</span>
57 <span class="keyword">typename</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">enable_if</span><span class="special"><</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">math</span><span class="special">::</span><span class="identifier">tools</span><span class="special">::</span><span class="identifier">detail</span><span class="special">::</span><span class="identifier">is_const_iterable</span><span class="special"><</span><span class="identifier">Range</span><span class="special">></span> <span class="special">>::</span><span class="identifier">type</span><span class="special">*</span> <span class="special">=</span> <span class="number">0</span><span class="special">);</span> <span class="comment">// C++14</span>
58 <span class="identifier">polynomial</span><span class="special">(</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">initializer_list</span><span class="special"><</span><span class="identifier">T</span><span class="special">></span> <span class="identifier">l</span><span class="special">);</span> <span class="comment">// C++11</span>
60 <span class="identifier">polynomial</span><span class="special">(</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">vector</span><span class="special"><</span><span class="identifier">T</span><span class="special">>&&</span> <span class="identifier">p</span><span class="special">);</span>
62 <span class="comment">// access:</span>
63 <span class="identifier">size_type</span> <span class="identifier">size</span><span class="special">()</span><span class="keyword">const</span><span class="special">;</span>
64 <span class="identifier">size_type</span> <span class="identifier">degree</span><span class="special">()</span><span class="keyword">const</span><span class="special">;</span>
65 <span class="identifier">value_type</span><span class="special">&</span> <span class="keyword">operator</span><span class="special">[](</span><span class="identifier">size_type</span> <span class="identifier">i</span><span class="special">);</span>
66 <span class="keyword">const</span> <span class="identifier">value_type</span><span class="special">&</span> <span class="keyword">operator</span><span class="special">[](</span><span class="identifier">size_type</span> <span class="identifier">i</span><span class="special">)</span><span class="keyword">const</span><span class="special">;</span>
67 <span class="identifier">std</span><span class="special">::</span><span class="identifier">vector</span><span class="special"><</span><span class="identifier">T</span><span class="special">></span> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">data</span><span class="special">()</span> <span class="keyword">const</span><span class="special">;</span>
68 <span class="identifier">std</span><span class="special">::</span><span class="identifier">vector</span><span class="special"><</span><span class="identifier">T</span><span class="special">>&</span> <span class="identifier">data</span><span class="special">();</span>
69 <span class="keyword">explicit</span> <span class="keyword">operator</span> <span class="keyword">bool</span><span class="special">()</span> <span class="keyword">const</span><span class="special">;</span>
71 <span class="identifier">polynomial</span><span class="special"><</span><span class="identifier">T</span><span class="special">></span> <span class="identifier">prime</span><span class="special">()</span> <span class="keyword">const</span><span class="special">;</span>
73 <span class="identifier">polynomial</span><span class="special"><</span><span class="identifier">T</span><span class="special">></span> <span class="identifier">integrate</span><span class="special">()</span> <span class="keyword">const</span><span class="special">;</span>
75 <span class="identifier">T</span> <span class="keyword">operator</span><span class="special">()(</span><span class="identifier">T</span> <span class="identifier">z</span><span class="special">)</span> <span class="keyword">const</span><span class="special">;</span>
79 <span class="comment">// modify:</span>
80 <span class="keyword">void</span> <span class="identifier">set_zero</span><span class="special">();</span>
82 <span class="comment">// operators:</span>
83 <span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">U</span><span class="special">></span>
84 <span class="identifier">polynomial</span><span class="special">&</span> <span class="keyword">operator</span> <span class="special">+=(</span><span class="keyword">const</span> <span class="identifier">U</span><span class="special">&</span> <span class="identifier">value</span><span class="special">);</span>
85 <span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">U</span><span class="special">></span>
86 <span class="identifier">polynomial</span><span class="special">&</span> <span class="keyword">operator</span> <span class="special">-=(</span><span class="keyword">const</span> <span class="identifier">U</span><span class="special">&</span> <span class="identifier">value</span><span class="special">);</span>
87 <span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">U</span><span class="special">></span>
88 <span class="identifier">polynomial</span><span class="special">&</span> <span class="keyword">operator</span> <span class="special">*=(</span><span class="keyword">const</span> <span class="identifier">U</span><span class="special">&</span> <span class="identifier">value</span><span class="special">);</span>
89 <span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">U</span><span class="special">></span>
90 <span class="identifier">polynomial</span><span class="special">&</span> <span class="keyword">operator</span> <span class="special">/=(</span><span class="keyword">const</span> <span class="identifier">U</span><span class="special">&</span> <span class="identifier">value</span><span class="special">);</span>
91 <span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">U</span><span class="special">></span>
92 <span class="identifier">polynomial</span><span class="special">&</span> <span class="keyword">operator</span> <span class="special">%=(</span><span class="keyword">const</span> <span class="identifier">U</span><span class="special">&</span> <span class="identifier">value</span><span class="special">);</span>
93 <span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">U</span><span class="special">></span>
94 <span class="identifier">polynomial</span><span class="special">&</span> <span class="keyword">operator</span> <span class="special">+=(</span><span class="keyword">const</span> <span class="identifier">polynomial</span><span class="special"><</span><span class="identifier">U</span><span class="special">>&</span> <span class="identifier">value</span><span class="special">);</span>
95 <span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">U</span><span class="special">></span>
96 <span class="identifier">polynomial</span><span class="special">&</span> <span class="keyword">operator</span> <span class="special">-=(</span><span class="keyword">const</span> <span class="identifier">polynomial</span><span class="special"><</span><span class="identifier">U</span><span class="special">>&</span> <span class="identifier">value</span><span class="special">);</span>
97 <span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">U</span><span class="special">></span>
98 <span class="identifier">polynomial</span><span class="special">&</span> <span class="keyword">operator</span> <span class="special">*=(</span><span class="keyword">const</span> <span class="identifier">polynomial</span><span class="special"><</span><span class="identifier">U</span><span class="special">>&</span> <span class="identifier">value</span><span class="special">);</span>
99 <span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">U</span><span class="special">></span>
100 <span class="identifier">polynomial</span><span class="special">&</span> <span class="keyword">operator</span> <span class="special">/=(</span><span class="keyword">const</span> <span class="identifier">polynomial</span><span class="special"><</span><span class="identifier">U</span><span class="special">>&</span> <span class="identifier">value</span><span class="special">);</span>
101 <span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">U</span><span class="special">></span>
102 <span class="identifier">polynomial</span><span class="special">&</span> <span class="keyword">operator</span> <span class="special">%=(</span><span class="keyword">const</span> <span class="identifier">polynomial</span><span class="special"><</span><span class="identifier">U</span><span class="special">>&</span> <span class="identifier">value</span><span class="special">);</span>
103 <span class="special">};</span>
105 <span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">T</span><span class="special">></span>
106 <span class="identifier">polynomial</span><span class="special"><</span><span class="identifier">T</span><span class="special">></span> <span class="keyword">operator</span> <span class="special">+</span> <span class="special">(</span><span class="keyword">const</span> <span class="identifier">polynomial</span><span class="special"><</span><span class="identifier">T</span><span class="special">>&</span> <span class="identifier">a</span><span class="special">,</span> <span class="keyword">const</span> <span class="identifier">polynomial</span><span class="special"><</span><span class="identifier">T</span><span class="special">>&</span> <span class="identifier">b</span><span class="special">);</span>
107 <span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">T</span><span class="special">></span>
108 <span class="identifier">polynomial</span><span class="special"><</span><span class="identifier">T</span><span class="special">></span> <span class="keyword">operator</span> <span class="special">-</span> <span class="special">(</span><span class="keyword">const</span> <span class="identifier">polynomial</span><span class="special"><</span><span class="identifier">T</span><span class="special">>&</span> <span class="identifier">a</span><span class="special">,</span> <span class="keyword">const</span> <span class="identifier">polynomial</span><span class="special"><</span><span class="identifier">T</span><span class="special">>&</span> <span class="identifier">b</span><span class="special">);</span>
109 <span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">T</span><span class="special">></span>
110 <span class="identifier">polynomial</span><span class="special"><</span><span class="identifier">T</span><span class="special">></span> <span class="keyword">operator</span> <span class="special">*</span> <span class="special">(</span><span class="keyword">const</span> <span class="identifier">polynomial</span><span class="special"><</span><span class="identifier">T</span><span class="special">>&</span> <span class="identifier">a</span><span class="special">,</span> <span class="keyword">const</span> <span class="identifier">polynomial</span><span class="special"><</span><span class="identifier">T</span><span class="special">>&</span> <span class="identifier">b</span><span class="special">);</span>
111 <span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">T</span><span class="special">></span>
112 <span class="identifier">polynomial</span><span class="special"><</span><span class="identifier">T</span><span class="special">></span> <span class="keyword">operator</span> <span class="special">/</span> <span class="special">(</span><span class="keyword">const</span> <span class="identifier">polynomial</span><span class="special"><</span><span class="identifier">T</span><span class="special">>&</span> <span class="identifier">a</span><span class="special">,</span> <span class="keyword">const</span> <span class="identifier">polynomial</span><span class="special"><</span><span class="identifier">T</span><span class="special">>&</span> <span class="identifier">b</span><span class="special">);</span>
113 <span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">T</span><span class="special">></span>
114 <span class="identifier">polynomial</span><span class="special"><</span><span class="identifier">T</span><span class="special">></span> <span class="keyword">operator</span> <span class="special">%</span> <span class="special">(</span><span class="keyword">const</span> <span class="identifier">polynomial</span><span class="special"><</span><span class="identifier">T</span><span class="special">>&</span> <span class="identifier">a</span><span class="special">,</span> <span class="keyword">const</span> <span class="identifier">polynomial</span><span class="special"><</span><span class="identifier">T</span><span class="special">>&</span> <span class="identifier">b</span><span class="special">);</span>
116 <span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">T</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">U</span><span class="special">></span>
117 <span class="identifier">polynomial</span><span class="special"><</span><span class="identifier">T</span><span class="special">></span> <span class="keyword">operator</span> <span class="special">+</span> <span class="special">(</span><span class="keyword">const</span> <span class="identifier">polynomial</span><span class="special"><</span><span class="identifier">T</span><span class="special">>&</span> <span class="identifier">a</span><span class="special">,</span> <span class="keyword">const</span> <span class="identifier">U</span><span class="special">&</span> <span class="identifier">b</span><span class="special">);</span>
118 <span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">T</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">U</span><span class="special">></span>
119 <span class="identifier">polynomial</span><span class="special"><</span><span class="identifier">T</span><span class="special">></span> <span class="keyword">operator</span> <span class="special">-</span> <span class="special">(</span><span class="keyword">const</span> <span class="identifier">polynomial</span><span class="special"><</span><span class="identifier">T</span><span class="special">>&</span> <span class="identifier">a</span><span class="special">,</span> <span class="keyword">const</span> <span class="identifier">U</span><span class="special">&</span> <span class="identifier">b</span><span class="special">);</span>
120 <span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">T</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">U</span><span class="special">></span>
121 <span class="identifier">polynomial</span><span class="special"><</span><span class="identifier">T</span><span class="special">></span> <span class="keyword">operator</span> <span class="special">*</span> <span class="special">(</span><span class="keyword">const</span> <span class="identifier">polynomial</span><span class="special"><</span><span class="identifier">T</span><span class="special">>&</span> <span class="identifier">a</span><span class="special">,</span> <span class="keyword">const</span> <span class="identifier">U</span><span class="special">&</span> <span class="identifier">b</span><span class="special">);</span>
122 <span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">T</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">U</span><span class="special">></span>
123 <span class="identifier">polynomial</span><span class="special"><</span><span class="identifier">T</span><span class="special">></span> <span class="keyword">operator</span> <span class="special">/</span> <span class="special">(</span><span class="keyword">const</span> <span class="identifier">polynomial</span><span class="special"><</span><span class="identifier">T</span><span class="special">>&</span> <span class="identifier">a</span><span class="special">,</span> <span class="keyword">const</span> <span class="identifier">U</span><span class="special">&</span> <span class="identifier">b</span><span class="special">);</span>
124 <span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">T</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">U</span><span class="special">></span>
125 <span class="identifier">polynomial</span><span class="special"><</span><span class="identifier">T</span><span class="special">></span> <span class="keyword">operator</span> <span class="special">%</span> <span class="special">(</span><span class="keyword">const</span> <span class="identifier">polynomial</span><span class="special"><</span><span class="identifier">T</span><span class="special">>&</span> <span class="identifier">a</span><span class="special">,</span> <span class="keyword">const</span> <span class="identifier">U</span><span class="special">&</span> <span class="identifier">b</span><span class="special">);</span>
127 <span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">U</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">T</span><span class="special">></span>
128 <span class="identifier">polynomial</span><span class="special"><</span><span class="identifier">T</span><span class="special">></span> <span class="keyword">operator</span> <span class="special">+</span> <span class="special">(</span><span class="keyword">const</span> <span class="identifier">U</span><span class="special">&</span> <span class="identifier">a</span><span class="special">,</span> <span class="keyword">const</span> <span class="identifier">polynomial</span><span class="special"><</span><span class="identifier">T</span><span class="special">>&</span> <span class="identifier">b</span><span class="special">);</span>
129 <span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">U</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">T</span><span class="special">></span>
130 <span class="identifier">polynomial</span><span class="special"><</span><span class="identifier">T</span><span class="special">></span> <span class="keyword">operator</span> <span class="special">-</span> <span class="special">(</span><span class="keyword">const</span> <span class="identifier">U</span><span class="special">&</span> <span class="identifier">a</span><span class="special">,</span> <span class="keyword">const</span> <span class="identifier">polynomial</span><span class="special"><</span><span class="identifier">T</span><span class="special">>&</span> <span class="identifier">b</span><span class="special">);</span>
131 <span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">U</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">T</span><span class="special">></span>
132 <span class="identifier">polynomial</span><span class="special"><</span><span class="identifier">T</span><span class="special">></span> <span class="keyword">operator</span> <span class="special">*</span> <span class="special">(</span><span class="keyword">const</span> <span class="identifier">U</span><span class="special">&</span> <span class="identifier">a</span><span class="special">,</span> <span class="keyword">const</span> <span class="identifier">polynomial</span><span class="special"><</span><span class="identifier">T</span><span class="special">>&</span> <span class="identifier">b</span><span class="special">);</span>
134 <span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">T</span><span class="special">></span>
135 <span class="identifier">polynomial</span><span class="special"><</span><span class="identifier">T</span><span class="special">></span> <span class="keyword">operator</span> <span class="special">-</span> <span class="special">(</span><span class="keyword">const</span> <span class="identifier">polynomial</span><span class="special"><</span><span class="identifier">T</span><span class="special">>&</span> <span class="identifier">a</span><span class="special">);</span>
137 <span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">T</span><span class="special">></span>
138 <span class="identifier">polynomial</span><span class="special"><</span><span class="identifier">T</span><span class="special">></span> <span class="keyword">operator</span> <span class="special">>>=</span> <span class="special">(</span><span class="keyword">const</span> <span class="identifier">U</span><span class="special">&</span> <span class="identifier">a</span><span class="special">);</span>
139 <span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">T</span><span class="special">></span>
140 <span class="identifier">polynomial</span><span class="special"><</span><span class="identifier">T</span><span class="special">></span> <span class="keyword">operator</span> <span class="special">>></span> <span class="special">(</span><span class="identifier">polynomial</span><span class="special"><</span><span class="identifier">T</span><span class="special">></span> <span class="keyword">const</span> <span class="special">&</span><span class="identifier">a</span><span class="special">,</span> <span class="keyword">const</span> <span class="identifier">U</span><span class="special">&</span> <span class="identifier">b</span><span class="special">);</span>
141 <span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">T</span><span class="special">></span>
142 <span class="identifier">polynomial</span><span class="special"><</span><span class="identifier">T</span><span class="special">></span> <span class="keyword">operator</span> <span class="special"><<=</span> <span class="special">(</span><span class="keyword">const</span> <span class="identifier">U</span><span class="special">&</span> <span class="identifier">a</span><span class="special">);</span>
143 <span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">T</span><span class="special">></span>
144 <span class="identifier">polynomial</span><span class="special"><</span><span class="identifier">T</span><span class="special">></span> <span class="keyword">operator</span> <span class="special"><<</span> <span class="special">(</span><span class="identifier">polynomial</span><span class="special"><</span><span class="identifier">T</span><span class="special">></span> <span class="keyword">const</span> <span class="special">&</span><span class="identifier">a</span><span class="special">,</span> <span class="keyword">const</span> <span class="identifier">U</span><span class="special">&</span> <span class="identifier">b</span><span class="special">);</span>
146 <span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">T</span><span class="special">></span>
147 <span class="keyword">bool</span> <span class="keyword">operator</span> <span class="special">==</span> <span class="special">(</span><span class="keyword">const</span> <span class="identifier">polynomial</span><span class="special"><</span><span class="identifier">T</span><span class="special">></span> <span class="special">&</span><span class="identifier">a</span><span class="special">,</span> <span class="keyword">const</span> <span class="identifier">polynomial</span><span class="special"><</span><span class="identifier">T</span><span class="special">></span> <span class="special">&</span><span class="identifier">b</span><span class="special">);</span>
148 <span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">T</span><span class="special">></span>
149 <span class="keyword">bool</span> <span class="keyword">operator</span> <span class="special">!=</span> <span class="special">(</span><span class="keyword">const</span> <span class="identifier">polynomial</span><span class="special"><</span><span class="identifier">T</span><span class="special">></span> <span class="special">&</span><span class="identifier">a</span><span class="special">,</span> <span class="keyword">const</span> <span class="identifier">polynomial</span><span class="special"><</span><span class="identifier">T</span><span class="special">></span> <span class="special">&</span><span class="identifier">b</span><span class="special">);</span>
151 <span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">T</span><span class="special">></span>
152 <span class="identifier">polynomial</span><span class="special"><</span><span class="identifier">T</span><span class="special">></span> <span class="identifier">pow</span><span class="special">(</span><span class="identifier">polynomial</span><span class="special"><</span><span class="identifier">T</span><span class="special">></span> <span class="identifier">base</span><span class="special">,</span> <span class="keyword">int</span> <span class="identifier">exp</span><span class="special">);</span>
154 <span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">charT</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">traits</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">T</span><span class="special">></span>
155 <span class="identifier">std</span><span class="special">::</span><span class="identifier">basic_ostream</span><span class="special"><</span><span class="identifier">charT</span><span class="special">,</span> <span class="identifier">traits</span><span class="special">>&</span> <span class="keyword">operator</span> <span class="special"><<</span>
156 <span class="special">(</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">basic_ostream</span><span class="special"><</span><span class="identifier">charT</span><span class="special">,</span> <span class="identifier">traits</span><span class="special">>&</span> <span class="identifier">os</span><span class="special">,</span> <span class="keyword">const</span> <span class="identifier">polynomial</span><span class="special"><</span><span class="identifier">T</span><span class="special">>&</span> <span class="identifier">poly</span><span class="special">);</span>
158 <span class="keyword">template</span> <span class="special"><</span><span class="keyword">typename</span> <span class="identifier">T</span><span class="special">></span>
159 <span class="identifier">std</span><span class="special">::</span><span class="identifier">pair</span><span class="special"><</span> <span class="identifier">polynomial</span><span class="special"><</span><span class="identifier">T</span><span class="special">>,</span> <span class="identifier">polynomial</span><span class="special"><</span><span class="identifier">T</span><span class="special">></span> <span class="special">></span>
160 <span class="identifier">quotient_remainder</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">polynomial</span><span class="special"><</span><span class="identifier">T</span><span class="special">>&</span> <span class="identifier">a</span><span class="special">,</span> <span class="keyword">const</span> <span class="identifier">polynomial</span><span class="special"><</span><span class="identifier">T</span><span class="special">>&</span> <span class="identifier">b</span><span class="special">);</span>
162 <span class="special">}</span> <span class="comment">// namespace tools</span>
163 <span class="special">}}</span> <span class="comment">// namespace boost { namespace math</span>
166 <a name="math_toolkit.polynomials.h1"></a>
167 <span class="phrase"><a name="math_toolkit.polynomials.description"></a></span><a class="link" href="polynomials.html#math_toolkit.polynomials.description">Description</a>
170 This is a somewhat trivial class for polynomial manipulation.
175 <div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
176 <li class="listitem">
177 <a href="https://en.wikipedia.org/wiki/Polynomial" target="_top">Polynomial</a>
180 <li class="listitem">
181 Donald E. Knuth, The Art of Computer Programming: Volume 2, Third edition,
182 (1998) Chapter 4.6.1, Algorithm D: Division of polynomials over a field.
186 Implementation is currently of the "naive" variety, with 𝑶(N<sup>2</sup>) multiplication,
187 for example. This class should not be used in high-performance computing environments:
188 it is intended for the simple manipulation of small polynomials, typically
189 generated for special function approximation.
192 It does has division for polynomials over a <a href="https://en.wikipedia.org/wiki/Field_%28mathematics%29" target="_top">field</a>
193 (here floating point, complex, etc) and over a unique factorization domain
194 (integers). Division of polynomials over a field is compatible with <a href="https://en.wikipedia.org/wiki/Euclidean_algorithm" target="_top">Euclidean GCD</a>.
197 Division of polynomials over a UFD is compatible with the subresultant algorithm
198 for GCD (implemented as subresultant_gcd), but a serious word of warning is
199 required: the intermediate value swell of that algorithm will cause single-precision
200 integral types to overflow very easily. So although the algorithm will work
201 on single-precision integral types, an overload of the gcd function is only
202 provided for polynomials with multi-precision integral types, to prevent nasty
203 surprises. This is done somewhat crudely by disabling the overload for non-POD
207 Advanced manipulations: the FFT, factorisation etc are not currently provided.
208 Submissions for these are of course welcome :-)
211 <a name="math_toolkit.polynomials.h2"></a>
212 <span class="phrase"><a name="math_toolkit.polynomials.polynomial_examples"></a></span><a class="link" href="polynomials.html#math_toolkit.polynomials.polynomial_examples">Polynomial
213 Arithmetic Examples</a>
216 First include the essential polynomial header (and others) to make the example:
218 <pre class="programlisting"><span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">math</span><span class="special">/</span><span class="identifier">tools</span><span class="special">/</span><span class="identifier">polynomial</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span>
221 and some using statements are convenient:
223 <pre class="programlisting"><span class="keyword">using</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">string</span><span class="special">;</span>
224 <span class="keyword">using</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">exception</span><span class="special">;</span>
225 <span class="keyword">using</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">cout</span><span class="special">;</span>
226 <span class="keyword">using</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">abs</span><span class="special">;</span>
227 <span class="keyword">using</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">pair</span><span class="special">;</span>
229 <span class="keyword">using</span> <span class="keyword">namespace</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">math</span><span class="special">;</span>
230 <span class="keyword">using</span> <span class="keyword">namespace</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">math</span><span class="special">::</span><span class="identifier">tools</span><span class="special">;</span> <span class="comment">// for polynomial</span>
231 <span class="keyword">using</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">lexical_cast</span><span class="special">;</span>
234 Store the coefficients in a convenient way to access them, then create some
235 polynomials using construction from an iterator range, and finally output in
236 a 'pretty' formula format.
238 <div class="tip"><table border="0" summary="Tip">
240 <td rowspan="2" align="center" valign="top" width="25"><img alt="[Tip]" src="../../../../../doc/src/images/tip.png"></td>
241 <th align="left">Tip</th>
243 <tr><td align="left" valign="top"><p>
244 Although we might conventionally write a polynomial from left to right in
245 descending order of degree, Boost.Math stores in <span class="bold"><strong>ascending
246 order of degree</strong></span>.
249 <pre class="programlisting"><span class="identifier">Read</span><span class="special">/</span><span class="identifier">write</span> <span class="keyword">for</span> <span class="identifier">humans</span><span class="special">:</span> <span class="number">3</span><span class="identifier">x</span><span class="special">^</span><span class="number">3</span> <span class="special">-</span> <span class="number">4</span><span class="identifier">x</span><span class="special">^</span><span class="number">2</span> <span class="special">-</span> <span class="number">6</span><span class="identifier">x</span> <span class="special">+</span> <span class="number">10</span>
250 <span class="identifier">Boost</span> <span class="identifier">polynomial</span> <span class="identifier">storage</span><span class="special">:</span> <span class="special">[</span> <span class="number">10</span><span class="special">,</span> <span class="special">-</span><span class="number">6</span><span class="special">,</span> <span class="special">-</span><span class="number">4</span><span class="special">,</span> <span class="number">3</span> <span class="special">]</span>
252 <pre class="programlisting"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">array</span><span class="special"><</span><span class="keyword">double</span><span class="special">,</span> <span class="number">4</span><span class="special">></span> <span class="keyword">const</span> <span class="identifier">d3a</span> <span class="special">=</span> <span class="special">{{</span><span class="number">10</span><span class="special">,</span> <span class="special">-</span><span class="number">6</span><span class="special">,</span> <span class="special">-</span><span class="number">4</span><span class="special">,</span> <span class="number">3</span><span class="special">}};</span>
253 <span class="identifier">polynomial</span><span class="special"><</span><span class="keyword">double</span><span class="special">></span> <span class="keyword">const</span> <span class="identifier">a</span><span class="special">(</span><span class="identifier">d3a</span><span class="special">.</span><span class="identifier">begin</span><span class="special">(),</span> <span class="identifier">d3a</span><span class="special">.</span><span class="identifier">end</span><span class="special">());</span>
255 <span class="comment">// With C++11 and later, you can also use initializer_list construction.</span>
256 <span class="identifier">polynomial</span><span class="special"><</span><span class="keyword">double</span><span class="special">></span> <span class="keyword">const</span> <span class="identifier">b</span><span class="special">{{-</span><span class="number">2.0</span><span class="special">,</span> <span class="number">1.0</span><span class="special">}};</span>
258 <span class="comment">// formula_format() converts from Boost storage to human notation.</span>
259 <span class="identifier">cout</span> <span class="special"><<</span> <span class="string">"a = "</span> <span class="special"><<</span> <span class="identifier">formula_format</span><span class="special">(</span><span class="identifier">a</span><span class="special">)</span>
260 <span class="special"><<</span> <span class="string">"\nb = "</span> <span class="special"><<</span> <span class="identifier">formula_format</span><span class="special">(</span><span class="identifier">b</span><span class="special">)</span> <span class="special"><<</span> <span class="string">"\n\n"</span><span class="special">;</span>
265 <pre class="programlisting"><span class="identifier">a</span> <span class="special">=</span> <span class="number">3</span><span class="identifier">x</span><span class="special">^</span><span class="number">3</span> <span class="special">-</span> <span class="number">4</span><span class="identifier">x</span><span class="special">^</span><span class="number">2</span> <span class="special">-</span> <span class="number">6</span><span class="identifier">x</span> <span class="special">+</span> <span class="number">10</span>
266 <span class="identifier">b</span> <span class="special">=</span> <span class="identifier">x</span> <span class="special">-</span> <span class="number">2</span>
268 <pre class="programlisting"><span class="comment">// Now we can do arithmetic with the usual infix operators: + - * / and %.</span>
269 <span class="identifier">polynomial</span><span class="special"><</span><span class="keyword">double</span><span class="special">></span> <span class="identifier">s</span> <span class="special">=</span> <span class="identifier">a</span> <span class="special">+</span> <span class="identifier">b</span><span class="special">;</span>
270 <span class="identifier">cout</span> <span class="special"><<</span> <span class="string">"a + b = "</span> <span class="special"><<</span> <span class="identifier">formula_format</span><span class="special">(</span><span class="identifier">s</span><span class="special">)</span> <span class="special"><<</span> <span class="string">"\n"</span><span class="special">;</span>
271 <span class="identifier">polynomial</span><span class="special"><</span><span class="keyword">double</span><span class="special">></span> <span class="identifier">d</span> <span class="special">=</span> <span class="identifier">a</span> <span class="special">-</span> <span class="identifier">b</span><span class="special">;</span>
272 <span class="identifier">cout</span> <span class="special"><<</span> <span class="string">"a - b = "</span> <span class="special"><<</span> <span class="identifier">formula_format</span><span class="special">(</span><span class="identifier">d</span><span class="special">)</span> <span class="special"><<</span> <span class="string">"\n"</span><span class="special">;</span>
273 <span class="identifier">polynomial</span><span class="special"><</span><span class="keyword">double</span><span class="special">></span> <span class="identifier">p</span> <span class="special">=</span> <span class="identifier">a</span> <span class="special">*</span> <span class="identifier">b</span><span class="special">;</span>
274 <span class="identifier">cout</span> <span class="special"><<</span> <span class="string">"a * b = "</span> <span class="special"><<</span> <span class="identifier">formula_format</span><span class="special">(</span><span class="identifier">p</span><span class="special">)</span> <span class="special"><<</span> <span class="string">"\n"</span><span class="special">;</span>
275 <span class="identifier">polynomial</span><span class="special"><</span><span class="keyword">double</span><span class="special">></span> <span class="identifier">q</span> <span class="special">=</span> <span class="identifier">a</span> <span class="special">/</span> <span class="identifier">b</span><span class="special">;</span>
276 <span class="identifier">cout</span> <span class="special"><<</span> <span class="string">"a / b = "</span> <span class="special"><<</span> <span class="identifier">formula_format</span><span class="special">(</span><span class="identifier">q</span><span class="special">)</span> <span class="special"><<</span> <span class="string">"\n"</span><span class="special">;</span>
277 <span class="identifier">polynomial</span><span class="special"><</span><span class="keyword">double</span><span class="special">></span> <span class="identifier">r</span> <span class="special">=</span> <span class="identifier">a</span> <span class="special">%</span> <span class="identifier">b</span><span class="special">;</span>
278 <span class="identifier">cout</span> <span class="special"><<</span> <span class="string">"a % b = "</span> <span class="special"><<</span> <span class="identifier">formula_format</span><span class="special">(</span><span class="identifier">r</span><span class="special">)</span> <span class="special"><<</span> <span class="string">"\n"</span><span class="special">;</span>
283 <pre class="programlisting"><span class="identifier">a</span> <span class="special">+</span> <span class="identifier">b</span> <span class="special">=</span> <span class="number">3</span><span class="identifier">x</span><span class="special">^</span><span class="number">3</span> <span class="special">-</span> <span class="number">4</span><span class="identifier">x</span><span class="special">^</span><span class="number">2</span> <span class="special">-</span> <span class="number">5</span><span class="identifier">x</span> <span class="special">+</span> <span class="number">8</span>
284 <span class="identifier">a</span> <span class="special">-</span> <span class="identifier">b</span> <span class="special">=</span> <span class="number">3</span><span class="identifier">x</span><span class="special">^</span><span class="number">3</span> <span class="special">-</span> <span class="number">4</span><span class="identifier">x</span><span class="special">^</span><span class="number">2</span> <span class="special">-</span> <span class="number">7</span><span class="identifier">x</span> <span class="special">+</span> <span class="number">12</span>
285 <span class="identifier">a</span> <span class="special">*</span> <span class="identifier">b</span> <span class="special">=</span> <span class="number">3</span><span class="identifier">x</span><span class="special">^</span><span class="number">4</span> <span class="special">-</span> <span class="number">10</span><span class="identifier">x</span><span class="special">^</span><span class="number">3</span> <span class="special">+</span> <span class="number">2</span><span class="identifier">x</span><span class="special">^</span><span class="number">2</span> <span class="special">+</span> <span class="number">22</span><span class="identifier">x</span> <span class="special">-</span> <span class="number">20</span>
286 <span class="identifier">a</span> <span class="special">/</span> <span class="identifier">b</span> <span class="special">=</span> <span class="number">3</span><span class="identifier">x</span><span class="special">^</span><span class="number">2</span> <span class="special">+</span> <span class="number">2</span><span class="identifier">x</span> <span class="special">-</span> <span class="number">2</span>
287 <span class="identifier">a</span> <span class="special">%</span> <span class="identifier">b</span> <span class="special">=</span> <span class="number">6</span>
290 <a name="math_toolkit.polynomials.h3"></a>
291 <span class="phrase"><a name="math_toolkit.polynomials.division_quotient_and_remainder"></a></span><a class="link" href="polynomials.html#math_toolkit.polynomials.division_quotient_and_remainder">Division,
292 Quotient and Remainder</a>
295 Division is a special case where you can calculate two for the price of one.
298 Actually, quotient and remainder are always calculated together due to the
299 nature of the algorithm: the infix operators return one result and throw the
303 If you are doing a lot of division and want both the quotient and remainder,
304 then you don't want to do twice the work necessary.
307 In that case you can call the underlying function, <code class="literal">quotient_remainder</code>,
308 to get both results together as a pair.
310 <pre class="programlisting"> <span class="identifier">pair</span><span class="special"><</span> <span class="identifier">polynomial</span><span class="special"><</span><span class="keyword">double</span><span class="special">>,</span> <span class="identifier">polynomial</span><span class="special"><</span><span class="keyword">double</span><span class="special">></span> <span class="special">></span> <span class="identifier">result</span><span class="special">;</span>
311 <span class="identifier">result</span> <span class="special">=</span> <span class="identifier">quotient_remainder</span><span class="special">(</span><span class="identifier">a</span><span class="special">,</span> <span class="identifier">b</span><span class="special">);</span>
312 <span class="comment">// Reassure ourselves that the result is the same.</span>
313 <span class="identifier">BOOST_ASSERT</span><span class="special">(</span><span class="identifier">result</span><span class="special">.</span><span class="identifier">first</span> <span class="special">==</span> <span class="identifier">q</span><span class="special">);</span>
314 <span class="identifier">BOOST_ASSERT</span><span class="special">(</span><span class="identifier">result</span><span class="special">.</span><span class="identifier">second</span> <span class="special">==</span> <span class="identifier">r</span><span class="special">);</span>
317 The source code is at <a href="../../../example/polynomial_arithmetic.cpp" target="_top">polynomial_arithmetic.cpp</a>
320 <table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
321 <td align="left"></td>
322 <td align="right"><div class="copyright-footer">Copyright © 2006-2019 Nikhar
323 Agrawal, Anton Bikineev, Paul A. Bristow, Marco Guazzone, Christopher Kormanyos,
324 Hubert Holin, Bruno Lalande, John Maddock, Jeremy Murphy, Matthew Pulver, Johan
325 Råde, Gautam Sewani, Benjamin Sobotta, Nicholas Thompson, Thijs van den Berg,
326 Daryle Walker and Xiaogang Zhang<p>
327 Distributed under the Boost Software License, Version 1.0. (See accompanying
328 file LICENSE_1_0.txt or copy at <a href="http://www.boost.org/LICENSE_1_0.txt" target="_top">http://www.boost.org/LICENSE_1_0.txt</a>)
333 <div class="spirit-nav">
334 <a accesskey="p" href="../poly.html"><img src="../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../poly.html"><img src="../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../index.html"><img src="../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="rational.html"><img src="../../../../../doc/src/images/next.png" alt="Next"></a>