pqc/ntru__poly_8c_source.html
travis-ci ca575303bf Lastest doxygen docs updated
travis build: 25
	commit: 05b02f5624f2054cdf2e802f63c834162c2fe05b
	auto-pushed to gh-pages
2014-06-08 21:44:14 +00:00

680 lines
47 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=9"/>
<title>post quantum cryptography: /home/travis/build/hasufell/pqc/src/ntru_poly.c Source File</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
<link href="doxygen.css" rel="stylesheet" type="text/css" />
<link href="search/search.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="search/search.js"></script>
<script type="text/javascript">
$(document).ready(function() { searchBox.OnSelectItem(0); });
</script>
</head>
<body>
<div id="top"><!-- do not remove this div! -->
<div id="titlearea">
<table cellspacing="0" cellpadding="0">
<tbody>
<tr style="height: 56px;">
<td style="padding-left: 0.5em;">
<div id="projectname">post quantum cryptography
</div>
<div id="projectbrief">Highly optimized implementation of the NTRUEncrypt algorithm</div>
</td>
</tr>
</tbody>
</table>
</div>
<!-- Generated by Doxygen 1.7.6.1 -->
<script type="text/javascript">
var searchBox = new SearchBox("searchBox", "search",false,'Search');
</script>
<div id="navrow1" class="tabs">
<ul class="tablist">
<li><a href="index.html"><span>Main&#160;Page</span></a></li>
<li><a href="annotated.html"><span>Data&#160;Structures</span></a></li>
<li class="current"><a href="files.html"><span>Files</span></a></li>
<li>
<div id="MSearchBox" class="MSearchBoxInactive">
<span class="left">
<img id="MSearchSelect" src="search/mag_sel.png"
onmouseover="return searchBox.OnSearchSelectShow()"
onmouseout="return searchBox.OnSearchSelectHide()"
alt=""/>
<input type="text" id="MSearchField" value="Search" accesskey="S"
onfocus="searchBox.OnSearchFieldFocus(true)"
onblur="searchBox.OnSearchFieldFocus(false)"
onkeyup="searchBox.OnSearchFieldChange(event)"/>
</span><span class="right">
<a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
</span>
</div>
</li>
</ul>
</div>
<div id="navrow2" class="tabs2">
<ul class="tablist">
<li><a href="files.html"><span>File&#160;List</span></a></li>
<li><a href="globals.html"><span>Globals</span></a></li>
</ul>
</div>
</div>
<div class="header">
<div class="headertitle">
<div class="title">/home/travis/build/hasufell/pqc/src/ntru_poly.c</div> </div>
</div><!--header-->
<div class="contents">
<a href="ntru__poly_8c.html">Go to the documentation of this file.</a><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="comment">/*</span>
<a name="l00002"></a>00002 <span class="comment"> * Copyright (C) 2014 FH Bielefeld</span>
<a name="l00003"></a>00003 <span class="comment"> *</span>
<a name="l00004"></a>00004 <span class="comment"> * This file is part of a FH Bielefeld project.</span>
<a name="l00005"></a>00005 <span class="comment"> *</span>
<a name="l00006"></a>00006 <span class="comment"> * This library is free software; you can redistribute it and/or</span>
<a name="l00007"></a>00007 <span class="comment"> * modify it under the terms of the GNU Lesser General Public</span>
<a name="l00008"></a>00008 <span class="comment"> * License as published by the Free Software Foundation; either</span>
<a name="l00009"></a>00009 <span class="comment"> * version 2.1 of the License, or (at your option) any later version.</span>
<a name="l00010"></a>00010 <span class="comment"> *</span>
<a name="l00011"></a>00011 <span class="comment"> * This library is distributed in the hope that it will be useful,</span>
<a name="l00012"></a>00012 <span class="comment"> * but WITHOUT ANY WARRANTY; without even the implied warranty of</span>
<a name="l00013"></a>00013 <span class="comment"> * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU</span>
<a name="l00014"></a>00014 <span class="comment"> * Lesser General Public License for more details.</span>
<a name="l00015"></a>00015 <span class="comment"> *</span>
<a name="l00016"></a>00016 <span class="comment"> * You should have received a copy of the GNU Lesser General Public</span>
<a name="l00017"></a>00017 <span class="comment"> * License along with this library; if not, write to the Free Software</span>
<a name="l00018"></a>00018 <span class="comment"> * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,</span>
<a name="l00019"></a>00019 <span class="comment"> * MA 02110-1301 USA</span>
<a name="l00020"></a>00020 <span class="comment"> */</span>
<a name="l00021"></a>00021
<a name="l00030"></a>00030 <span class="preprocessor">#include &quot;<a class="code" href="ntru__err_8h.html" title="error handling">ntru_err.h</a>&quot;</span>
<a name="l00031"></a>00031 <span class="preprocessor">#include &quot;<a class="code" href="ntru__mem_8h.html" title="header for ntru_mem.c">ntru_mem.h</a>&quot;</span>
<a name="l00032"></a>00032 <span class="preprocessor">#include &quot;<a class="code" href="ntru__params_8h.html" title="NTRU parameters.">ntru_params.h</a>&quot;</span>
<a name="l00033"></a>00033 <span class="preprocessor">#include &quot;<a class="code" href="ntru__poly_8h.html" title="header for ntru_poly.c">ntru_poly.h</a>&quot;</span>
<a name="l00034"></a>00034
<a name="l00035"></a>00035 <span class="preprocessor">#include &lt;stdarg.h&gt;</span>
<a name="l00036"></a>00036 <span class="preprocessor">#include &lt;stdbool.h&gt;</span>
<a name="l00037"></a>00037 <span class="preprocessor">#include &lt;stdint.h&gt;</span>
<a name="l00038"></a>00038 <span class="preprocessor">#include &lt;stdio.h&gt;</span>
<a name="l00039"></a>00039 <span class="preprocessor">#include &lt;stdlib.h&gt;</span>
<a name="l00040"></a>00040 <span class="preprocessor">#include &lt;sys/types.h&gt;</span>
<a name="l00041"></a>00041
<a name="l00042"></a>00042 <span class="preprocessor">#include &lt;fmpz_poly.h&gt;</span>
<a name="l00043"></a>00043 <span class="preprocessor">#include &lt;fmpz.h&gt;</span>
<a name="l00044"></a>00044
<a name="l00045"></a>00045
<a name="l00054"></a>00054 <span class="keyword">static</span>
<a name="l00055"></a>00055 <span class="keywordtype">void</span> <a class="code" href="ntru__poly_8c.html#a891af13dc4355c9fab9ca3fafcac8054">poly_mod2_to_modq</a>(<span class="keyword">const</span> fmpz_poly_t a,
<a name="l00056"></a>00056 fmpz_poly_t Fq,
<a name="l00057"></a>00057 <span class="keyword">const</span> <a class="code" href="structntru__params.html">ntru_params</a> *params);
<a name="l00058"></a>00058
<a name="l00059"></a>00059
<a name="l00060"></a>00060 <span class="comment">/*------------------------------------------------------------------------*/</span>
<a name="l00061"></a>00061
<a name="l00062"></a>00062 <span class="keyword">static</span> <span class="keywordtype">void</span>
<a name="l00063"></a><a class="code" href="ntru__poly_8c.html#a891af13dc4355c9fab9ca3fafcac8054">00063</a> <a class="code" href="ntru__poly_8c.html#a891af13dc4355c9fab9ca3fafcac8054">poly_mod2_to_modq</a>(<span class="keyword">const</span> fmpz_poly_t a,
<a name="l00064"></a>00064 fmpz_poly_t Fq,
<a name="l00065"></a>00065 <span class="keyword">const</span> <a class="code" href="structntru__params.html">ntru_params</a> *params)
<a name="l00066"></a>00066 {
<a name="l00067"></a>00067 <span class="keywordtype">int</span> v = 2;
<a name="l00068"></a>00068 fmpz_poly_t poly_tmp, two;
<a name="l00069"></a>00069
<a name="l00070"></a>00070 fmpz_poly_init(poly_tmp);
<a name="l00071"></a>00071 fmpz_poly_zero(poly_tmp);
<a name="l00072"></a>00072 fmpz_poly_init(two);
<a name="l00073"></a>00073 fmpz_poly_set_coeff_ui(two, 0, 2);
<a name="l00074"></a>00074
<a name="l00075"></a>00075 <span class="keywordflow">while</span> (v &lt; (<span class="keywordtype">int</span>)(params-&gt;<a class="code" href="structntru__params.html#a29680750bda49dc93e61a752b2f2a0f7">q</a>)) {
<a name="l00076"></a>00076 v = v * 2;
<a name="l00077"></a>00077
<a name="l00078"></a>00078 <a class="code" href="ntru__poly_8c.html#ae96f479ddd97af709a0ed50817fd3fb3">poly_starmultiply</a>(a, Fq, poly_tmp, params, v);
<a name="l00079"></a>00079 fmpz_poly_sub(poly_tmp, two, poly_tmp);
<a name="l00080"></a>00080 <a class="code" href="ntru__poly_8c.html#ae7d0d8364dba689df3fb4904610634cc">fmpz_poly_mod_unsigned</a>(poly_tmp, v);
<a name="l00081"></a>00081 <a class="code" href="ntru__poly_8c.html#ae96f479ddd97af709a0ed50817fd3fb3">poly_starmultiply</a>(Fq, poly_tmp, Fq, params, v);
<a name="l00082"></a>00082
<a name="l00083"></a>00083 }
<a name="l00084"></a>00084
<a name="l00085"></a>00085 fmpz_poly_clear(poly_tmp);
<a name="l00086"></a>00086 fmpz_poly_clear(two);
<a name="l00087"></a>00087
<a name="l00088"></a>00088 }
<a name="l00089"></a>00089
<a name="l00090"></a>00090 <span class="comment">/*------------------------------------------------------------------------*/</span>
<a name="l00091"></a>00091
<a name="l00092"></a>00092 <span class="keywordtype">int</span>
<a name="l00093"></a><a class="code" href="ntru__poly_8h.html#aaaac83ec72414aa208832442657c3520">00093</a> <a class="code" href="ntru__poly_8c.html#aaaac83ec72414aa208832442657c3520">fmpz_cmp_si_n</a>(<span class="keyword">const</span> fmpz_t f, slong g)
<a name="l00094"></a>00094 {
<a name="l00095"></a>00095 fmpz_t f_cmp;
<a name="l00096"></a>00096
<a name="l00097"></a>00097 fmpz_init(f_cmp);
<a name="l00098"></a>00098
<a name="l00099"></a>00099 <span class="keywordflow">if</span> (f)
<a name="l00100"></a>00100 fmpz_set(f_cmp, f);
<a name="l00101"></a>00101 <span class="keywordflow">else</span>
<a name="l00102"></a>00102 fmpz_set_si(f_cmp, 0);
<a name="l00103"></a>00103
<a name="l00104"></a>00104 <span class="keywordflow">return</span> fmpz_cmp_si(f_cmp, g);
<a name="l00105"></a>00105 }
<a name="l00106"></a>00106
<a name="l00107"></a>00107 <span class="comment">/*------------------------------------------------------------------------*/</span>
<a name="l00108"></a>00108
<a name="l00109"></a>00109 <span class="keywordtype">void</span>
<a name="l00110"></a><a class="code" href="ntru_8h.html#a20f86085d5eb5372fd25dc270069d38c">00110</a> <a class="code" href="ntru__poly_8c.html#a20f86085d5eb5372fd25dc270069d38c">poly_new</a>(fmpz_poly_t new_poly,
<a name="l00111"></a>00111 <span class="keywordtype">int</span> <span class="keyword">const</span> * <span class="keyword">const</span> c,
<a name="l00112"></a>00112 <span class="keyword">const</span> <span class="keywordtype">size_t</span> len)
<a name="l00113"></a>00113 {
<a name="l00114"></a>00114 fmpz_poly_init(new_poly);
<a name="l00115"></a>00115
<a name="l00116"></a>00116 <span class="keywordflow">for</span> (uint32_t i = 0; i &lt; len; i++)
<a name="l00117"></a>00117 fmpz_poly_set_coeff_si(new_poly, i, c[i]);
<a name="l00118"></a>00118 }
<a name="l00119"></a>00119
<a name="l00120"></a>00120 <span class="comment">/*------------------------------------------------------------------------*/</span>
<a name="l00121"></a>00121
<a name="l00122"></a>00122 <span class="keywordtype">void</span>
<a name="l00123"></a><a class="code" href="ntru_8h.html#a27ff2116f70bcbf5028219adcae4c5f0">00123</a> <a class="code" href="ntru__poly_8c.html#a27ff2116f70bcbf5028219adcae4c5f0">poly_delete</a>(fmpz_poly_t poly)
<a name="l00124"></a>00124 {
<a name="l00125"></a>00125 fmpz_poly_clear(poly);
<a name="l00126"></a>00126 }
<a name="l00127"></a>00127
<a name="l00128"></a>00128 <span class="comment">/*------------------------------------------------------------------------*/</span>
<a name="l00129"></a>00129
<a name="l00130"></a>00130 <span class="keywordtype">void</span>
<a name="l00131"></a><a class="code" href="ntru_8h.html#a3f53c63383ff301b20dcede0783869a7">00131</a> <a class="code" href="ntru__poly_8c.html#a3f53c63383ff301b20dcede0783869a7">poly_delete_array</a>(fmpz_poly_t **poly_array)
<a name="l00132"></a>00132 {
<a name="l00133"></a>00133 uint32_t i = 0;
<a name="l00134"></a>00134
<a name="l00135"></a>00135 <span class="keywordflow">while</span>(poly_array[i]) {
<a name="l00136"></a>00136 <a class="code" href="ntru__poly_8c.html#a27ff2116f70bcbf5028219adcae4c5f0">poly_delete</a>(*(poly_array[i]));
<a name="l00137"></a>00137 free(poly_array[i]);
<a name="l00138"></a>00138 i++;
<a name="l00139"></a>00139 }
<a name="l00140"></a>00140
<a name="l00141"></a>00141 <span class="comment">/* avoid double free */</span>
<a name="l00142"></a>00142 <span class="keywordflow">if</span> (i &gt; 1)
<a name="l00143"></a>00143 free(poly_array);
<a name="l00144"></a>00144 }
<a name="l00145"></a>00145
<a name="l00146"></a>00146 <span class="comment">/*------------------------------------------------------------------------*/</span>
<a name="l00147"></a>00147
<a name="l00148"></a>00148 <span class="keywordtype">void</span>
<a name="l00149"></a><a class="code" href="ntru_8h.html#a83297bc2ab5b6e7ce42553570dd8268f">00149</a> <a class="code" href="ntru__poly_8c.html#a83297bc2ab5b6e7ce42553570dd8268f">poly_delete_all</a>(fmpz_poly_t poly, ...)
<a name="l00150"></a>00150 {
<a name="l00151"></a>00151 fmpz_poly_struct *next_poly;
<a name="l00152"></a>00152 va_list args;
<a name="l00153"></a>00153
<a name="l00154"></a>00154 next_poly = poly;
<a name="l00155"></a>00155 va_start(args, poly);
<a name="l00156"></a>00156 <span class="keywordflow">while</span> (next_poly != NULL) {
<a name="l00157"></a>00157 <a class="code" href="ntru__poly_8c.html#a27ff2116f70bcbf5028219adcae4c5f0">poly_delete</a>(next_poly);
<a name="l00158"></a>00158 next_poly = va_arg(args, fmpz_poly_struct*);
<a name="l00159"></a>00159 }
<a name="l00160"></a>00160 va_end(args);
<a name="l00161"></a>00161 }
<a name="l00162"></a>00162
<a name="l00163"></a>00163 <span class="comment">/*------------------------------------------------------------------------*/</span>
<a name="l00164"></a>00164
<a name="l00165"></a>00165 <span class="keywordtype">void</span>
<a name="l00166"></a><a class="code" href="ntru__poly_8h.html#ae7d0d8364dba689df3fb4904610634cc">00166</a> <a class="code" href="ntru__poly_8c.html#ae7d0d8364dba689df3fb4904610634cc">fmpz_poly_mod_unsigned</a>(fmpz_poly_t a,
<a name="l00167"></a>00167 <span class="keyword">const</span> uint32_t mod)
<a name="l00168"></a>00168 {
<a name="l00169"></a>00169 nmod_poly_t nmod_tmp;
<a name="l00170"></a>00170
<a name="l00171"></a>00171 nmod_poly_init(nmod_tmp, mod);
<a name="l00172"></a>00172
<a name="l00173"></a>00173 fmpz_poly_get_nmod_poly(nmod_tmp, a);
<a name="l00174"></a>00174 fmpz_poly_set_nmod_poly_unsigned(a, nmod_tmp);
<a name="l00175"></a>00175
<a name="l00176"></a>00176 nmod_poly_clear(nmod_tmp);
<a name="l00177"></a>00177 }
<a name="l00178"></a>00178
<a name="l00179"></a>00179 <span class="comment">/*------------------------------------------------------------------------*/</span>
<a name="l00180"></a>00180
<a name="l00181"></a>00181 <span class="keywordtype">void</span>
<a name="l00182"></a><a class="code" href="ntru__poly_8h.html#a7c4f5e96355518dc97a23da8f34b661a">00182</a> <a class="code" href="ntru__poly_8c.html#a7c4f5e96355518dc97a23da8f34b661a">fmpz_poly_mod</a>(fmpz_poly_t a,
<a name="l00183"></a>00183 <span class="keyword">const</span> uint32_t mod)
<a name="l00184"></a>00184 {
<a name="l00185"></a>00185 nmod_poly_t nmod_tmp;
<a name="l00186"></a>00186
<a name="l00187"></a>00187 nmod_poly_init(nmod_tmp, mod);
<a name="l00188"></a>00188
<a name="l00189"></a>00189 fmpz_poly_get_nmod_poly(nmod_tmp, a);
<a name="l00190"></a>00190 fmpz_poly_set_nmod_poly(a, nmod_tmp);
<a name="l00191"></a>00191
<a name="l00192"></a>00192 nmod_poly_clear(nmod_tmp);
<a name="l00193"></a>00193 }
<a name="l00194"></a>00194
<a name="l00195"></a>00195 <span class="comment">/*------------------------------------------------------------------------*/</span>
<a name="l00196"></a>00196
<a name="l00197"></a>00197 <span class="keywordtype">void</span>
<a name="l00198"></a><a class="code" href="ntru__poly_8h.html#ab1f966fe680d1ce7c19c8c812d1932a7">00198</a> <a class="code" href="ntru__poly_8c.html#ab1f966fe680d1ce7c19c8c812d1932a7">fmpz_poly_set_coeff_fmpz_n</a>(fmpz_poly_t poly, slong n,
<a name="l00199"></a>00199 <span class="keyword">const</span> fmpz_t x)
<a name="l00200"></a>00200 {
<a name="l00201"></a>00201 <span class="keywordflow">if</span> (x)
<a name="l00202"></a>00202 fmpz_poly_set_coeff_fmpz(poly, n, x);
<a name="l00203"></a>00203 <span class="keywordflow">else</span>
<a name="l00204"></a>00204 fmpz_poly_set_coeff_si(poly, n, 0);
<a name="l00205"></a>00205 }
<a name="l00206"></a>00206
<a name="l00207"></a>00207 <span class="comment">/*------------------------------------------------------------------------*/</span>
<a name="l00208"></a>00208
<a name="l00209"></a>00209 <span class="keywordtype">int</span>
<a name="l00210"></a><a class="code" href="ntru__poly_8h.html#a59da1b7962829af8f18d58c05f588606">00210</a> <a class="code" href="ntru__poly_8c.html#a59da1b7962829af8f18d58c05f588606">fmpz_invmod_ui</a>(fmpz_t f, <span class="keyword">const</span> fmpz_t g, <span class="keyword">const</span> uint32_t mod)
<a name="l00211"></a>00211 {
<a name="l00212"></a>00212 fmpz_t modulus;
<a name="l00213"></a>00213
<a name="l00214"></a>00214 fmpz_init_set_ui(modulus, mod);
<a name="l00215"></a>00215
<a name="l00216"></a>00216 <span class="keywordflow">return</span> fmpz_invmod(f, g, modulus);
<a name="l00217"></a>00217 }
<a name="l00218"></a>00218
<a name="l00219"></a>00219 <span class="comment">/*------------------------------------------------------------------------*/</span>
<a name="l00220"></a>00220
<a name="l00221"></a>00221 <span class="keywordtype">void</span>
<a name="l00222"></a><a class="code" href="ntru__poly_8h.html#ad2a11e832808ef1cfee0eed1cc02f4b9">00222</a> <a class="code" href="ntru__poly_8c.html#ad2a11e832808ef1cfee0eed1cc02f4b9">fmpz_add_n</a>(fmpz_t f, <span class="keyword">const</span> fmpz_t g, <span class="keyword">const</span> fmpz_t h)
<a name="l00223"></a>00223 {
<a name="l00224"></a>00224 <span class="keywordflow">if</span> (!g &amp;&amp; !h) {
<a name="l00225"></a>00225 fmpz_zero(f);
<a name="l00226"></a>00226 } <span class="keywordflow">else</span> {
<a name="l00227"></a>00227 <span class="keywordflow">if</span> (!g &amp;&amp; h)
<a name="l00228"></a>00228 fmpz_add_ui(f, h, 0);
<a name="l00229"></a>00229 <span class="keywordflow">else</span> <span class="keywordflow">if</span> (g &amp;&amp; !h)
<a name="l00230"></a>00230 fmpz_add_ui(f, g, 0);
<a name="l00231"></a>00231 <span class="keywordflow">else</span>
<a name="l00232"></a>00232 fmpz_add(f, g, h);
<a name="l00233"></a>00233 }
<a name="l00234"></a>00234 }
<a name="l00235"></a>00235
<a name="l00236"></a>00236 <span class="comment">/*------------------------------------------------------------------------*/</span>
<a name="l00237"></a>00237
<a name="l00238"></a>00238 <span class="keywordtype">void</span>
<a name="l00239"></a><a class="code" href="ntru__poly_8h.html#ae96f479ddd97af709a0ed50817fd3fb3">00239</a> <a class="code" href="ntru__poly_8c.html#ae96f479ddd97af709a0ed50817fd3fb3">poly_starmultiply</a>(<span class="keyword">const</span> fmpz_poly_t a,
<a name="l00240"></a>00240 <span class="keyword">const</span> fmpz_poly_t b,
<a name="l00241"></a>00241 fmpz_poly_t c,
<a name="l00242"></a>00242 <span class="keyword">const</span> <a class="code" href="structntru__params.html">ntru_params</a> *params,
<a name="l00243"></a>00243 uint32_t modulus)
<a name="l00244"></a>00244 {
<a name="l00245"></a>00245 fmpz_poly_t a_tmp;
<a name="l00246"></a>00246 fmpz_t c_coeff_k;
<a name="l00247"></a>00247
<a name="l00248"></a>00248 fmpz_poly_init(a_tmp);
<a name="l00249"></a>00249 fmpz_init(c_coeff_k);
<a name="l00250"></a>00250
<a name="l00251"></a>00251 <span class="comment">/* avoid side effects */</span>
<a name="l00252"></a>00252 fmpz_poly_set(a_tmp, a);
<a name="l00253"></a>00253 fmpz_poly_zero(c);
<a name="l00254"></a>00254
<a name="l00255"></a>00255 <span class="keywordflow">for</span> (<span class="keywordtype">int</span> k = params-&gt;<a class="code" href="structntru__params.html#afb8425ee3db2b917b3c4e8d9b75bd3ff">N</a> - 1; k &gt;= 0; k--) {
<a name="l00256"></a>00256 <span class="keywordtype">int</span> j;
<a name="l00257"></a>00257
<a name="l00258"></a>00258 j = k + 1;
<a name="l00259"></a>00259
<a name="l00260"></a>00260 fmpz_set_si(c_coeff_k, 0);
<a name="l00261"></a>00261
<a name="l00262"></a>00262 <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = params-&gt;<a class="code" href="structntru__params.html#afb8425ee3db2b917b3c4e8d9b75bd3ff">N</a> - 1; i &gt;= 0; i--) {
<a name="l00263"></a>00263 fmpz *a_tmp_coeff_i,
<a name="l00264"></a>00264 *b_coeff_j;
<a name="l00265"></a>00265
<a name="l00266"></a>00266 <span class="keywordflow">if</span> (j == (<span class="keywordtype">int</span>)(params-&gt;<a class="code" href="structntru__params.html#afb8425ee3db2b917b3c4e8d9b75bd3ff">N</a>))
<a name="l00267"></a>00267 j = 0;
<a name="l00268"></a>00268
<a name="l00269"></a>00269 a_tmp_coeff_i = fmpz_poly_get_coeff_ptr(a_tmp, i);
<a name="l00270"></a>00270 b_coeff_j = fmpz_poly_get_coeff_ptr(b, j);
<a name="l00271"></a>00271
<a name="l00272"></a>00272 <span class="keywordflow">if</span> (<a class="code" href="ntru__poly_8c.html#aaaac83ec72414aa208832442657c3520">fmpz_cmp_si_n</a>(a_tmp_coeff_i, 0) &amp;&amp;
<a name="l00273"></a>00273 <a class="code" href="ntru__poly_8c.html#aaaac83ec72414aa208832442657c3520">fmpz_cmp_si_n</a>(b_coeff_j, 0)) {
<a name="l00274"></a>00274 fmpz_t fmpz_tmp;
<a name="l00275"></a>00275
<a name="l00276"></a>00276 fmpz_init(fmpz_tmp);
<a name="l00277"></a>00277
<a name="l00278"></a>00278 fmpz_mul(fmpz_tmp, a_tmp_coeff_i, b_coeff_j);
<a name="l00279"></a>00279 fmpz_add(fmpz_tmp, fmpz_tmp, c_coeff_k);
<a name="l00280"></a>00280 fmpz_mod_ui(c_coeff_k, fmpz_tmp, modulus);
<a name="l00281"></a>00281
<a name="l00282"></a>00282 fmpz_poly_set_coeff_fmpz(c, k, c_coeff_k);
<a name="l00283"></a>00283
<a name="l00284"></a>00284 fmpz_clear(fmpz_tmp);
<a name="l00285"></a>00285 }
<a name="l00286"></a>00286 j++;
<a name="l00287"></a>00287 }
<a name="l00288"></a>00288 fmpz_clear(c_coeff_k);
<a name="l00289"></a>00289 }
<a name="l00290"></a>00290
<a name="l00291"></a>00291 fmpz_poly_clear(a_tmp);
<a name="l00292"></a>00292 }
<a name="l00293"></a>00293
<a name="l00294"></a>00294 <span class="comment">/*------------------------------------------------------------------------*/</span>
<a name="l00295"></a>00295
<a name="l00296"></a>00296 <span class="keywordtype">bool</span>
<a name="l00297"></a><a class="code" href="ntru__poly_8h.html#ace66beb516186e52f9b5b1ed8a397849">00297</a> <a class="code" href="ntru__poly_8c.html#ace66beb516186e52f9b5b1ed8a397849">poly_inverse_poly_q</a>(<span class="keyword">const</span> fmpz_poly_t a,
<a name="l00298"></a>00298 fmpz_poly_t Fq,
<a name="l00299"></a>00299 <span class="keyword">const</span> <a class="code" href="structntru__params.html">ntru_params</a> *params)
<a name="l00300"></a>00300 {
<a name="l00301"></a>00301 <span class="keywordtype">bool</span> retval = <span class="keyword">false</span>;
<a name="l00302"></a>00302 <span class="keywordtype">int</span> k = 0,
<a name="l00303"></a>00303 j = 0;
<a name="l00304"></a>00304 fmpz *b_last;
<a name="l00305"></a>00305 fmpz_poly_t a_tmp,
<a name="l00306"></a>00306 b,
<a name="l00307"></a>00307 c,
<a name="l00308"></a>00308 f,
<a name="l00309"></a>00309 g;
<a name="l00310"></a>00310
<a name="l00311"></a>00311 <span class="comment">/* general initialization of temp variables */</span>
<a name="l00312"></a>00312 fmpz_poly_init(b);
<a name="l00313"></a>00313 fmpz_poly_set_coeff_ui(b, 0, 1);
<a name="l00314"></a>00314 fmpz_poly_init(c);
<a name="l00315"></a>00315 fmpz_poly_init(f);
<a name="l00316"></a>00316 fmpz_poly_set(f, a);
<a name="l00317"></a>00317
<a name="l00318"></a>00318 <span class="comment">/* set g(x) = x^N 1 */</span>
<a name="l00319"></a>00319 fmpz_poly_init(g);
<a name="l00320"></a>00320 fmpz_poly_set_coeff_si(g, 0, -1);
<a name="l00321"></a>00321 fmpz_poly_set_coeff_si(g, params-&gt;<a class="code" href="structntru__params.html#afb8425ee3db2b917b3c4e8d9b75bd3ff">N</a>, 1);
<a name="l00322"></a>00322
<a name="l00323"></a>00323 <span class="comment">/* avoid side effects */</span>
<a name="l00324"></a>00324 fmpz_poly_init(a_tmp);
<a name="l00325"></a>00325 fmpz_poly_set(a_tmp, a);
<a name="l00326"></a>00326 fmpz_poly_zero(Fq);
<a name="l00327"></a>00327
<a name="l00328"></a>00328 <span class="keywordflow">while</span> (1) {
<a name="l00329"></a>00329 <span class="keywordflow">while</span> (fmpz_is_zero(fmpz_poly_get_coeff_ptr(f, 0))) {
<a name="l00330"></a>00330 <span class="keywordflow">for</span> (uint32_t i = 1; i &lt;= params-&gt;<a class="code" href="structntru__params.html#afb8425ee3db2b917b3c4e8d9b75bd3ff">N</a>; i++) {
<a name="l00331"></a>00331 fmpz *f_coeff = fmpz_poly_get_coeff_ptr(f, i);
<a name="l00332"></a>00332 fmpz *c_coeff = fmpz_poly_get_coeff_ptr(c, params-&gt;<a class="code" href="structntru__params.html#afb8425ee3db2b917b3c4e8d9b75bd3ff">N</a> - i);
<a name="l00333"></a>00333
<a name="l00334"></a>00334 <span class="comment">/* f(x) = f(x) / x */</span>
<a name="l00335"></a>00335 <a class="code" href="ntru__poly_8c.html#ab1f966fe680d1ce7c19c8c812d1932a7">fmpz_poly_set_coeff_fmpz_n</a>(f, i - 1,
<a name="l00336"></a>00336 f_coeff);
<a name="l00337"></a>00337
<a name="l00338"></a>00338 <span class="comment">/* c(x) = c(x) * x */</span>
<a name="l00339"></a>00339 <a class="code" href="ntru__poly_8c.html#ab1f966fe680d1ce7c19c8c812d1932a7">fmpz_poly_set_coeff_fmpz_n</a>(c, params-&gt;<a class="code" href="structntru__params.html#afb8425ee3db2b917b3c4e8d9b75bd3ff">N</a> + 1 - i,
<a name="l00340"></a>00340 c_coeff);
<a name="l00341"></a>00341 }
<a name="l00342"></a>00342
<a name="l00343"></a>00343 fmpz_poly_set_coeff_si(f, params-&gt;<a class="code" href="structntru__params.html#afb8425ee3db2b917b3c4e8d9b75bd3ff">N</a>, 0);
<a name="l00344"></a>00344 fmpz_poly_set_coeff_si(c, 0, 0);
<a name="l00345"></a>00345
<a name="l00346"></a>00346 k++;
<a name="l00347"></a>00347
<a name="l00348"></a>00348 <span class="keywordflow">if</span> (fmpz_poly_degree(f) == -1)
<a name="l00349"></a>00349 <span class="keywordflow">goto</span> _cleanup;
<a name="l00350"></a>00350 }
<a name="l00351"></a>00351
<a name="l00352"></a>00352 <span class="keywordflow">if</span> (fmpz_poly_degree(f) == 0)
<a name="l00353"></a>00353 <span class="keywordflow">break</span>;
<a name="l00354"></a>00354
<a name="l00355"></a>00355 <span class="keywordflow">if</span> (fmpz_poly_degree(f) &lt; fmpz_poly_degree(g)) {
<a name="l00356"></a>00356 fmpz_poly_swap(f, g);
<a name="l00357"></a>00357 fmpz_poly_swap(b, c);
<a name="l00358"></a>00358 }
<a name="l00359"></a>00359
<a name="l00360"></a>00360 fmpz_poly_add(f, g, f);
<a name="l00361"></a>00361 <a class="code" href="ntru__poly_8c.html#ae7d0d8364dba689df3fb4904610634cc">fmpz_poly_mod_unsigned</a>(f, 2);
<a name="l00362"></a>00362
<a name="l00363"></a>00363 fmpz_poly_add(b, c, b);
<a name="l00364"></a>00364 <a class="code" href="ntru__poly_8c.html#ae7d0d8364dba689df3fb4904610634cc">fmpz_poly_mod_unsigned</a>(b, 2);
<a name="l00365"></a>00365 }
<a name="l00366"></a>00366
<a name="l00367"></a>00367 k = k % params-&gt;<a class="code" href="structntru__params.html#afb8425ee3db2b917b3c4e8d9b75bd3ff">N</a>;
<a name="l00368"></a>00368
<a name="l00369"></a>00369 b_last = fmpz_poly_get_coeff_ptr(b, params-&gt;<a class="code" href="structntru__params.html#afb8425ee3db2b917b3c4e8d9b75bd3ff">N</a>);
<a name="l00370"></a>00370 <span class="keywordflow">if</span> (<a class="code" href="ntru__poly_8c.html#aaaac83ec72414aa208832442657c3520">fmpz_cmp_si_n</a>(b_last, 0))
<a name="l00371"></a>00371 <span class="keywordflow">goto</span> _cleanup;
<a name="l00372"></a>00372
<a name="l00373"></a>00373 <span class="comment">/* Fq(x) = x^(N-k) * b(x) */</span>
<a name="l00374"></a>00374 <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = params-&gt;<a class="code" href="structntru__params.html#afb8425ee3db2b917b3c4e8d9b75bd3ff">N</a> - 1; i &gt;= 0; i--) {
<a name="l00375"></a>00375 fmpz *b_i;
<a name="l00376"></a>00376
<a name="l00377"></a>00377 j = i - k;
<a name="l00378"></a>00378
<a name="l00379"></a>00379 <span class="keywordflow">if</span> (j &lt; 0)
<a name="l00380"></a>00380 j = j + params-&gt;<a class="code" href="structntru__params.html#afb8425ee3db2b917b3c4e8d9b75bd3ff">N</a>;
<a name="l00381"></a>00381
<a name="l00382"></a>00382 b_i = fmpz_poly_get_coeff_ptr(b, i);
<a name="l00383"></a>00383 <a class="code" href="ntru__poly_8c.html#ab1f966fe680d1ce7c19c8c812d1932a7">fmpz_poly_set_coeff_fmpz_n</a>(Fq, j, b_i);
<a name="l00384"></a>00384 }
<a name="l00385"></a>00385
<a name="l00386"></a>00386 <a class="code" href="ntru__poly_8c.html#a891af13dc4355c9fab9ca3fafcac8054">poly_mod2_to_modq</a>(a_tmp, Fq, params);
<a name="l00387"></a>00387
<a name="l00388"></a>00388 <span class="comment">/* check if the f * Fq = 1 (mod p) condition holds true */</span>
<a name="l00389"></a>00389 fmpz_poly_set(a_tmp, a);
<a name="l00390"></a>00390 <a class="code" href="ntru__poly_8c.html#ae96f479ddd97af709a0ed50817fd3fb3">poly_starmultiply</a>(a_tmp, Fq, a_tmp, params, params-&gt;<a class="code" href="structntru__params.html#a29680750bda49dc93e61a752b2f2a0f7">q</a>);
<a name="l00391"></a>00391 <span class="keywordflow">if</span> (fmpz_poly_is_one(a_tmp))
<a name="l00392"></a>00392 retval = <span class="keyword">true</span>;
<a name="l00393"></a>00393 <span class="keywordflow">else</span>
<a name="l00394"></a>00394 fmpz_poly_zero(Fq);
<a name="l00395"></a>00395
<a name="l00396"></a>00396 _cleanup:
<a name="l00397"></a>00397 fmpz_poly_clear(a_tmp);
<a name="l00398"></a>00398 fmpz_poly_clear(b);
<a name="l00399"></a>00399 fmpz_poly_clear(c);
<a name="l00400"></a>00400 fmpz_poly_clear(f);
<a name="l00401"></a>00401 fmpz_poly_clear(g);
<a name="l00402"></a>00402
<a name="l00403"></a>00403 <span class="keywordflow">return</span> retval;
<a name="l00404"></a>00404 }
<a name="l00405"></a>00405
<a name="l00406"></a>00406 <span class="comment">/*------------------------------------------------------------------------*/</span>
<a name="l00407"></a>00407
<a name="l00408"></a>00408 <span class="keywordtype">bool</span>
<a name="l00409"></a><a class="code" href="ntru__poly_8h.html#ae77b2014df42e5ed612206d5930ac608">00409</a> <a class="code" href="ntru__poly_8c.html#ae77b2014df42e5ed612206d5930ac608">poly_inverse_poly_p</a>(<span class="keyword">const</span> fmpz_poly_t a,
<a name="l00410"></a>00410 fmpz_poly_t Fp,
<a name="l00411"></a>00411 <span class="keyword">const</span> <a class="code" href="structntru__params.html">ntru_params</a> *params)
<a name="l00412"></a>00412 {
<a name="l00413"></a>00413 <span class="keywordtype">bool</span> retval = <span class="keyword">false</span>;
<a name="l00414"></a>00414 <span class="keywordtype">int</span> k = 0,
<a name="l00415"></a>00415 j = 0;
<a name="l00416"></a>00416 fmpz *b_last;
<a name="l00417"></a>00417 fmpz_poly_t a_tmp,
<a name="l00418"></a>00418 b,
<a name="l00419"></a>00419 c,
<a name="l00420"></a>00420 f,
<a name="l00421"></a>00421 g;
<a name="l00422"></a>00422
<a name="l00423"></a>00423 <span class="comment">/* general initialization of temp variables */</span>
<a name="l00424"></a>00424 fmpz_poly_init(b);
<a name="l00425"></a>00425 fmpz_poly_set_coeff_ui(b, 0, 1);
<a name="l00426"></a>00426 fmpz_poly_init(c);
<a name="l00427"></a>00427 fmpz_poly_init(f);
<a name="l00428"></a>00428 fmpz_poly_set(f, a);
<a name="l00429"></a>00429
<a name="l00430"></a>00430 <span class="comment">/* set g(x) = x^N 1 */</span>
<a name="l00431"></a>00431 fmpz_poly_init(g);
<a name="l00432"></a>00432 fmpz_poly_set_coeff_si(g, 0, -1);
<a name="l00433"></a>00433 fmpz_poly_set_coeff_si(g, params-&gt;<a class="code" href="structntru__params.html#afb8425ee3db2b917b3c4e8d9b75bd3ff">N</a>, 1);
<a name="l00434"></a>00434
<a name="l00435"></a>00435 <span class="comment">/* avoid side effects */</span>
<a name="l00436"></a>00436 fmpz_poly_init(a_tmp);
<a name="l00437"></a>00437 fmpz_poly_set(a_tmp, a);
<a name="l00438"></a>00438 fmpz_poly_zero(Fp);
<a name="l00439"></a>00439
<a name="l00440"></a>00440 <span class="keywordflow">while</span> (1) {
<a name="l00441"></a>00441 <span class="keywordflow">while</span> (fmpz_is_zero(fmpz_poly_get_coeff_ptr(f, 0))) {
<a name="l00442"></a>00442 <span class="keywordflow">for</span> (uint32_t i = 1; i &lt;= params-&gt;<a class="code" href="structntru__params.html#afb8425ee3db2b917b3c4e8d9b75bd3ff">N</a>; i++) {
<a name="l00443"></a>00443 fmpz *f_coeff = fmpz_poly_get_coeff_ptr(f, i);
<a name="l00444"></a>00444 fmpz *c_coeff = fmpz_poly_get_coeff_ptr(c, params-&gt;<a class="code" href="structntru__params.html#afb8425ee3db2b917b3c4e8d9b75bd3ff">N</a> - i);
<a name="l00445"></a>00445
<a name="l00446"></a>00446 <span class="comment">/* f(x) = f(x) / x */</span>
<a name="l00447"></a>00447 <a class="code" href="ntru__poly_8c.html#ab1f966fe680d1ce7c19c8c812d1932a7">fmpz_poly_set_coeff_fmpz_n</a>(f, i - 1,
<a name="l00448"></a>00448 f_coeff);
<a name="l00449"></a>00449
<a name="l00450"></a>00450 <span class="comment">/* c(x) = c(x) * x */</span>
<a name="l00451"></a>00451 <a class="code" href="ntru__poly_8c.html#ab1f966fe680d1ce7c19c8c812d1932a7">fmpz_poly_set_coeff_fmpz_n</a>(c, params-&gt;<a class="code" href="structntru__params.html#afb8425ee3db2b917b3c4e8d9b75bd3ff">N</a> + 1 - i,
<a name="l00452"></a>00452 c_coeff);
<a name="l00453"></a>00453 }
<a name="l00454"></a>00454
<a name="l00455"></a>00455 fmpz_poly_set_coeff_si(f, params-&gt;<a class="code" href="structntru__params.html#afb8425ee3db2b917b3c4e8d9b75bd3ff">N</a>, 0);
<a name="l00456"></a>00456 fmpz_poly_set_coeff_si(c, 0, 0);
<a name="l00457"></a>00457
<a name="l00458"></a>00458 k++;
<a name="l00459"></a>00459
<a name="l00460"></a>00460 <span class="keywordflow">if</span> (fmpz_poly_degree(f) == -1)
<a name="l00461"></a>00461 <span class="keywordflow">goto</span> cleanup;
<a name="l00462"></a>00462 }
<a name="l00463"></a>00463
<a name="l00464"></a>00464 <span class="keywordflow">if</span> (fmpz_poly_degree(f) == 0)
<a name="l00465"></a>00465 <span class="keywordflow">break</span>;
<a name="l00466"></a>00466
<a name="l00467"></a>00467 <span class="keywordflow">if</span> (fmpz_poly_degree(f) &lt; fmpz_poly_degree(g)) {
<a name="l00468"></a>00468 <span class="comment">/* exchange f and g and exchange b and c */</span>
<a name="l00469"></a>00469 fmpz_poly_swap(f, g);
<a name="l00470"></a>00470 fmpz_poly_swap(b, c);
<a name="l00471"></a>00471 }
<a name="l00472"></a>00472
<a name="l00473"></a>00473 {
<a name="l00474"></a>00474 fmpz_poly_t c_tmp,
<a name="l00475"></a>00475 g_tmp;
<a name="l00476"></a>00476 fmpz_t u,
<a name="l00477"></a>00477 mp_tmp;
<a name="l00478"></a>00478
<a name="l00479"></a>00479 fmpz_init(u);
<a name="l00480"></a>00480 fmpz_zero(u);
<a name="l00481"></a>00481
<a name="l00482"></a>00482 fmpz_init_set(mp_tmp, fmpz_poly_get_coeff_ptr(f, 0));
<a name="l00483"></a>00483
<a name="l00484"></a>00484 fmpz_poly_init(g_tmp);
<a name="l00485"></a>00485 fmpz_poly_set(g_tmp, g);
<a name="l00486"></a>00486
<a name="l00487"></a>00487 fmpz_poly_init(c_tmp);
<a name="l00488"></a>00488 fmpz_poly_set(c_tmp, c);
<a name="l00489"></a>00489
<a name="l00490"></a>00490 <span class="comment">/* u = f[0] * g[0]^(-1) mod p */</span>
<a name="l00491"></a>00491 <span class="comment">/* = (f[0] mod p) * (g[0] inverse mod p) mod p */</span>
<a name="l00492"></a>00492 <a class="code" href="ntru__poly_8c.html#a59da1b7962829af8f18d58c05f588606">fmpz_invmod_ui</a>(u,
<a name="l00493"></a>00493 fmpz_poly_get_coeff_ptr(g, 0),
<a name="l00494"></a>00494 params-&gt;<a class="code" href="structntru__params.html#a41b368825e1eb126604e13e8f549ec8f">p</a>);
<a name="l00495"></a>00495 fmpz_mod_ui(mp_tmp, mp_tmp, params-&gt;<a class="code" href="structntru__params.html#a41b368825e1eb126604e13e8f549ec8f">p</a>);
<a name="l00496"></a>00496 fmpz_mul(u, mp_tmp, u);
<a name="l00497"></a>00497 fmpz_mod_ui(u, u, params-&gt;<a class="code" href="structntru__params.html#a41b368825e1eb126604e13e8f549ec8f">p</a>);
<a name="l00498"></a>00498
<a name="l00499"></a>00499 <span class="comment">/* f = f - u * g mod p */</span>
<a name="l00500"></a>00500 fmpz_poly_scalar_mul_fmpz(g_tmp, g_tmp, u);
<a name="l00501"></a>00501 fmpz_poly_sub(f, g_tmp, f);
<a name="l00502"></a>00502 <a class="code" href="ntru__poly_8c.html#ae7d0d8364dba689df3fb4904610634cc">fmpz_poly_mod_unsigned</a>(f, params-&gt;<a class="code" href="structntru__params.html#a41b368825e1eb126604e13e8f549ec8f">p</a>);
<a name="l00503"></a>00503
<a name="l00504"></a>00504 <span class="comment">/* b = b - u * c mod p */</span>
<a name="l00505"></a>00505 fmpz_poly_scalar_mul_fmpz(c_tmp, c_tmp, u);
<a name="l00506"></a>00506 fmpz_poly_sub(b, c_tmp, b);
<a name="l00507"></a>00507 <a class="code" href="ntru__poly_8c.html#ae7d0d8364dba689df3fb4904610634cc">fmpz_poly_mod_unsigned</a>(b, params-&gt;<a class="code" href="structntru__params.html#a41b368825e1eb126604e13e8f549ec8f">p</a>);
<a name="l00508"></a>00508
<a name="l00509"></a>00509 fmpz_clear(u);
<a name="l00510"></a>00510 fmpz_poly_clear(g_tmp);
<a name="l00511"></a>00511 fmpz_poly_clear(c_tmp);
<a name="l00512"></a>00512 }
<a name="l00513"></a>00513 }
<a name="l00514"></a>00514
<a name="l00515"></a>00515 k = k % params-&gt;<a class="code" href="structntru__params.html#afb8425ee3db2b917b3c4e8d9b75bd3ff">N</a>;
<a name="l00516"></a>00516
<a name="l00517"></a>00517 b_last = fmpz_poly_get_coeff_ptr(b, params-&gt;<a class="code" href="structntru__params.html#afb8425ee3db2b917b3c4e8d9b75bd3ff">N</a>);
<a name="l00518"></a>00518 <span class="keywordflow">if</span> (<a class="code" href="ntru__poly_8c.html#aaaac83ec72414aa208832442657c3520">fmpz_cmp_si_n</a>(b_last, 0))
<a name="l00519"></a>00519 <span class="keywordflow">goto</span> cleanup;
<a name="l00520"></a>00520
<a name="l00521"></a>00521 <span class="comment">/* Fp(x) = x^(N-k) * b(x) */</span>
<a name="l00522"></a>00522 <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = params-&gt;<a class="code" href="structntru__params.html#afb8425ee3db2b917b3c4e8d9b75bd3ff">N</a> - 1; i &gt;= 0; i--) {
<a name="l00523"></a>00523 fmpz *b_i;
<a name="l00524"></a>00524
<a name="l00525"></a>00525 <span class="comment">/* b(X) = f[0]^(-1) * b(X) (mod p) */</span>
<a name="l00526"></a>00526 {
<a name="l00527"></a>00527 fmpz_t mp_tmp;
<a name="l00528"></a>00528
<a name="l00529"></a>00529 fmpz_init(mp_tmp);
<a name="l00530"></a>00530
<a name="l00531"></a>00531 <a class="code" href="ntru__poly_8c.html#a59da1b7962829af8f18d58c05f588606">fmpz_invmod_ui</a>(mp_tmp,
<a name="l00532"></a>00532 fmpz_poly_get_coeff_ptr(f, 0),
<a name="l00533"></a>00533 params-&gt;<a class="code" href="structntru__params.html#a41b368825e1eb126604e13e8f549ec8f">p</a>);
<a name="l00534"></a>00534
<a name="l00535"></a>00535 <span class="keywordflow">if</span> (fmpz_poly_get_coeff_ptr(b, i)) {
<a name="l00536"></a>00536 fmpz_mul(fmpz_poly_get_coeff_ptr(b, i),
<a name="l00537"></a>00537 fmpz_poly_get_coeff_ptr(b, i),
<a name="l00538"></a>00538 mp_tmp);
<a name="l00539"></a>00539 fmpz_mod_ui(fmpz_poly_get_coeff_ptr(b, i),
<a name="l00540"></a>00540 fmpz_poly_get_coeff_ptr(b, i),
<a name="l00541"></a>00541 params-&gt;<a class="code" href="structntru__params.html#a41b368825e1eb126604e13e8f549ec8f">p</a>);
<a name="l00542"></a>00542 }
<a name="l00543"></a>00543 }
<a name="l00544"></a>00544
<a name="l00545"></a>00545 j = i - k;
<a name="l00546"></a>00546 <span class="keywordflow">if</span> (j &lt; 0)
<a name="l00547"></a>00547 j = j + params-&gt;<a class="code" href="structntru__params.html#afb8425ee3db2b917b3c4e8d9b75bd3ff">N</a>;
<a name="l00548"></a>00548
<a name="l00549"></a>00549 b_i = fmpz_poly_get_coeff_ptr(b, i);
<a name="l00550"></a>00550 <a class="code" href="ntru__poly_8c.html#ab1f966fe680d1ce7c19c8c812d1932a7">fmpz_poly_set_coeff_fmpz_n</a>(Fp, j, b_i);
<a name="l00551"></a>00551 }
<a name="l00552"></a>00552
<a name="l00553"></a>00553 <span class="comment">/* check if the f * Fp = 1 (mod p) condition holds true */</span>
<a name="l00554"></a>00554 fmpz_poly_set(a_tmp, a);
<a name="l00555"></a>00555 <a class="code" href="ntru__poly_8c.html#ae96f479ddd97af709a0ed50817fd3fb3">poly_starmultiply</a>(a_tmp, Fp, a_tmp, params, params-&gt;<a class="code" href="structntru__params.html#a41b368825e1eb126604e13e8f549ec8f">p</a>);
<a name="l00556"></a>00556 <span class="keywordflow">if</span> (fmpz_poly_is_one(a_tmp))
<a name="l00557"></a>00557 retval = <span class="keyword">true</span>;
<a name="l00558"></a>00558 <span class="keywordflow">else</span>
<a name="l00559"></a>00559 fmpz_poly_zero(Fp);
<a name="l00560"></a>00560
<a name="l00561"></a>00561 cleanup:
<a name="l00562"></a>00562 fmpz_poly_clear(a_tmp);
<a name="l00563"></a>00563 fmpz_poly_clear(b);
<a name="l00564"></a>00564 fmpz_poly_clear(c);
<a name="l00565"></a>00565 fmpz_poly_clear(f);
<a name="l00566"></a>00566 fmpz_poly_clear(g);
<a name="l00567"></a>00567
<a name="l00568"></a>00568 <span class="keywordflow">return</span> retval;
<a name="l00569"></a>00569 }
<a name="l00570"></a>00570
<a name="l00571"></a>00571 <span class="comment">/*------------------------------------------------------------------------*/</span>
<a name="l00572"></a>00572
<a name="l00573"></a>00573 <span class="keywordtype">void</span>
<a name="l00574"></a><a class="code" href="ntru_8h.html#a80a8ce0f2944bc3df94291ef2f781498">00574</a> <a class="code" href="ntru__poly_8c.html#a80a8ce0f2944bc3df94291ef2f781498">poly_draw</a>(<span class="keyword">const</span> fmpz_poly_t poly)
<a name="l00575"></a>00575 {
<a name="l00576"></a>00576 fmpz_poly_print(poly);
<a name="l00577"></a>00577 flint_printf(<span class="stringliteral">&quot;\n&quot;</span>);
<a name="l00578"></a>00578 }
<a name="l00579"></a>00579
<a name="l00580"></a>00580 <span class="comment">/*------------------------------------------------------------------------*/</span>
<a name="l00581"></a>00581
<a name="l00582"></a>00582 <span class="keywordtype">void</span>
<a name="l00583"></a><a class="code" href="ntru_8h.html#aec098d00160d2d502eb1f8a7c3fa5453">00583</a> <a class="code" href="ntru__poly_8c.html#aec098d00160d2d502eb1f8a7c3fa5453">poly_draw_pretty</a>(<span class="keyword">const</span> fmpz_poly_t poly)
<a name="l00584"></a>00584 {
<a name="l00585"></a>00585 fmpz_poly_print_pretty(poly, <span class="stringliteral">&quot;x&quot;</span>);
<a name="l00586"></a>00586 flint_printf(<span class="stringliteral">&quot;\n&quot;</span>);
<a name="l00587"></a>00587 }
<a name="l00588"></a>00588
<a name="l00589"></a>00589 <span class="comment">/*------------------------------------------------------------------------*/</span>
</pre></div></div><!-- contents -->
<!-- window showing the filter options -->
<div id="MSearchSelectWindow"
onmouseover="return searchBox.OnSearchSelectShow()"
onmouseout="return searchBox.OnSearchSelectHide()"
onkeydown="return searchBox.OnSearchSelectKey(event)">
<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Data Structures</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Typedefs</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Defines</a></div>
<!-- iframe showing the search results (closed by default) -->
<div id="MSearchResultsWindow">
<iframe src="javascript:void(0)" frameborder="0"
name="MSearchResults" id="MSearchResults">
</iframe>
</div>
<hr class="footer"/><address class="footer"><small>
Generated on Sun Jun 8 2014 21:44:12 for post quantum cryptography by &#160;<a href="http://www.doxygen.org/index.html">
<img class="footer" src="doxygen.png" alt="doxygen"/>
</a> 1.7.6.1
</small></address>
</body>
</html>