⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 polynomi_8cpp-source.html

📁 Crypto++是一个非常强大的密码学库,主要是功能全
💻 HTML
📖 第 1 页 / 共 3 页
字号:
<!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&nbsp;Page</a> | <a class="qindex" href="namespaces.html">Namespace List</a> | <a class="qindex" href="hierarchy.html">Class&nbsp;Hierarchy</a> | <a class="qindex" href="classes.html">Alphabetical&nbsp;List</a> | <a class="qindex" href="annotated.html">Compound&nbsp;List</a> | <a class="qindex" href="files.html">File&nbsp;List</a> | <a class="qindex" href="namespacemembers.html">Namespace&nbsp;Members</a> | <a class="qindex" href="functions.html">Compound&nbsp;Members</a> | <a class="qindex" href="globals.html">File&nbsp;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 &lt;strstream&gt;</span>00011 <span class="preprocessor">#include &lt;iostream&gt;</span>00012 00013 NAMESPACE_BEGIN(CryptoPP)00014 00015 <span class="keyword">template</span> &lt;<span class="keyword">class</span> T&gt;00016 <span class="keywordtype">void</span> <a class="code" href="class_polynomial_over.html">PolynomialOver&lt;T&gt;::Randomize</a>(<a class="code" href="class_random_number_generator.html">RandomNumberGenerator</a> &amp;rng, <span class="keyword">const</span> RandomizationParameter &amp;parameter, <span class="keyword">const</span> Ring &amp;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&lt;m_coefficients.size(); ++i)00020                 m_coefficients[i] = ring.RandomElement(rng, parameter.m_coefficientParameter);00021 }00022 00023 <span class="keyword">template</span> &lt;<span class="keyword">class</span> T&gt;00024 <span class="keywordtype">void</span> <a class="code" href="class_polynomial_over.html">PolynomialOver&lt;T&gt;::FromStr</a>(<span class="keyword">const</span> <span class="keywordtype">char</span> *str, <span class="keyword">const</span> Ring &amp;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 &gt;&gt; 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 &gt;&gt; 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> &lt;<span class="keyword">class</span> T&gt;00076 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> <a class="code" href="class_polynomial_over.html">PolynomialOver&lt;T&gt;::CoefficientCount</a>(<span class="keyword">const</span> Ring &amp;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 &amp;&amp; ring.Equal(m_coefficients[count-1], ring.Identity()))00080                 count--;00081         const_cast&lt;std::vector&lt;CoefficientType&gt; &amp;&gt;(m_coefficients).resize(count);00082         <span class="keywordflow">return</span> count;00083 }00084 00085 <span class="keyword">template</span> &lt;<span class="keyword">class</span> T&gt;<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&lt;T&gt;</a>::CoefficientType <a class="code" href="class_polynomial_over.html#_polynomial_over_fixed_ringz59_2">PolynomialOver&lt;T&gt;::GetCoefficient</a>(<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> i, <span class="keyword">const</span> Ring &amp;ring)<span class="keyword"> const </span>00087 <span class="keyword"></span>{00088         <span class="keywordflow">return</span> (i &lt; m_coefficients.size()) ? m_coefficients[i] : ring.Identity();00089 }00090 00091 <span class="keyword">template</span> &lt;<span class="keyword">class</span> T&gt;00092 <a class="code" href="class_polynomial_over.html">PolynomialOver&lt;T&gt;</a>&amp;  <a class="code" href="class_polynomial_over.html">PolynomialOver&lt;T&gt;::operator=</a>(<span class="keyword">const</span> <a class="code" href="class_polynomial_over.html">PolynomialOver&lt;T&gt;</a>&amp; t)00093 {00094         <span class="keywordflow">if</span> (<span class="keyword">this</span> != &amp;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&lt;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> &lt;<span class="keyword">class</span> T&gt;00104 <a class="code" href="class_polynomial_over.html">PolynomialOver&lt;T&gt;</a>&amp; <a class="code" href="class_polynomial_over.html">PolynomialOver&lt;T&gt;::Accumulate</a>(<span class="keyword">const</span> <a class="code" href="class_polynomial_over.html">PolynomialOver&lt;T&gt;</a>&amp; t, <span class="keyword">const</span> Ring &amp;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 &gt; 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&lt;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> &lt;<span class="keyword">class</span> T&gt;00118 <a class="code" href="class_polynomial_over.html">PolynomialOver&lt;T&gt;</a>&amp; <a class="code" href="class_polynomial_over.html">PolynomialOver&lt;T&gt;::Reduce</a>(<span class="keyword">const</span> <a class="code" href="class_polynomial_over.html">PolynomialOver&lt;T&gt;</a>&amp; t, <span class="keyword">const</span> Ring &amp;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 &gt; 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&lt;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> &lt;<span class="keyword">class</span> T&gt;00132 <span class="keyword">typename</span> <a class="code" href="class_polynomial_over.html">PolynomialOver&lt;T&gt;</a>::CoefficientType <a class="code" href="class_polynomial_over.html">PolynomialOver&lt;T&gt;::EvaluateAt</a>(<span class="keyword">const</span> CoefficientType &amp;x, <span class="keyword">const</span> Ring &amp;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 &lt; 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&gt;=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> &lt;<span class="keyword">class</span> T&gt;00149 <a class="code" href="class_polynomial_over.html">PolynomialOver&lt;T&gt;</a>&amp; <a class="code" href="class_polynomial_over.html">PolynomialOver&lt;T&gt;::ShiftLeft</a>(<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> n, <span class="keyword">const</span> Ring &amp;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 &gt; 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> &lt;<span class="keyword">class</span> T&gt;00167 <a class="code" href="class_polynomial_over.html">PolynomialOver&lt;T&gt;</a>&amp; <a class="code" href="class_polynomial_over.html">PolynomialOver&lt;T&gt;::ShiftRight</a>(<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> n, <span class="keyword">const</span> Ring &amp;ring)00168 {00169         <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> count = CoefficientCount(ring);00170         <span class="keywordflow">if</span> (count &gt; n)00171         {00172                 <span class="keywordflow">for</span> (<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> i=0; i&lt;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> &lt;<span class="keyword">class</span> T&gt;<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&lt;T&gt;::SetCoefficient</a>(<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> i, <span class="keyword">const</span> CoefficientType &amp;value, <span class="keyword">const</span> Ring &amp;ring)00183 {00184         <span class="keywordflow">if</span> (i &gt;= m_coefficients.size())00185                 m_coefficients.resize(i+1, ring.Identity());00186         m_coefficients[i] = value;00187 }00188 00189 <span class="keyword">template</span> &lt;<span class="keyword">class</span> T&gt;00190 <span class="keywordtype">void</span> <a class="code" href="class_polynomial_over.html">PolynomialOver&lt;T&gt;::Negate</a>(<span class="keyword">const</span> Ring &amp;ring)00191 {

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -