📄 a00109.html
字号:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1"><title>The Polynomials Templates Library: Polynomial.h Source File</title><link href="doxygen.css" rel="stylesheet" type="text/css"><link href="tabs.css" rel="stylesheet" type="text/css"></head><body><!-- Generated by Doxygen 1.4.5 --><div class="tabs"> <ul> <li><a href="index.html"><span>Main Page</span></a></li> <li><a href="modules.html"><span>Modules</span></a></li> <li><a href="annotated.html"><span>Classes</span></a></li> <li id="current"><a href="files.html"><span>Files</span></a></li> </ul></div><div class="tabs"> <ul> <li><a href="files.html"><span>File List</span></a></li> <li><a href="globals.html"><span>File Members</span></a></li> </ul></div><h1>Polynomial.h</h1><a href="a00097.html">Go to the documentation of this file.</a><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="preprocessor">#ifndef POLYNOMIAL_H</span><a name="l00002"></a>00002 <span class="preprocessor"></span><span class="preprocessor">#define POLYNOMIAL_H</span><a name="l00003"></a>00003 <span class="preprocessor"></span><a name="l00033"></a>00033 <span class="preprocessor">#include <vector></span><a name="l00034"></a>00034 <span class="preprocessor">#include <algorithm></span><a name="l00035"></a>00035 <span class="preprocessor">#include <complex></span><a name="l00036"></a>00036 <span class="preprocessor">#include <stdarg.h></span><a name="l00037"></a>00037 <span class="preprocessor">#include "<a class="code" href="a00092.html">floatspecs.h</a>"</span><a name="l00038"></a>00038 <a name="l00085"></a>00085 <span class="keyword">template</span> <<span class="keyword">class</span> T><a name="l00086"></a><a class="code" href="a00090.html">00086</a> <span class="keyword">class </span><a class="code" href="a00090.html">Polynomial</a> : <span class="keyword">public</span> std::vector<T> {<a name="l00087"></a>00087 <a name="l00088"></a>00088 <span class="keyword">public</span>:<a name="l00100"></a><a class="code" href="a00090.html#7de9b11369dc2daf64bbc609b3454baa">00100</a> <span class="keyword">explicit</span> <a class="code" href="a00090.html#7de9b11369dc2daf64bbc609b3454baa">Polynomial</a>(<span class="keyword">const</span> T& a = T(0)) {<a name="l00101"></a>00101 push_back(a);<a name="l00102"></a>00102 }<a name="l00103"></a>00103 <a name="l00113"></a><a class="code" href="a00090.html#aaeed1fb3dc10820de49a00bc4dd6821">00113</a> <span class="keyword">explicit</span> <a class="code" href="a00090.html#7de9b11369dc2daf64bbc609b3454baa">Polynomial</a>(<span class="keyword">const</span> std::vector<T>& p) : std::vector(p) { }<a name="l00114"></a>00114 <a name="l00127"></a><a class="code" href="a00090.html#08b4dcb98feb2d90906f1e7697249639">00127</a> <a class="code" href="a00090.html#7de9b11369dc2daf64bbc609b3454baa">Polynomial</a>(<span class="keywordtype">unsigned</span> n, T a0, ...) {<a name="l00128"></a>00128 va_list marker;<a name="l00129"></a>00129 <span class="keywordtype">int</span> i = n;<a name="l00130"></a>00130 <span class="keywordflow">if</span> (<span class="keyword">sizeof</span>(T) != <span class="keyword">sizeof</span>(<span class="keywordtype">float</span>)) {<a name="l00131"></a>00131 push_back(a0);<a name="l00132"></a>00132 va_start(marker, a0);<a name="l00133"></a>00133 <span class="keywordflow">while</span> (i-- > 0) {<a name="l00134"></a>00134 T an = va_arg(marker, T);<a name="l00135"></a>00135 push_back(an);<a name="l00136"></a>00136 }<a name="l00137"></a>00137 va_end(marker);<a name="l00138"></a>00138 <a class="code" href="a00090.html#7d71a634b3ab7d5071c031633b9614d5">compact</a>();<a name="l00139"></a>00139 }<a name="l00140"></a>00140 <span class="keywordflow">else</span> {<a name="l00141"></a>00141 <span class="comment">// in c/c++, floats are pushed as doubles</span><a name="l00142"></a>00142 push_back(a0);<a name="l00143"></a>00143 va_start(marker, a0);<a name="l00144"></a>00144 <span class="keywordflow">while</span> (i-- > 0) {<a name="l00145"></a>00145 <span class="keywordtype">double</span> an = va_arg(marker, <span class="keywordtype">double</span>);<a name="l00146"></a>00146 push_back(T(an));<a name="l00147"></a>00147 }<a name="l00148"></a>00148 va_end(marker);<a name="l00149"></a>00149 <a class="code" href="a00090.html#7d71a634b3ab7d5071c031633b9614d5">compact</a>();<a name="l00150"></a>00150 }<a name="l00151"></a>00151 }<a name="l00168"></a><a class="code" href="a00090.html#7d71a634b3ab7d5071c031633b9614d5">00168</a> <span class="keywordtype">void</span> <a class="code" href="a00090.html#7d71a634b3ab7d5071c031633b9614d5">compact</a>() {<a name="l00169"></a>00169 <span class="keywordflow">while</span>((back() == T(0)) && size() > 1) pop_back();<a name="l00170"></a>00170 }<a name="l00171"></a>00171 <a name="l00188"></a><a class="code" href="a00090.html#b433e0edb11b32a205a9d07b89aefa8f">00188</a> <span class="keywordtype">int</span> <a class="code" href="a00090.html#b433e0edb11b32a205a9d07b89aefa8f">degree</a>()<span class="keyword"> const </span>{<a name="l00189"></a>00189 <span class="keywordtype">int</span> m = (int)size() - 1;<a name="l00190"></a>00190 <span class="keywordflow">while</span> ((m > 0) &&( (*<span class="keyword">this</span>)[m] == T(0))) --m;<a name="l00191"></a>00191 <span class="keywordflow">return</span> m;<a name="l00192"></a>00192 }<a name="l00193"></a>00193 <a name="l00208"></a><a class="code" href="a00090.html#ba49e76c2d516f6aa270b8333e99df8f">00208</a> <span class="keywordtype">int</span> <a class="code" href="a00090.html#b433e0edb11b32a205a9d07b89aefa8f">degree</a>() {<a name="l00209"></a>00209 <a class="code" href="a00090.html#7d71a634b3ab7d5071c031633b9614d5">compact</a>();<a name="l00210"></a>00210 <span class="keywordtype">int</span> m = (int)size() - 1;<a name="l00211"></a>00211 <span class="keywordflow">if</span> (m < 0) {<a name="l00212"></a>00212 resize(1);<a name="l00213"></a>00213 m = 0;<a name="l00214"></a>00214 }<a name="l00215"></a>00215 <span class="keywordflow">return</span> (<span class="keywordtype">int</span>)size() - 1;<a name="l00216"></a>00216 }<a name="l00217"></a>00217 <a name="l00230"></a><a class="code" href="a00090.html#043f1f1821306fe3cc497ca3400fc703">00230</a> <span class="keywordtype">void</span> <a class="code" href="a00090.html#043f1f1821306fe3cc497ca3400fc703">shift</a>(<span class="keywordtype">int</span> n) {<a name="l00231"></a>00231 <span class="keywordflow">if</span> (n < 0) {<a name="l00232"></a>00232 <span class="keywordtype">int</span> newSize = (int)size() + n;<a name="l00233"></a>00233 <span class="keywordflow">if</span> (newSize >= 1) {<a name="l00234"></a>00234 std::copy(&(*<span class="keyword">this</span>)[-n], &*end(), &(*<span class="keyword">this</span>)[0]);<a name="l00235"></a>00235 }<a name="l00236"></a>00236 <span class="keywordflow">else</span> {<a name="l00237"></a>00237 newSize = 1;<a name="l00238"></a>00238 (*this)[0] = T(0);<a name="l00239"></a>00239 }<a name="l00240"></a>00240 resize(newSize);<a name="l00241"></a>00241 }<a name="l00242"></a>00242 <span class="keywordflow">else</span> <span class="keywordflow">if</span> (n > 0) {<a name="l00243"></a>00243 resize(size() + n);<a name="l00244"></a>00244 std::copy(begin(), end(), begin() + n);<a name="l00245"></a>00245 }<a name="l00246"></a>00246 }<a name="l00247"></a>00247 <a name="l00257"></a><a class="code" href="a00090.html#246af5c906ec9a1a2fb7befea6d991ae">00257</a> <span class="keywordtype">void</span> <a class="code" href="a00090.html#246af5c906ec9a1a2fb7befea6d991ae">makeMonic</a>() {<a name="l00258"></a>00258 <a class="code" href="a00090.html#7d71a634b3ab7d5071c031633b9614d5">compact</a>();<a name="l00259"></a>00259 <span class="keywordflow">if</span> (!<a class="code" href="a00090.html#2fd33ef58c1d4dc24877322027a8bb50">isMonic</a>())<a name="l00260"></a>00260 *<span class="keyword">this</span> /= (*this)[<a class="code" href="a00090.html#b433e0edb11b32a205a9d07b89aefa8f">degree</a>()];<a name="l00261"></a>00261 }<a name="l00262"></a>00262 <a name="l00273"></a><a class="code" href="a00090.html#2fd33ef58c1d4dc24877322027a8bb50">00273</a> <span class="keyword">inline</span> <span class="keywordtype">bool</span> <a class="code" href="a00090.html#2fd33ef58c1d4dc24877322027a8bb50">isMonic</a>()<span class="keyword"> const </span>{<a name="l00274"></a>00274 <span class="keywordflow">return</span> ((*<span class="keyword">this</span>)[<a class="code" href="a00090.html#b433e0edb11b32a205a9d07b89aefa8f">degree</a>()] == T(1));<a name="l00275"></a>00275 }<a name="l00276"></a>00276 <a name="l00287"></a><a class="code" href="a00090.html#c107df05015e0113aee17e6665ab8a60">00287</a> <span class="keywordtype">void</span> <a class="code" href="a00090.html#c107df05015e0113aee17e6665ab8a60">getDerivative</a>(Polynomial<T>& pp)<span class="keyword"> const </span>{<a name="l00288"></a>00288 <span class="keywordtype">unsigned</span> i;<a name="l00289"></a>00289 T ii;<a name="l00290"></a>00290 pp.resize(size() - 1);<a name="l00291"></a>00291 <span class="keywordflow">for</span> (i = 0, ii = T(1); i < pp.size(); ++i, ii += T(1))<a name="l00292"></a>00292 pp[i] = ii * (*<span class="keyword">this</span>)[i + 1];<a name="l00293"></a>00293 }<a name="l00294"></a>00294 <a name="l00312"></a><a class="code" href="a00090.html#a845bf5cc0f93217a7c7f403a0bc9d38">00312</a> T <a class="code" href="a00090.html#a845bf5cc0f93217a7c7f403a0bc9d38">eval</a>(<span class="keyword">const</span> T& x)<span class="keyword"> const </span>{<a name="l00313"></a>00313 <a class="code" href="a00101.html#gc5161c8ecd75b0108d0ea60c92d30d21">return ::eval</a>(*<span class="keyword">this</span>, x);<a name="l00314"></a>00314 }<a name="l00315"></a>00315 <a name="l00339"></a><a class="code" href="a00090.html#4dc10e1190f7f71f0d04e9871c1d7a2f">00339</a> T <a class="code" href="a00090.html#4dc10e1190f7f71f0d04e9871c1d7a2f">evalAndDeflate</a>(<span class="keyword">const</span> T& a, Polynomial<T>& q)<span class="keyword"> const </span>{<a name="l00340"></a>00340 <a class="code" href="a00101.html#g0a6fc89686a91e3c8c99923a7b0247e3">return ::evalAndDeflate</a>(*<span class="keyword">this</span>, a, q);<a name="l00341"></a>00341 }<a name="l00342"></a>00342 <a name="l00354"></a><a class="code" href="a00090.html#3035df8b06fcc5015efb56762fc68f93">00354</a> T <a class="code" href="a00090.html#3035df8b06fcc5015efb56762fc68f93">evalAndDerive</a>(<span class="keyword">const</span> T& x, T& ppx)<span class="keyword"> const </span>{<a name="l00355"></a>00355 <span class="keywordtype">int</span> m = <a class="code" href="a00090.html#b433e0edb11b32a205a9d07b89aefa8f">degree</a>();<a name="l00356"></a>00356 T y;<a name="l00357"></a>00357 ppx = 0;<a name="l00358"></a>00358 y = (*this)[m];<a name="l00359"></a>00359 <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = m - 1; i >= 0; --i) {<a name="l00360"></a>00360 ppx = (ppx * x) + y;<a name="l00361"></a>00361 y = (y * x) + (*this)[i];<a name="l00362"></a>00362 }<a name="l00363"></a>00363 <span class="keywordflow">return</span> y;<a name="l00364"></a>00364 }<a name="l00379"></a><a class="code" href="a00090.html#326ef308fcad15d7d1f778bb3b8beb31">00379</a> <span class="keyword">inline</span> <span class="keyword">const</span> Polynomial<T>& <a class="code" href="a00090.html#326ef308fcad15d7d1f778bb3b8beb31">operator= </a>(<span class="keyword">const</span> std::vector<T>& q) {<a name="l00380"></a>00380 (std::vector<T>&)*<span class="keyword">this</span> = q;<a name="l00381"></a>00381 <span class="keywordflow">return</span> *<span class="keyword">this</span>;<a name="l00382"></a>00382 }<a name="l00383"></a>00383 <a name="l00397"></a><a class="code" href="a00090.html#23b2b39cd96c44c49bb31c1229165119">00397</a> <span class="keyword">inline</span> <span class="keyword">const</span> Polynomial<T>& <span class="keyword">operator</span>+= (<span class="keyword">const</span> Polynomial<T>& q) {<a name="l00398"></a>00398 <a class="code" href="a00102.html#g93873480bca596f74ff9b07f75c78103">add</a>(*<span class="keyword">this</span>, q);<a name="l00399"></a>00399 <span class="keywordflow">return</span> *<span class="keyword">this</span>;<a name="l00400"></a>00400 }<a name="l00401"></a>00401 <a name="l00415"></a><a class="code" href="a00090.html#be51eb0dc8e4a3721479be4b11536da0">00415</a> <span class="keyword">inline</span> <span class="keyword">const</span> Polynomial<T>& <a class="code" href="a00090.html#be51eb0dc8e4a3721479be4b11536da0">operator-= </a>(<span class="keyword">const</span> Polynomial<T>& q) {<a name="l00416"></a>00416 <a class="code" href="a00102.html#g5a0e286e83d54485e6f4ef4cb0e04f51">sub</a>(*<span class="keyword">this</span>, q);<a name="l00417"></a>00417 <span class="keywordflow">return</span> *<span class="keyword">this</span>;<a name="l00418"></a>00418 }<a name="l00419"></a>00419 <a name="l00433"></a><a class="code" href="a00090.html#9c6951d37215e36ec4d171d26f90f487">00433</a> <span class="keyword">inline</span> <span class="keyword">const</span> Polynomial<T> <a class="code" href="a00090.html#9c6951d37215e36ec4d171d26f90f487">operator*= </a>(<span class="keyword">const</span> Polynomial<T>& p) {<a name="l00434"></a>00434 Polynomial<T> q = *<span class="keyword">this</span>;<a name="l00435"></a>00435 <a class="code" href="a00102.html#g4db05aa06bba6b0f29a0c2608a479ec1">mul</a>(*<span class="keyword">this</span>, p, q);<a name="l00436"></a>00436 <span class="keywordflow">return</span> *<span class="keyword">this</span>;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -