📄 xtr_8h-source.html
字号:
00109 modp.Accumulate(a.c2, b.c2);00110 <span class="keywordflow">return</span> a;00111 }00112 00113 Element& Reduce(Element &a, <span class="keyword">const</span> Element &b)<span class="keyword"> const</span>00114 <span class="keyword"> </span>{00115 modp.Reduce(a.c1, b.c1);00116 modp.Reduce(a.c2, b.c2);00117 <span class="keywordflow">return</span> a;00118 }00119 00120 <span class="keywordtype">bool</span> IsUnit(<span class="keyword">const</span> Element &a)<span class="keyword"> const</span>00121 <span class="keyword"> </span>{00122 <span class="keywordflow">return</span> a.c1.NotZero() || a.c2.NotZero();00123 }00124 00125 <span class="keyword">const</span> Element& MultiplicativeIdentity()<span class="keyword"> const</span>00126 <span class="keyword"> </span>{00127 result.<a class="code" href="class_g_f_p2_element.html#_g_f_p2_elemento0">c1</a> = result.<a class="code" href="class_g_f_p2_element.html#_g_f_p2_elemento1">c2</a> = modp.Inverse(modp.MultiplicativeIdentity());00128 <span class="keywordflow">return</span> result;00129 }00130 00131 <span class="keyword">const</span> Element& Multiply(<span class="keyword">const</span> Element &a, <span class="keyword">const</span> Element &b)<span class="keyword"> const</span>00132 <span class="keyword"> </span>{00133 t = modp.Add(a.c1, a.c2);00134 t = modp.Multiply(t, modp.Add(b.c1, b.c2));00135 result.<a class="code" href="class_g_f_p2_element.html#_g_f_p2_elemento0">c1</a> = modp.Multiply(a.c1, b.c1);00136 result.<a class="code" href="class_g_f_p2_element.html#_g_f_p2_elemento1">c2</a> = modp.Multiply(a.c2, b.c2);00137 result.<a class="code" href="class_g_f_p2_element.html#_g_f_p2_elemento0">c1</a>.<a class="code" href="class_integer.html#_integerz43_20">swap</a>(result.<a class="code" href="class_g_f_p2_element.html#_g_f_p2_elemento1">c2</a>);00138 modp.Reduce(t, result.<a class="code" href="class_g_f_p2_element.html#_g_f_p2_elemento0">c1</a>);00139 modp.Reduce(t, result.<a class="code" href="class_g_f_p2_element.html#_g_f_p2_elemento1">c2</a>);00140 modp.Reduce(result.<a class="code" href="class_g_f_p2_element.html#_g_f_p2_elemento0">c1</a>, t);00141 modp.Reduce(result.<a class="code" href="class_g_f_p2_element.html#_g_f_p2_elemento1">c2</a>, t);00142 <span class="keywordflow">return</span> result;00143 }00144 00145 <span class="keyword">const</span> Element& MultiplicativeInverse(<span class="keyword">const</span> Element &a)<span class="keyword"> const</span>00146 <span class="keyword"> </span>{00147 <span class="keywordflow">return</span> result = Exponentiate(a, modp.GetModulus()-2);00148 }00149 00150 <span class="keyword">const</span> Element& <a class="code" href="class_square.html">Square</a>(<span class="keyword">const</span> Element &a)<span class="keyword"> const</span>00151 <span class="keyword"> </span>{00152 <span class="keyword">const</span> <a class="code" href="class_integer.html">Integer</a> &ac1 = (&a == &result) ? (t = a.c1) : a.c1;00153 result.<a class="code" href="class_g_f_p2_element.html#_g_f_p2_elemento0">c1</a> = modp.Multiply(modp.Subtract(modp.Subtract(a.c2, a.c1), a.c1), a.c2);00154 result.<a class="code" href="class_g_f_p2_element.html#_g_f_p2_elemento1">c2</a> = modp.Multiply(modp.Subtract(modp.Subtract(ac1, a.c2), a.c2), ac1);00155 <span class="keywordflow">return</span> result;00156 }00157 00158 Element Exponentiate(<span class="keyword">const</span> Element &a, <span class="keyword">const</span> <a class="code" href="class_integer.html">Integer</a> &e)<span class="keyword"> const</span>00159 <span class="keyword"> </span>{00160 <a class="code" href="class_integer.html">Integer</a> edivp, emodp;00161 <a class="code" href="class_integer.html#_integerz49_9">Integer::Divide</a>(emodp, edivp, e, modp.GetModulus());00162 Element b = PthPower(a);00163 <span class="keywordflow">return</span> <a class="code" href="class_abstract_ring.html">AbstractRing<GFP2Element>::CascadeExponentiate</a>(a, emodp, b, edivp);00164 }00165 00166 <span class="keyword">const</span> Element & PthPower(<span class="keyword">const</span> Element &a)<span class="keyword"> const</span>00167 <span class="keyword"> </span>{00168 result = a;00169 result.<a class="code" href="class_g_f_p2_element.html#_g_f_p2_elemento0">c1</a>.<a class="code" href="class_integer.html#_integerz43_20">swap</a>(result.<a class="code" href="class_g_f_p2_element.html#_g_f_p2_elemento1">c2</a>);00170 <span class="keywordflow">return</span> result;00171 }00172 00173 <span class="keywordtype">void</span> RaiseToPthPower(Element &a)<span class="keyword"> const</span>00174 <span class="keyword"> </span>{00175 a.c1.swap(a.c2);00176 }00177 00178 <span class="comment">// a^2 - 2a^p</span>00179 <span class="keyword">const</span> Element & SpecialOperation1(<span class="keyword">const</span> Element &a)<span class="keyword"> const</span>00180 <span class="keyword"> </span>{00181 assert(&a != &result);00182 result = Square(a);00183 modp.Reduce(result.<a class="code" href="class_g_f_p2_element.html#_g_f_p2_elemento0">c1</a>, a.c2);00184 modp.Reduce(result.<a class="code" href="class_g_f_p2_element.html#_g_f_p2_elemento0">c1</a>, a.c2);00185 modp.Reduce(result.<a class="code" href="class_g_f_p2_element.html#_g_f_p2_elemento1">c2</a>, a.c1);00186 modp.Reduce(result.<a class="code" href="class_g_f_p2_element.html#_g_f_p2_elemento1">c2</a>, a.c1);00187 <span class="keywordflow">return</span> result;00188 }00189 00190 <span class="comment">// x * z - y * z^p</span>00191 <span class="keyword">const</span> Element & SpecialOperation2(<span class="keyword">const</span> Element &x, <span class="keyword">const</span> Element &y, <span class="keyword">const</span> Element &z)<span class="keyword"> const</span>00192 <span class="keyword"> </span>{00193 assert(&x != &result && &y != &result && &z != &result);00194 t = modp.Add(x.c2, y.c2);00195 result.<a class="code" href="class_g_f_p2_element.html#_g_f_p2_elemento0">c1</a> = modp.Multiply(z.c1, modp.Subtract(y.c1, t));00196 modp.Accumulate(result.<a class="code" href="class_g_f_p2_element.html#_g_f_p2_elemento0">c1</a>, modp.Multiply(z.c2, modp.Subtract(t, x.c1)));00197 t = modp.Add(x.c1, y.c1);00198 result.<a class="code" href="class_g_f_p2_element.html#_g_f_p2_elemento1">c2</a> = modp.Multiply(z.c2, modp.Subtract(y.c2, t));00199 modp.Accumulate(result.<a class="code" href="class_g_f_p2_element.html#_g_f_p2_elemento1">c2</a>, modp.Multiply(z.c1, modp.Subtract(t, x.c2)));00200 <span class="keywordflow">return</span> result;00201 }00202 00203 <span class="keyword">protected</span>:00204 BaseField modp;00205 <span class="keyword">mutable</span> <a class="code" href="class_g_f_p2_element.html">GFP2Element</a> result;00206 <span class="keyword">mutable</span> <a class="code" href="class_integer.html">Integer</a> t;00207 };00208 00209 <span class="keywordtype">void</span> XTR_FindPrimesAndGenerator(<a class="code" href="class_random_number_generator.html">RandomNumberGenerator</a> &rng, <a class="code" href="class_integer.html">Integer</a> &p, <a class="code" href="class_integer.html">Integer</a> &q, <a class="code" href="class_g_f_p2_element.html">GFP2Element</a> &g, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> pbits, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> qbits);00210 00211 <a class="code" href="class_g_f_p2_element.html">GFP2Element</a> XTR_Exponentiate(<span class="keyword">const</span> <a class="code" href="class_g_f_p2_element.html">GFP2Element</a> &b, <span class="keyword">const</span> <a class="code" href="class_integer.html">Integer</a> &e, <span class="keyword">const</span> <a class="code" href="class_integer.html">Integer</a> &p);00212 00213 NAMESPACE_END00214 00215 <span class="preprocessor">#endif</span></pre></div><hr size="1"><address style="align: right;"><small>Generated on Tue Jul 8 23:34:28 2003 for Crypto++ by<a href="http://www.doxygen.org/index.html"><img src="doxygen.png" alt="doxygen" align="middle" border=0 > </a>1.3.2 </small></address></body></html>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -