📄 polynomi_8cpp-source.html
字号:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"><html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1"><title>Crypto++: polynomi.cpp Source File</title><link href="doxygen.css" rel="stylesheet" type="text/css"></head><body><!-- Generated by Doxygen 1.3.2 --><div class="qindex"><a class="qindex" href="index.html">Main Page</a> | <a class="qindex" href="namespaces.html">Namespace List</a> | <a class="qindex" href="hierarchy.html">Class Hierarchy</a> | <a class="qindex" href="classes.html">Alphabetical List</a> | <a class="qindex" href="annotated.html">Compound List</a> | <a class="qindex" href="files.html">File List</a> | <a class="qindex" href="namespacemembers.html">Namespace Members</a> | <a class="qindex" href="functions.html">Compound Members</a> | <a class="qindex" href="globals.html">File Members</a></div><h1>polynomi.cpp</h1><div class="fragment"><pre>00001 <span class="comment">// polynomi.cpp - written and placed in the public domain by Wei Dai</span>00002 00003 <span class="comment">// Part of the code for polynomial evaluation and interpolation</span>00004 <span class="comment">// originally came from Hal Finney's public domain secsplit.c.</span>00005 00006 <span class="preprocessor">#include "pch.h"</span>00007 <span class="preprocessor">#include "<a class="code" href="polynomi_8h.html">polynomi.h</a>"</span>00008 <span class="preprocessor">#include "secblock.h"</span>00009 00010 <span class="preprocessor">#include <strstream></span>00011 <span class="preprocessor">#include <iostream></span>00012 00013 NAMESPACE_BEGIN(CryptoPP)00014 00015 <span class="keyword">template</span> <<span class="keyword">class</span> T>00016 <span class="keywordtype">void</span> <a class="code" href="class_polynomial_over.html">PolynomialOver<T>::Randomize</a>(<a class="code" href="class_random_number_generator.html">RandomNumberGenerator</a> &rng, <span class="keyword">const</span> RandomizationParameter &parameter, <span class="keyword">const</span> Ring &ring)00017 {00018 m_coefficients.resize(parameter.m_coefficientCount);00019 <span class="keywordflow">for</span> (<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> i=0; i<m_coefficients.size(); ++i)00020 m_coefficients[i] = ring.RandomElement(rng, parameter.m_coefficientParameter);00021 }00022 00023 <span class="keyword">template</span> <<span class="keyword">class</span> T>00024 <span class="keywordtype">void</span> <a class="code" href="class_polynomial_over.html">PolynomialOver<T>::FromStr</a>(<span class="keyword">const</span> <span class="keywordtype">char</span> *str, <span class="keyword">const</span> Ring &ring)00025 {00026 std::istrstream in((<span class="keywordtype">char</span> *)str);00027 <span class="keywordtype">bool</span> positive = <span class="keyword">true</span>;00028 CoefficientType coef;00029 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> power;00030 00031 <span class="keywordflow">while</span> (in)00032 {00033 std::ws(in);00034 <span class="keywordflow">if</span> (in.peek() == <span class="charliteral">'x'</span>)00035 coef = ring.MultiplicativeIdentity();00036 <span class="keywordflow">else</span>00037 in >> coef;00038 00039 std::ws(in);00040 <span class="keywordflow">if</span> (in.peek() == <span class="charliteral">'x'</span>)00041 {00042 in.get();00043 std::ws(in);00044 <span class="keywordflow">if</span> (in.peek() == <span class="charliteral">'^'</span>)00045 {00046 in.get();00047 in >> power;00048 }00049 <span class="keywordflow">else</span>00050 power = 1;00051 }00052 <span class="keywordflow">else</span>00053 power = 0;00054 00055 <span class="keywordflow">if</span> (!positive)00056 coef = ring.Inverse(coef);00057 00058 SetCoefficient(power, coef, ring);00059 00060 std::ws(in);00061 <span class="keywordflow">switch</span> (in.get())00062 {00063 <span class="keywordflow">case</span> <span class="charliteral">'+'</span>:00064 positive = <span class="keyword">true</span>;00065 <span class="keywordflow">break</span>;00066 <span class="keywordflow">case</span> <span class="charliteral">'-'</span>:00067 positive = <span class="keyword">false</span>;00068 <span class="keywordflow">break</span>;00069 <span class="keywordflow">default</span>:00070 <span class="keywordflow">return</span>; <span class="comment">// something's wrong with the input string</span>00071 }00072 }00073 }00074 00075 <span class="keyword">template</span> <<span class="keyword">class</span> T>00076 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> <a class="code" href="class_polynomial_over.html">PolynomialOver<T>::CoefficientCount</a>(<span class="keyword">const</span> Ring &ring)<span class="keyword"> const</span>00077 <span class="keyword"></span>{00078 <span class="keywordtype">unsigned</span> count = m_coefficients.size();00079 <span class="keywordflow">while</span> (count && ring.Equal(m_coefficients[count-1], ring.Identity()))00080 count--;00081 const_cast<std::vector<CoefficientType> &>(m_coefficients).resize(count);00082 <span class="keywordflow">return</span> count;00083 }00084 00085 <span class="keyword">template</span> <<span class="keyword">class</span> T><a name="l00086"></a><a class="code" href="class_polynomial_over.html#_polynomial_over_fixed_ringz59_2">00086</a> <span class="keyword">typename</span> <a class="code" href="class_polynomial_over.html">PolynomialOver<T></a>::CoefficientType <a class="code" href="class_polynomial_over.html#_polynomial_over_fixed_ringz59_2">PolynomialOver<T>::GetCoefficient</a>(<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> i, <span class="keyword">const</span> Ring &ring)<span class="keyword"> const </span>00087 <span class="keyword"></span>{00088 <span class="keywordflow">return</span> (i < m_coefficients.size()) ? m_coefficients[i] : ring.Identity();00089 }00090 00091 <span class="keyword">template</span> <<span class="keyword">class</span> T>00092 <a class="code" href="class_polynomial_over.html">PolynomialOver<T></a>& <a class="code" href="class_polynomial_over.html">PolynomialOver<T>::operator=</a>(<span class="keyword">const</span> <a class="code" href="class_polynomial_over.html">PolynomialOver<T></a>& t)00093 {00094 <span class="keywordflow">if</span> (<span class="keyword">this</span> != &t)00095 {00096 m_coefficients.resize(t.m_coefficients.size());00097 <span class="keywordflow">for</span> (<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> i=0; i<m_coefficients.size(); i++)00098 m_coefficients[i] = t.m_coefficients[i];00099 }00100 <span class="keywordflow">return</span> *<span class="keyword">this</span>;00101 }00102 00103 <span class="keyword">template</span> <<span class="keyword">class</span> T>00104 <a class="code" href="class_polynomial_over.html">PolynomialOver<T></a>& <a class="code" href="class_polynomial_over.html">PolynomialOver<T>::Accumulate</a>(<span class="keyword">const</span> <a class="code" href="class_polynomial_over.html">PolynomialOver<T></a>& t, <span class="keyword">const</span> Ring &ring)00105 {00106 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> count = t.CoefficientCount(ring);00107 00108 <span class="keywordflow">if</span> (count > CoefficientCount(ring))00109 m_coefficients.resize(count, ring.Identity());00110 00111 <span class="keywordflow">for</span> (<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> i=0; i<count; i++)00112 ring.Accumulate(m_coefficients[i], t.GetCoefficient(i, ring));00113 00114 <span class="keywordflow">return</span> *<span class="keyword">this</span>;00115 }00116 00117 <span class="keyword">template</span> <<span class="keyword">class</span> T>00118 <a class="code" href="class_polynomial_over.html">PolynomialOver<T></a>& <a class="code" href="class_polynomial_over.html">PolynomialOver<T>::Reduce</a>(<span class="keyword">const</span> <a class="code" href="class_polynomial_over.html">PolynomialOver<T></a>& t, <span class="keyword">const</span> Ring &ring)00119 {00120 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> count = t.CoefficientCount(ring);00121 00122 <span class="keywordflow">if</span> (count > CoefficientCount(ring))00123 m_coefficients.resize(count, ring.Identity());00124 00125 <span class="keywordflow">for</span> (<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> i=0; i<count; i++)00126 ring.Reduce(m_coefficients[i], t.GetCoefficient(i, ring));00127 00128 <span class="keywordflow">return</span> *<span class="keyword">this</span>;00129 }00130 00131 <span class="keyword">template</span> <<span class="keyword">class</span> T>00132 <span class="keyword">typename</span> <a class="code" href="class_polynomial_over.html">PolynomialOver<T></a>::CoefficientType <a class="code" href="class_polynomial_over.html">PolynomialOver<T>::EvaluateAt</a>(<span class="keyword">const</span> CoefficientType &x, <span class="keyword">const</span> Ring &ring)<span class="keyword"> const</span>00133 <span class="keyword"></span>{00134 <span class="keywordtype">int</span> degree = <a class="code" href="class_polynomial_over.html#_polynomial_over_fixed_ringz59_0">Degree</a>(ring);00135 00136 <span class="keywordflow">if</span> (degree < 0)00137 <span class="keywordflow">return</span> ring.Identity();00138 00139 CoefficientType result = m_coefficients[degree];00140 <span class="keywordflow">for</span> (<span class="keywordtype">int</span> j=degree-1; j>=0; j--)00141 {00142 result = ring.Multiply(result, x);00143 ring.Accumulate(result, m_coefficients[j]);00144 }00145 <span class="keywordflow">return</span> result;00146 }00147 00148 <span class="keyword">template</span> <<span class="keyword">class</span> T>00149 <a class="code" href="class_polynomial_over.html">PolynomialOver<T></a>& <a class="code" href="class_polynomial_over.html">PolynomialOver<T>::ShiftLeft</a>(<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> n, <span class="keyword">const</span> Ring &ring)00150 {00151 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> i = CoefficientCount(ring) + n;00152 m_coefficients.resize(i, ring.Identity());00153 <span class="keywordflow">while</span> (i > n)00154 {00155 i--;00156 m_coefficients[i] = m_coefficients[i-n];00157 }00158 <span class="keywordflow">while</span> (i)00159 {00160 i--;00161 m_coefficients[i] = ring.Identity();00162 }00163 <span class="keywordflow">return</span> *<span class="keyword">this</span>;00164 }00165 00166 <span class="keyword">template</span> <<span class="keyword">class</span> T>00167 <a class="code" href="class_polynomial_over.html">PolynomialOver<T></a>& <a class="code" href="class_polynomial_over.html">PolynomialOver<T>::ShiftRight</a>(<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> n, <span class="keyword">const</span> Ring &ring)00168 {00169 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> count = CoefficientCount(ring);00170 <span class="keywordflow">if</span> (count > n)00171 {00172 <span class="keywordflow">for</span> (<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> i=0; i<count-n; i++)00173 m_coefficients[i] = m_coefficients[i+n];00174 m_coefficients.resize(count-n, ring.Identity());00175 }00176 <span class="keywordflow">else</span>00177 m_coefficients.resize(0, ring.Identity());00178 <span class="keywordflow">return</span> *<span class="keyword">this</span>;00179 }00180 00181 <span class="keyword">template</span> <<span class="keyword">class</span> T><a name="l00182"></a><a class="code" href="class_polynomial_over.html#_polynomial_over_fixed_ringz61_1">00182</a> <span class="keywordtype">void</span> <a class="code" href="class_polynomial_over.html#_polynomial_over_fixed_ringz61_1">PolynomialOver<T>::SetCoefficient</a>(<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> i, <span class="keyword">const</span> CoefficientType &value, <span class="keyword">const</span> Ring &ring)00183 {00184 <span class="keywordflow">if</span> (i >= m_coefficients.size())00185 m_coefficients.resize(i+1, ring.Identity());00186 m_coefficients[i] = value;00187 }00188 00189 <span class="keyword">template</span> <<span class="keyword">class</span> T>00190 <span class="keywordtype">void</span> <a class="code" href="class_polynomial_over.html">PolynomialOver<T>::Negate</a>(<span class="keyword">const</span> Ring &ring)00191 {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -