📄 xtr_8h-source.html
字号:
<a name="l00041"></a>00041 <span class="comment">//! GF(p^2), optimal normal basis</span><a name="l00042"></a>00042 <span class="comment"></span><span class="keyword">template</span> <<span class="keyword">class</span> F><a name="l00043"></a><a class="code" href="class_g_f_p2___o_n_b.html">00043</a> <span class="keyword">class </span><a class="code" href="class_g_f_p2___o_n_b.html" title="GF(p^2), optimal normal basis.">GFP2_ONB</a> : <span class="keyword">public</span> <a class="code" href="class_abstract_ring.html" title="Abstract Ring.">AbstractRing</a><GFP2Element><a name="l00044"></a>00044 {<a name="l00045"></a>00045 <span class="keyword">public</span>:<a name="l00046"></a><a class="code" href="class_g_f_p2___o_n_b.html#d3bffbe1a6c331daf56bb6ec51cbc294">00046</a> <span class="keyword">typedef</span> F <a class="code" href="class_g_f_p2___o_n_b.html#d3bffbe1a6c331daf56bb6ec51cbc294">BaseField</a>;<a name="l00047"></a>00047 <a name="l00048"></a><a class="code" href="class_g_f_p2___o_n_b.html#29804cd3d3063af5411b87683eaccbdc">00048</a> <a class="code" href="class_g_f_p2___o_n_b.html#29804cd3d3063af5411b87683eaccbdc">GFP2_ONB</a>(<span class="keyword">const</span> <a class="code" href="class_integer.html" title="multiple precision integer and basic arithmetics">Integer</a> &p) : <a class="code" href="class_g_f_p2___o_n_b.html#12a3de839303bf309ed57d38659a85a9">modp</a>(p)<a name="l00049"></a>00049 {<a name="l00050"></a>00050 <span class="keywordflow">if</span> (p%3 != 2)<a name="l00051"></a>00051 <span class="keywordflow">throw</span> <a class="code" href="class_invalid_argument.html" title="exception thrown when an invalid argument is detected">InvalidArgument</a>(<span class="stringliteral">"GFP2_ONB: modulus must be equivalent to 2 mod 3"</span>);<a name="l00052"></a>00052 }<a name="l00053"></a>00053 <a name="l00054"></a><a class="code" href="class_g_f_p2___o_n_b.html#3a84528c019f87e690b2ee5c3e1516c1">00054</a> <span class="keyword">const</span> <a class="code" href="class_integer.html" title="multiple precision integer and basic arithmetics">Integer</a>& <a class="code" href="class_g_f_p2___o_n_b.html#3a84528c019f87e690b2ee5c3e1516c1">GetModulus</a>()<span class="keyword"> const </span>{<span class="keywordflow">return</span> <a class="code" href="class_g_f_p2___o_n_b.html#12a3de839303bf309ed57d38659a85a9">modp</a>.GetModulus();}<a name="l00055"></a>00055 <a name="l00056"></a><a class="code" href="class_g_f_p2___o_n_b.html#39b2b3a19f057b43e44159d3ca477861">00056</a> <a class="code" href="class_g_f_p2_element.html" title="an element of GF(p^2)">GFP2Element</a> <a class="code" href="class_g_f_p2___o_n_b.html#39b2b3a19f057b43e44159d3ca477861">ConvertIn</a>(<span class="keyword">const</span> <a class="code" href="class_integer.html" title="multiple precision integer and basic arithmetics">Integer</a> &a)<span class="keyword"> const</span><a name="l00057"></a>00057 <span class="keyword"> </span>{<a name="l00058"></a>00058 <a class="code" href="class_g_f_p2___o_n_b.html#69c8bc73d2d4a07ba6df46b12c8e7913">t</a> = <a class="code" href="class_g_f_p2___o_n_b.html#12a3de839303bf309ed57d38659a85a9">modp</a>.Inverse(<a class="code" href="class_g_f_p2___o_n_b.html#12a3de839303bf309ed57d38659a85a9">modp</a>.ConvertIn(a));<a name="l00059"></a>00059 <span class="keywordflow">return</span> <a class="code" href="class_g_f_p2_element.html" title="an element of GF(p^2)">GFP2Element</a>(<a class="code" href="class_g_f_p2___o_n_b.html#69c8bc73d2d4a07ba6df46b12c8e7913">t</a>, t);<a name="l00060"></a>00060 }<a name="l00061"></a>00061 <a name="l00062"></a><a class="code" href="class_g_f_p2___o_n_b.html#5969dd8c756805ff47f7fdeaa4c7205f">00062</a> <a class="code" href="class_g_f_p2_element.html" title="an element of GF(p^2)">GFP2Element</a> <a class="code" href="class_g_f_p2___o_n_b.html#39b2b3a19f057b43e44159d3ca477861">ConvertIn</a>(<span class="keyword">const</span> <a class="code" href="class_g_f_p2_element.html" title="an element of GF(p^2)">GFP2Element</a> &a)<span class="keyword"> const</span><a name="l00063"></a>00063 <span class="keyword"> </span>{<span class="keywordflow">return</span> <a class="code" href="class_g_f_p2_element.html" title="an element of GF(p^2)">GFP2Element</a>(<a class="code" href="class_g_f_p2___o_n_b.html#12a3de839303bf309ed57d38659a85a9">modp</a>.ConvertIn(a.<a class="code" href="class_g_f_p2_element.html#65778354421ad2da42fce4221e6da05c">c1</a>), <a class="code" href="class_g_f_p2___o_n_b.html#12a3de839303bf309ed57d38659a85a9">modp</a>.ConvertIn(a.<a class="code" href="class_g_f_p2_element.html#1688b28610e1b080a9304daad7c73bbb">c2</a>));}<a name="l00064"></a>00064 <a name="l00065"></a><a class="code" href="class_g_f_p2___o_n_b.html#5b3e339ae0781608ff4e53d8b2808cd2">00065</a> <a class="code" href="class_g_f_p2_element.html" title="an element of GF(p^2)">GFP2Element</a> <a class="code" href="class_g_f_p2___o_n_b.html#5b3e339ae0781608ff4e53d8b2808cd2">ConvertOut</a>(<span class="keyword">const</span> <a class="code" href="class_g_f_p2_element.html" title="an element of GF(p^2)">GFP2Element</a> &a)<span class="keyword"> const</span><a name="l00066"></a>00066 <span class="keyword"> </span>{<span class="keywordflow">return</span> <a class="code" href="class_g_f_p2_element.html" title="an element of GF(p^2)">GFP2Element</a>(<a class="code" href="class_g_f_p2___o_n_b.html#12a3de839303bf309ed57d38659a85a9">modp</a>.ConvertOut(a.<a class="code" href="class_g_f_p2_element.html#65778354421ad2da42fce4221e6da05c">c1</a>), <a class="code" href="class_g_f_p2___o_n_b.html#12a3de839303bf309ed57d38659a85a9">modp</a>.ConvertOut(a.<a class="code" href="class_g_f_p2_element.html#1688b28610e1b080a9304daad7c73bbb">c2</a>));}<a name="l00067"></a>00067 <a name="l00068"></a><a class="code" href="class_g_f_p2___o_n_b.html#c8800fcda3f15373fd4bf8ae2bcfd0aa">00068</a> <span class="keywordtype">bool</span> <a class="code" href="class_g_f_p2___o_n_b.html#c8800fcda3f15373fd4bf8ae2bcfd0aa">Equal</a>(<span class="keyword">const</span> <a class="code" href="class_g_f_p2_element.html" title="an element of GF(p^2)">GFP2Element</a> &a, <span class="keyword">const</span> <a class="code" href="class_g_f_p2_element.html" title="an element of GF(p^2)">GFP2Element</a> &b)<span class="keyword"> const</span><a name="l00069"></a>00069 <span class="keyword"> </span>{<a name="l00070"></a>00070 <span class="keywordflow">return</span> <a class="code" href="class_g_f_p2___o_n_b.html#12a3de839303bf309ed57d38659a85a9">modp</a>.Equal(a.<a class="code" href="class_g_f_p2_element.html#65778354421ad2da42fce4221e6da05c">c1</a>, b.<a class="code" href="class_g_f_p2_element.html#65778354421ad2da42fce4221e6da05c">c1</a>) && <a class="code" href="class_g_f_p2___o_n_b.html#12a3de839303bf309ed57d38659a85a9">modp</a>.Equal(a.<a class="code" href="class_g_f_p2_element.html#1688b28610e1b080a9304daad7c73bbb">c2</a>, b.<a class="code" href="class_g_f_p2_element.html#1688b28610e1b080a9304daad7c73bbb">c2</a>);<a name="l00071"></a>00071 }<a name="l00072"></a>00072 <a name="l00073"></a><a class="code" href="class_g_f_p2___o_n_b.html#386495ffc3d413f461a9001fe6f30642">00073</a> <span class="keyword">const</span> <a class="code" href="class_g_f_p2_element.html" title="an element of GF(p^2)">Element</a>& <a class="code" href="class_g_f_p2___o_n_b.html#386495ffc3d413f461a9001fe6f30642">Identity</a>()<span class="keyword"> const</span><a name="l00074"></a>00074 <span class="keyword"> </span>{<a name="l00075"></a>00075 <span class="keywordflow">return</span> <a class="code" href="class_g_f_p2_element.html#3665b10709f2a819bcb9e52ca5002d09">GFP2Element::Zero</a>();<a name="l00076"></a>00076 }<a name="l00077"></a>00077 <a name="l00078"></a><a class="code" href="class_g_f_p2___o_n_b.html#bd707cb221dd44914e8cde2839ad90c7">00078</a> <span class="keyword">const</span> <a class="code" href="class_g_f_p2_element.html" title="an element of GF(p^2)">Element</a>& <a class="code" href="class_g_f_p2___o_n_b.html#bd707cb221dd44914e8cde2839ad90c7">Add</a>(<span class="keyword">const</span> <a class="code" href="class_g_f_p2_element.html" title="an element of GF(p^2)">Element</a> &a, <span class="keyword">const</span> <a class="code" href="class_g_f_p2_element.html" title="an element of GF(p^2)">Element</a> &b)<span class="keyword"> const</span><a name="l00079"></a>00079 <span class="keyword"> </span>{<a name="l00080"></a>00080 <a class="code" href="class_g_f_p2___o_n_b.html#4a8985727330598468dfbeb04cad772d">result</a>.<a class="code" href="class_g_f_p2_element.html#65778354421ad2da42fce4221e6da05c">c1</a> = <a class="code" href="class_g_f_p2___o_n_b.html#12a3de839303bf309ed57d38659a85a9">modp</a>.Add(a.<a class="code" href="class_g_f_p2_element.html#65778354421ad2da42fce4221e6da05c">c1</a>, b.<a class="code" href="class_g_f_p2_element.html#65778354421ad2da42fce4221e6da05c">c1</a>);<a name="l00081"></a>00081 <a class="code" href="class_g_f_p2___o_n_b.html#4a8985727330598468dfbeb04cad772d">result</a>.<a class="code" href="class_g_f_p2_element.html#1688b28610e1b080a9304daad7c73bbb">c2</a> = <a class="code" href="class_g_f_p2___o_n_b.html#12a3de839303bf309ed57d38659a85a9">modp</a>.Add(a.<a class="code" href="class_g_f_p2_element.html#1688b28610e1b080a9304daad7c73bbb">c2</a>, b.<a class="code" href="class_g_f_p2_element.html#1688b28610e1b080a9304daad7c73bbb">c2</a>);<a name="l00082"></a>00082 <span class="keywordflow">return</span> <a class="code" href="class_g_f_p2___o_n_b.html#4a8985727330598468dfbeb04cad772d">result</a>;<a name="l00083"></a>00083 }<a name="l00084"></a>00084 <a name="l00085"></a><a class="code" href="class_g_f_p2___o_n_b.html#b1af91deb580a1279fd49390b6f186a6">00085</a> <span class="keyword">const</span> <a class="code" href="class_g_f_p2_element.html" title="an element of GF(p^2)">Element</a>& <a class="code" href="class_g_f_p2___o_n_b.html#b1af91deb580a1279fd49390b6f186a6">Inverse</a>(<span class="keyword">const</span> <a class="code" href="class_g_f_p2_element.html" title="an element of GF(p^2)">Element</a> &a)<span class="keyword"> const</span><a name="l00086"></a>00086 <span class="keyword"> </span>{<a name="l00087"></a>00087 <a class="code" href="class_g_f_p2___o_n_b.html#4a8985727330598468dfbeb04cad772d">result</a>.<a class="code" href="class_g_f_p2_element.html#65778354421ad2da42fce4221e6da05c">c1</a> = <a class="code" href="class_g_f_p2___o_n_b.html#12a3de839303bf309ed57d38659a85a9">modp</a>.Inverse(a.<a class="code" href="class_g_f_p2_element.html#65778354421ad2da42fce4221e6da05c">c1</a>);<a name="l00088"></a>00088 <a class="code" href="class_g_f_p2___o_n_b.html#4a8985727330598468dfbeb04cad772d">result</a>.<a class="code" href="class_g_f_p2_element.html#1688b28610e1b080a9304daad7c73bbb">c2</a> = <a class="code" href="class_g_f_p2___o_n_b.html#12a3de839303bf309ed57d38659a85a9">modp</a>.Inverse(a.<a class="code" href="class_g_f_p2_element.html#1688b28610e1b080a9304daad7c73bbb">c2</a>);<a name="l00089"></a>00089 <span class="keywordflow">return</span> <a class="code" href="class_g_f_p2___o_n_b.html#4a8985727330598468dfbeb04cad772d">result</a>;<a name="l00090"></a>00090 }<a name="l00091"></a>00091 <a name="l00092"></a><a class="code" href="class_g_f_p2___o_n_b.html#1211f09b8e18a97c367f34212771d184">00092</a> <span class="keyword">const</span> <a class="code" href="class_g_f_p2_element.html" title="an element of GF(p^2)">Element</a>& <a class="code" href="class_g_f_p2___o_n_b.html#1211f09b8e18a97c367f34212771d184">Double</a>(<span class="keyword">const</span> <a class="code" href="class_g_f_p2_element.html" title="an element of GF(p^2)">Element</a> &a)<span class="keyword"> const</span><a name="l00093"></a>00093 <span class="keyword"> </span>{<a name="l00094"></a>00094 <a class="code" href="class_g_f_p2___o_n_b.html#4a8985727330598468dfbeb04cad772d">result</a>.<a class="code" href="class_g_f_p2_element.html#65778354421ad2da42fce4221e6da05c">c1</a> = <a class="code" href="class_g_f_p2___o_n_b.html#12a3de839303bf309ed57d38659a85a9">modp</a>.Double(a.<a class="code" href="class_g_f_p2_element.html#65778354421ad2da42fce4221e6da05c">c1</a>);<a name="l00095"></a>00095 <a class="code" href="class_g_f_p2___o_n_b.html#4a8985727330598468dfbeb04cad772d">result</a>.<a class="code" href="class_g_f_p2_element.html#1688b28610e1b080a9304daad7c73bbb">c2</a> = <a class="code" href="class_g_f_p2___o_n_b.html#12a3de839303bf309ed57d38659a85a9">modp</a>.Double(a.<a class="code" href="class_g_f_p2_element.html#1688b28610e1b080a9304daad7c73bbb">c2</a>);<a name="l00096"></a>00096 <span class="keywordflow">return</span> <a class="code" href="class_g_f_p2___o_n_b.html#4a8985727330598468dfbeb04cad772d">result</a>;<a name="l00097"></a>00097 }<a name="l00098"></a>00098 <a name="l00099"></a><a class="code" href="class_g_f_p2___o_n_b.html#edbcc151eca01f823b6d8c34f792fad9">00099</a> <span class="keyword">const</span> <a class="code" href="class_g_f_p2_element.html" title="an element of GF(p^2)">Element</a>& <a class="code" href="class_g_f_p2___o_n_b.html#edbcc151eca01f823b6d8c34f792fad9">Subtract</a>(<span class="keyword">const</span> <a class="code" href="class_g_f_p2_element.html" title="an element of GF(p^2)">Element</a> &a, <span class="keyword">const</span> <a class="code" href="class_g_f_p2_element.html" title="an element of GF(p^2)">Element</a> &b)<span class="keyword"> const</span><a name="l00100"></a>00100 <span class="keyword"> </span>{<a name="l00101"></a>00101 <a class="code" href="class_g_f_p2___o_n_b.html#4a8985727330598468dfbeb04cad772d">result</a>.<a class="code" href="class_g_f_p2_element.html#65778354421ad2da42fce4221e6da05c">c1</a> = <a class="code" href="class_g_f_p2___o_n_b.html#12a3de839303bf309ed57d38659a85a9">modp</a>.Subtract(a.<a class="code" href="class_g_f_p2_element.html#65778354421ad2da42fce4221e6da05c">c1</a>, b.<a class="code" href="class_g_f_p2_element.html#65778354421ad2da42fce4221e6da05c">c1</a>);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -