pqc/ntru__poly_8c_source.html

697 lines
87 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"/>
<meta name="generator" content="Doxygen 1.8.7"/>
<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"/>
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="dynsections.js"></script>
<link href="search/search.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="search/search.js"></script>
<script type="text/javascript">
$(document).ready(function() { searchBox.OnSelectItem(0); });
</script>
<link href="doxygen.css" rel="stylesheet" type="text/css" />
</head>
<body>
<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
<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>
<!-- end header part -->
<!-- Generated by Doxygen 1.8.7 -->
<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>
<!-- 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>Macros</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(7)"><span class="SelectionMark">&#160;</span>Pages</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>
<div id="nav-path" class="navpath">
<ul>
<li class="navelem"><a class="el" href="dir_68267d1309a1af8e8297ef4c3efbcdba.html">src</a></li> </ul>
</div>
</div><!-- top -->
<div class="header">
<div class="headertitle">
<div class="title">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"><div class="line"><a name="l00001"></a><span class="lineno"> 1</span>&#160;<span class="comment">/*</span></div>
<div class="line"><a name="l00002"></a><span class="lineno"> 2</span>&#160;<span class="comment"> * Copyright (C) 2014 FH Bielefeld</span></div>
<div class="line"><a name="l00003"></a><span class="lineno"> 3</span>&#160;<span class="comment"> *</span></div>
<div class="line"><a name="l00004"></a><span class="lineno"> 4</span>&#160;<span class="comment"> * This file is part of a FH Bielefeld project.</span></div>
<div class="line"><a name="l00005"></a><span class="lineno"> 5</span>&#160;<span class="comment"> *</span></div>
<div class="line"><a name="l00006"></a><span class="lineno"> 6</span>&#160;<span class="comment"> * This library is free software; you can redistribute it and/or</span></div>
<div class="line"><a name="l00007"></a><span class="lineno"> 7</span>&#160;<span class="comment"> * modify it under the terms of the GNU Lesser General Public</span></div>
<div class="line"><a name="l00008"></a><span class="lineno"> 8</span>&#160;<span class="comment"> * License as published by the Free Software Foundation; either</span></div>
<div class="line"><a name="l00009"></a><span class="lineno"> 9</span>&#160;<span class="comment"> * version 2.1 of the License, or (at your option) any later version.</span></div>
<div class="line"><a name="l00010"></a><span class="lineno"> 10</span>&#160;<span class="comment"> *</span></div>
<div class="line"><a name="l00011"></a><span class="lineno"> 11</span>&#160;<span class="comment"> * This library is distributed in the hope that it will be useful,</span></div>
<div class="line"><a name="l00012"></a><span class="lineno"> 12</span>&#160;<span class="comment"> * but WITHOUT ANY WARRANTY; without even the implied warranty of</span></div>
<div class="line"><a name="l00013"></a><span class="lineno"> 13</span>&#160;<span class="comment"> * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU</span></div>
<div class="line"><a name="l00014"></a><span class="lineno"> 14</span>&#160;<span class="comment"> * Lesser General Public License for more details.</span></div>
<div class="line"><a name="l00015"></a><span class="lineno"> 15</span>&#160;<span class="comment"> *</span></div>
<div class="line"><a name="l00016"></a><span class="lineno"> 16</span>&#160;<span class="comment"> * You should have received a copy of the GNU Lesser General Public</span></div>
<div class="line"><a name="l00017"></a><span class="lineno"> 17</span>&#160;<span class="comment"> * License along with this library; if not, write to the Free Software</span></div>
<div class="line"><a name="l00018"></a><span class="lineno"> 18</span>&#160;<span class="comment"> * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,</span></div>
<div class="line"><a name="l00019"></a><span class="lineno"> 19</span>&#160;<span class="comment"> * MA 02110-1301 USA</span></div>
<div class="line"><a name="l00020"></a><span class="lineno"> 20</span>&#160;<span class="comment"> */</span></div>
<div class="line"><a name="l00021"></a><span class="lineno"> 21</span>&#160;</div>
<div class="line"><a name="l00030"></a><span class="lineno"> 30</span>&#160;<span class="preprocessor">#include &quot;<a class="code" href="ntru__err_8h.html">ntru_err.h</a>&quot;</span></div>
<div class="line"><a name="l00031"></a><span class="lineno"> 31</span>&#160;<span class="preprocessor">#include &quot;<a class="code" href="ntru__mem_8h.html">ntru_mem.h</a>&quot;</span></div>
<div class="line"><a name="l00032"></a><span class="lineno"> 32</span>&#160;<span class="preprocessor">#include &quot;<a class="code" href="ntru__params_8h.html">ntru_params.h</a>&quot;</span></div>
<div class="line"><a name="l00033"></a><span class="lineno"> 33</span>&#160;<span class="preprocessor">#include &quot;<a class="code" href="ntru__poly_8h.html">ntru_poly.h</a>&quot;</span></div>
<div class="line"><a name="l00034"></a><span class="lineno"> 34</span>&#160;</div>
<div class="line"><a name="l00035"></a><span class="lineno"> 35</span>&#160;<span class="preprocessor">#include &lt;stdarg.h&gt;</span></div>
<div class="line"><a name="l00036"></a><span class="lineno"> 36</span>&#160;<span class="preprocessor">#include &lt;stdbool.h&gt;</span></div>
<div class="line"><a name="l00037"></a><span class="lineno"> 37</span>&#160;<span class="preprocessor">#include &lt;stdint.h&gt;</span></div>
<div class="line"><a name="l00038"></a><span class="lineno"> 38</span>&#160;<span class="preprocessor">#include &lt;stdio.h&gt;</span></div>
<div class="line"><a name="l00039"></a><span class="lineno"> 39</span>&#160;<span class="preprocessor">#include &lt;stdlib.h&gt;</span></div>
<div class="line"><a name="l00040"></a><span class="lineno"> 40</span>&#160;<span class="preprocessor">#include &lt;sys/types.h&gt;</span></div>
<div class="line"><a name="l00041"></a><span class="lineno"> 41</span>&#160;</div>
<div class="line"><a name="l00042"></a><span class="lineno"> 42</span>&#160;<span class="preprocessor">#include &lt;fmpz_poly.h&gt;</span></div>
<div class="line"><a name="l00043"></a><span class="lineno"> 43</span>&#160;<span class="preprocessor">#include &lt;fmpz.h&gt;</span></div>
<div class="line"><a name="l00044"></a><span class="lineno"> 44</span>&#160;</div>
<div class="line"><a name="l00045"></a><span class="lineno"> 45</span>&#160;</div>
<div class="line"><a name="l00054"></a><span class="lineno"> 54</span>&#160;<span class="keyword">static</span></div>
<div class="line"><a name="l00055"></a><span class="lineno"> 55</span>&#160;<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,</div>
<div class="line"><a name="l00056"></a><span class="lineno"> 56</span>&#160; fmpz_poly_t Fq,</div>
<div class="line"><a name="l00057"></a><span class="lineno"> 57</span>&#160; <span class="keyword">const</span> <a class="code" href="structntru__params.html">ntru_params</a> *params);</div>
<div class="line"><a name="l00058"></a><span class="lineno"> 58</span>&#160;</div>
<div class="line"><a name="l00059"></a><span class="lineno"> 59</span>&#160;</div>
<div class="line"><a name="l00060"></a><span class="lineno"> 60</span>&#160;<span class="comment">/*------------------------------------------------------------------------*/</span></div>
<div class="line"><a name="l00061"></a><span class="lineno"> 61</span>&#160;</div>
<div class="line"><a name="l00062"></a><span class="lineno"> 62</span>&#160;<span class="keyword">static</span> <span class="keywordtype">void</span></div>
<div class="line"><a name="l00063"></a><span class="lineno"><a class="line" href="ntru__poly_8c.html#a891af13dc4355c9fab9ca3fafcac8054"> 63</a></span>&#160;<a class="code" href="ntru__poly_8c.html#a891af13dc4355c9fab9ca3fafcac8054">poly_mod2_to_modq</a>(<span class="keyword">const</span> fmpz_poly_t a,</div>
<div class="line"><a name="l00064"></a><span class="lineno"> 64</span>&#160; fmpz_poly_t Fq,</div>
<div class="line"><a name="l00065"></a><span class="lineno"> 65</span>&#160; <span class="keyword">const</span> <a class="code" href="structntru__params.html">ntru_params</a> *params)</div>
<div class="line"><a name="l00066"></a><span class="lineno"> 66</span>&#160;{</div>
<div class="line"><a name="l00067"></a><span class="lineno"> 67</span>&#160; <span class="keywordtype">int</span> v = 2;</div>
<div class="line"><a name="l00068"></a><span class="lineno"> 68</span>&#160; fmpz_poly_t poly_tmp, two;</div>
<div class="line"><a name="l00069"></a><span class="lineno"> 69</span>&#160;</div>
<div class="line"><a name="l00070"></a><span class="lineno"> 70</span>&#160; fmpz_poly_init(poly_tmp);</div>
<div class="line"><a name="l00071"></a><span class="lineno"> 71</span>&#160; fmpz_poly_zero(poly_tmp);</div>
<div class="line"><a name="l00072"></a><span class="lineno"> 72</span>&#160; fmpz_poly_init(two);</div>
<div class="line"><a name="l00073"></a><span class="lineno"> 73</span>&#160; fmpz_poly_set_coeff_ui(two, 0, 2);</div>
<div class="line"><a name="l00074"></a><span class="lineno"> 74</span>&#160;</div>
<div class="line"><a name="l00075"></a><span class="lineno"> 75</span>&#160; <span class="keywordflow">while</span> (v &lt; (<span class="keywordtype">int</span>)(params-&gt;<a class="code" href="structntru__params.html#a29680750bda49dc93e61a752b2f2a0f7">q</a>)) {</div>
<div class="line"><a name="l00076"></a><span class="lineno"> 76</span>&#160; v = v * 2;</div>
<div class="line"><a name="l00077"></a><span class="lineno"> 77</span>&#160;</div>
<div class="line"><a name="l00078"></a><span class="lineno"> 78</span>&#160; <a class="code" href="ntru__poly_8c.html#ae96f479ddd97af709a0ed50817fd3fb3">poly_starmultiply</a>(a, Fq, poly_tmp, params, v);</div>
<div class="line"><a name="l00079"></a><span class="lineno"> 79</span>&#160; fmpz_poly_sub(poly_tmp, two, poly_tmp);</div>
<div class="line"><a name="l00080"></a><span class="lineno"> 80</span>&#160; <a class="code" href="ntru__poly_8c.html#ae7d0d8364dba689df3fb4904610634cc">fmpz_poly_mod_unsigned</a>(poly_tmp, v);</div>
<div class="line"><a name="l00081"></a><span class="lineno"> 81</span>&#160; <a class="code" href="ntru__poly_8c.html#ae96f479ddd97af709a0ed50817fd3fb3">poly_starmultiply</a>(Fq, poly_tmp, Fq, params, v);</div>
<div class="line"><a name="l00082"></a><span class="lineno"> 82</span>&#160;</div>
<div class="line"><a name="l00083"></a><span class="lineno"> 83</span>&#160; }</div>
<div class="line"><a name="l00084"></a><span class="lineno"> 84</span>&#160;</div>
<div class="line"><a name="l00085"></a><span class="lineno"> 85</span>&#160; fmpz_poly_clear(poly_tmp);</div>
<div class="line"><a name="l00086"></a><span class="lineno"> 86</span>&#160; fmpz_poly_clear(two);</div>
<div class="line"><a name="l00087"></a><span class="lineno"> 87</span>&#160;</div>
<div class="line"><a name="l00088"></a><span class="lineno"> 88</span>&#160;}</div>
<div class="line"><a name="l00089"></a><span class="lineno"> 89</span>&#160;</div>
<div class="line"><a name="l00090"></a><span class="lineno"> 90</span>&#160;<span class="comment">/*------------------------------------------------------------------------*/</span></div>
<div class="line"><a name="l00091"></a><span class="lineno"> 91</span>&#160;</div>
<div class="line"><a name="l00092"></a><span class="lineno"> 92</span>&#160;<span class="keywordtype">int</span></div>
<div class="line"><a name="l00093"></a><span class="lineno"><a class="line" href="ntru__poly_8h.html#aaaac83ec72414aa208832442657c3520"> 93</a></span>&#160;<a class="code" href="ntru__poly_8c.html#aaaac83ec72414aa208832442657c3520">fmpz_cmp_si_n</a>(<span class="keyword">const</span> fmpz_t f, slong g)</div>
<div class="line"><a name="l00094"></a><span class="lineno"> 94</span>&#160;{</div>
<div class="line"><a name="l00095"></a><span class="lineno"> 95</span>&#160; fmpz_t f_cmp;</div>
<div class="line"><a name="l00096"></a><span class="lineno"> 96</span>&#160;</div>
<div class="line"><a name="l00097"></a><span class="lineno"> 97</span>&#160; fmpz_init(f_cmp);</div>
<div class="line"><a name="l00098"></a><span class="lineno"> 98</span>&#160;</div>
<div class="line"><a name="l00099"></a><span class="lineno"> 99</span>&#160; <span class="keywordflow">if</span> (f)</div>
<div class="line"><a name="l00100"></a><span class="lineno"> 100</span>&#160; fmpz_set(f_cmp, f);</div>
<div class="line"><a name="l00101"></a><span class="lineno"> 101</span>&#160; <span class="keywordflow">else</span></div>
<div class="line"><a name="l00102"></a><span class="lineno"> 102</span>&#160; fmpz_set_si(f_cmp, 0);</div>
<div class="line"><a name="l00103"></a><span class="lineno"> 103</span>&#160;</div>
<div class="line"><a name="l00104"></a><span class="lineno"> 104</span>&#160; <span class="keywordflow">return</span> fmpz_cmp_si(f_cmp, g);</div>
<div class="line"><a name="l00105"></a><span class="lineno"> 105</span>&#160;}</div>
<div class="line"><a name="l00106"></a><span class="lineno"> 106</span>&#160;</div>
<div class="line"><a name="l00107"></a><span class="lineno"> 107</span>&#160;<span class="comment">/*------------------------------------------------------------------------*/</span></div>
<div class="line"><a name="l00108"></a><span class="lineno"> 108</span>&#160;</div>
<div class="line"><a name="l00109"></a><span class="lineno"> 109</span>&#160;<span class="keywordtype">void</span></div>
<div class="line"><a name="l00110"></a><span class="lineno"><a class="line" href="ntru_8h.html#a20f86085d5eb5372fd25dc270069d38c"> 110</a></span>&#160;<a class="code" href="ntru__poly_8c.html#a20f86085d5eb5372fd25dc270069d38c">poly_new</a>(fmpz_poly_t new_poly,</div>
<div class="line"><a name="l00111"></a><span class="lineno"> 111</span>&#160; <span class="keywordtype">int</span> <span class="keyword">const</span> * <span class="keyword">const</span> c,</div>
<div class="line"><a name="l00112"></a><span class="lineno"> 112</span>&#160; <span class="keyword">const</span> <span class="keywordtype">size_t</span> len)</div>
<div class="line"><a name="l00113"></a><span class="lineno"> 113</span>&#160;{</div>
<div class="line"><a name="l00114"></a><span class="lineno"> 114</span>&#160; fmpz_poly_init(new_poly);</div>
<div class="line"><a name="l00115"></a><span class="lineno"> 115</span>&#160;</div>
<div class="line"><a name="l00116"></a><span class="lineno"> 116</span>&#160; <span class="keywordflow">for</span> (uint32_t i = 0; i &lt; len; i++)</div>
<div class="line"><a name="l00117"></a><span class="lineno"> 117</span>&#160; fmpz_poly_set_coeff_si(new_poly, i, c[i]);</div>
<div class="line"><a name="l00118"></a><span class="lineno"> 118</span>&#160;}</div>
<div class="line"><a name="l00119"></a><span class="lineno"> 119</span>&#160;</div>
<div class="line"><a name="l00120"></a><span class="lineno"> 120</span>&#160;<span class="comment">/*------------------------------------------------------------------------*/</span></div>
<div class="line"><a name="l00121"></a><span class="lineno"> 121</span>&#160;</div>
<div class="line"><a name="l00122"></a><span class="lineno"> 122</span>&#160;<span class="keywordtype">void</span></div>
<div class="line"><a name="l00123"></a><span class="lineno"><a class="line" href="ntru_8h.html#a27ff2116f70bcbf5028219adcae4c5f0"> 123</a></span>&#160;<a class="code" href="ntru__poly_8c.html#a27ff2116f70bcbf5028219adcae4c5f0">poly_delete</a>(fmpz_poly_t poly)</div>
<div class="line"><a name="l00124"></a><span class="lineno"> 124</span>&#160;{</div>
<div class="line"><a name="l00125"></a><span class="lineno"> 125</span>&#160; fmpz_poly_clear(poly);</div>
<div class="line"><a name="l00126"></a><span class="lineno"> 126</span>&#160;}</div>
<div class="line"><a name="l00127"></a><span class="lineno"> 127</span>&#160;</div>
<div class="line"><a name="l00128"></a><span class="lineno"> 128</span>&#160;<span class="comment">/*------------------------------------------------------------------------*/</span></div>
<div class="line"><a name="l00129"></a><span class="lineno"> 129</span>&#160;</div>
<div class="line"><a name="l00130"></a><span class="lineno"> 130</span>&#160;<span class="keywordtype">void</span></div>
<div class="line"><a name="l00131"></a><span class="lineno"><a class="line" href="ntru_8h.html#a3f53c63383ff301b20dcede0783869a7"> 131</a></span>&#160;<a class="code" href="ntru__poly_8c.html#a3f53c63383ff301b20dcede0783869a7">poly_delete_array</a>(fmpz_poly_t **poly_array)</div>
<div class="line"><a name="l00132"></a><span class="lineno"> 132</span>&#160;{</div>
<div class="line"><a name="l00133"></a><span class="lineno"> 133</span>&#160; uint32_t i = 0;</div>
<div class="line"><a name="l00134"></a><span class="lineno"> 134</span>&#160;</div>
<div class="line"><a name="l00135"></a><span class="lineno"> 135</span>&#160; <span class="keywordflow">while</span>(poly_array[i]) {</div>
<div class="line"><a name="l00136"></a><span class="lineno"> 136</span>&#160; <a class="code" href="ntru__poly_8c.html#a27ff2116f70bcbf5028219adcae4c5f0">poly_delete</a>(*(poly_array[i]));</div>
<div class="line"><a name="l00137"></a><span class="lineno"> 137</span>&#160; free(poly_array[i]);</div>
<div class="line"><a name="l00138"></a><span class="lineno"> 138</span>&#160; i++;</div>
<div class="line"><a name="l00139"></a><span class="lineno"> 139</span>&#160; }</div>
<div class="line"><a name="l00140"></a><span class="lineno"> 140</span>&#160;</div>
<div class="line"><a name="l00141"></a><span class="lineno"> 141</span>&#160; <span class="comment">/* avoid double free */</span></div>
<div class="line"><a name="l00142"></a><span class="lineno"> 142</span>&#160; <span class="keywordflow">if</span> (i &gt; 1)</div>
<div class="line"><a name="l00143"></a><span class="lineno"> 143</span>&#160; free(poly_array);</div>
<div class="line"><a name="l00144"></a><span class="lineno"> 144</span>&#160;}</div>
<div class="line"><a name="l00145"></a><span class="lineno"> 145</span>&#160;</div>
<div class="line"><a name="l00146"></a><span class="lineno"> 146</span>&#160;<span class="comment">/*------------------------------------------------------------------------*/</span></div>
<div class="line"><a name="l00147"></a><span class="lineno"> 147</span>&#160;</div>
<div class="line"><a name="l00148"></a><span class="lineno"> 148</span>&#160;<span class="keywordtype">void</span></div>
<div class="line"><a name="l00149"></a><span class="lineno"><a class="line" href="ntru_8h.html#a83297bc2ab5b6e7ce42553570dd8268f"> 149</a></span>&#160;<a class="code" href="ntru__poly_8c.html#a83297bc2ab5b6e7ce42553570dd8268f">poly_delete_all</a>(fmpz_poly_t poly, ...)</div>
<div class="line"><a name="l00150"></a><span class="lineno"> 150</span>&#160;{</div>
<div class="line"><a name="l00151"></a><span class="lineno"> 151</span>&#160; fmpz_poly_struct *next_poly;</div>
<div class="line"><a name="l00152"></a><span class="lineno"> 152</span>&#160; va_list args;</div>
<div class="line"><a name="l00153"></a><span class="lineno"> 153</span>&#160;</div>
<div class="line"><a name="l00154"></a><span class="lineno"> 154</span>&#160; next_poly = poly;</div>
<div class="line"><a name="l00155"></a><span class="lineno"> 155</span>&#160; va_start(args, poly);</div>
<div class="line"><a name="l00156"></a><span class="lineno"> 156</span>&#160; <span class="keywordflow">while</span> (next_poly != NULL) {</div>
<div class="line"><a name="l00157"></a><span class="lineno"> 157</span>&#160; <a class="code" href="ntru__poly_8c.html#a27ff2116f70bcbf5028219adcae4c5f0">poly_delete</a>(next_poly);</div>
<div class="line"><a name="l00158"></a><span class="lineno"> 158</span>&#160; next_poly = va_arg(args, fmpz_poly_struct*);</div>
<div class="line"><a name="l00159"></a><span class="lineno"> 159</span>&#160; }</div>
<div class="line"><a name="l00160"></a><span class="lineno"> 160</span>&#160; va_end(args);</div>
<div class="line"><a name="l00161"></a><span class="lineno"> 161</span>&#160;}</div>
<div class="line"><a name="l00162"></a><span class="lineno"> 162</span>&#160;</div>
<div class="line"><a name="l00163"></a><span class="lineno"> 163</span>&#160;<span class="comment">/*------------------------------------------------------------------------*/</span></div>
<div class="line"><a name="l00164"></a><span class="lineno"> 164</span>&#160;</div>
<div class="line"><a name="l00165"></a><span class="lineno"> 165</span>&#160;<span class="keywordtype">void</span></div>
<div class="line"><a name="l00166"></a><span class="lineno"><a class="line" href="ntru__poly_8h.html#ae7d0d8364dba689df3fb4904610634cc"> 166</a></span>&#160;<a class="code" href="ntru__poly_8c.html#ae7d0d8364dba689df3fb4904610634cc">fmpz_poly_mod_unsigned</a>(fmpz_poly_t a,</div>
<div class="line"><a name="l00167"></a><span class="lineno"> 167</span>&#160; <span class="keyword">const</span> uint32_t mod)</div>
<div class="line"><a name="l00168"></a><span class="lineno"> 168</span>&#160;{</div>
<div class="line"><a name="l00169"></a><span class="lineno"> 169</span>&#160; nmod_poly_t nmod_tmp;</div>
<div class="line"><a name="l00170"></a><span class="lineno"> 170</span>&#160;</div>
<div class="line"><a name="l00171"></a><span class="lineno"> 171</span>&#160; nmod_poly_init(nmod_tmp, mod);</div>
<div class="line"><a name="l00172"></a><span class="lineno"> 172</span>&#160;</div>
<div class="line"><a name="l00173"></a><span class="lineno"> 173</span>&#160; fmpz_poly_get_nmod_poly(nmod_tmp, a);</div>
<div class="line"><a name="l00174"></a><span class="lineno"> 174</span>&#160; fmpz_poly_set_nmod_poly_unsigned(a, nmod_tmp);</div>
<div class="line"><a name="l00175"></a><span class="lineno"> 175</span>&#160;</div>
<div class="line"><a name="l00176"></a><span class="lineno"> 176</span>&#160; nmod_poly_clear(nmod_tmp);</div>
<div class="line"><a name="l00177"></a><span class="lineno"> 177</span>&#160;}</div>
<div class="line"><a name="l00178"></a><span class="lineno"> 178</span>&#160;</div>
<div class="line"><a name="l00179"></a><span class="lineno"> 179</span>&#160;<span class="comment">/*------------------------------------------------------------------------*/</span></div>
<div class="line"><a name="l00180"></a><span class="lineno"> 180</span>&#160;</div>
<div class="line"><a name="l00181"></a><span class="lineno"> 181</span>&#160;<span class="keywordtype">void</span></div>
<div class="line"><a name="l00182"></a><span class="lineno"><a class="line" href="ntru__poly_8h.html#a7c4f5e96355518dc97a23da8f34b661a"> 182</a></span>&#160;<a class="code" href="ntru__poly_8c.html#a7c4f5e96355518dc97a23da8f34b661a">fmpz_poly_mod</a>(fmpz_poly_t a,</div>
<div class="line"><a name="l00183"></a><span class="lineno"> 183</span>&#160; <span class="keyword">const</span> uint32_t mod)</div>
<div class="line"><a name="l00184"></a><span class="lineno"> 184</span>&#160;{</div>
<div class="line"><a name="l00185"></a><span class="lineno"> 185</span>&#160; nmod_poly_t nmod_tmp;</div>
<div class="line"><a name="l00186"></a><span class="lineno"> 186</span>&#160;</div>
<div class="line"><a name="l00187"></a><span class="lineno"> 187</span>&#160; nmod_poly_init(nmod_tmp, mod);</div>
<div class="line"><a name="l00188"></a><span class="lineno"> 188</span>&#160;</div>
<div class="line"><a name="l00189"></a><span class="lineno"> 189</span>&#160; fmpz_poly_get_nmod_poly(nmod_tmp, a);</div>
<div class="line"><a name="l00190"></a><span class="lineno"> 190</span>&#160; fmpz_poly_set_nmod_poly(a, nmod_tmp);</div>
<div class="line"><a name="l00191"></a><span class="lineno"> 191</span>&#160;</div>
<div class="line"><a name="l00192"></a><span class="lineno"> 192</span>&#160; nmod_poly_clear(nmod_tmp);</div>
<div class="line"><a name="l00193"></a><span class="lineno"> 193</span>&#160;}</div>
<div class="line"><a name="l00194"></a><span class="lineno"> 194</span>&#160;</div>
<div class="line"><a name="l00195"></a><span class="lineno"> 195</span>&#160;<span class="comment">/*------------------------------------------------------------------------*/</span></div>
<div class="line"><a name="l00196"></a><span class="lineno"> 196</span>&#160;</div>
<div class="line"><a name="l00197"></a><span class="lineno"> 197</span>&#160;<span class="keywordtype">void</span></div>
<div class="line"><a name="l00198"></a><span class="lineno"><a class="line" href="ntru__poly_8h.html#ab1f966fe680d1ce7c19c8c812d1932a7"> 198</a></span>&#160;<a class="code" href="ntru__poly_8c.html#ab1f966fe680d1ce7c19c8c812d1932a7">fmpz_poly_set_coeff_fmpz_n</a>(fmpz_poly_t poly, slong n,</div>
<div class="line"><a name="l00199"></a><span class="lineno"> 199</span>&#160; <span class="keyword">const</span> fmpz_t x)</div>
<div class="line"><a name="l00200"></a><span class="lineno"> 200</span>&#160;{</div>
<div class="line"><a name="l00201"></a><span class="lineno"> 201</span>&#160; <span class="keywordflow">if</span> (x)</div>
<div class="line"><a name="l00202"></a><span class="lineno"> 202</span>&#160; fmpz_poly_set_coeff_fmpz(poly, n, x);</div>
<div class="line"><a name="l00203"></a><span class="lineno"> 203</span>&#160; <span class="keywordflow">else</span></div>
<div class="line"><a name="l00204"></a><span class="lineno"> 204</span>&#160; fmpz_poly_set_coeff_si(poly, n, 0);</div>
<div class="line"><a name="l00205"></a><span class="lineno"> 205</span>&#160;}</div>
<div class="line"><a name="l00206"></a><span class="lineno"> 206</span>&#160;</div>
<div class="line"><a name="l00207"></a><span class="lineno"> 207</span>&#160;<span class="comment">/*------------------------------------------------------------------------*/</span></div>
<div class="line"><a name="l00208"></a><span class="lineno"> 208</span>&#160;</div>
<div class="line"><a name="l00209"></a><span class="lineno"> 209</span>&#160;<span class="keywordtype">int</span></div>
<div class="line"><a name="l00210"></a><span class="lineno"><a class="line" href="ntru__poly_8h.html#a59da1b7962829af8f18d58c05f588606"> 210</a></span>&#160;<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)</div>
<div class="line"><a name="l00211"></a><span class="lineno"> 211</span>&#160;{</div>
<div class="line"><a name="l00212"></a><span class="lineno"> 212</span>&#160; fmpz_t modulus;</div>
<div class="line"><a name="l00213"></a><span class="lineno"> 213</span>&#160;</div>
<div class="line"><a name="l00214"></a><span class="lineno"> 214</span>&#160; fmpz_init_set_ui(modulus, mod);</div>
<div class="line"><a name="l00215"></a><span class="lineno"> 215</span>&#160;</div>
<div class="line"><a name="l00216"></a><span class="lineno"> 216</span>&#160; <span class="keywordflow">return</span> fmpz_invmod(f, g, modulus);</div>
<div class="line"><a name="l00217"></a><span class="lineno"> 217</span>&#160;}</div>
<div class="line"><a name="l00218"></a><span class="lineno"> 218</span>&#160;</div>
<div class="line"><a name="l00219"></a><span class="lineno"> 219</span>&#160;<span class="comment">/*------------------------------------------------------------------------*/</span></div>
<div class="line"><a name="l00220"></a><span class="lineno"> 220</span>&#160;</div>
<div class="line"><a name="l00221"></a><span class="lineno"> 221</span>&#160;<span class="keywordtype">void</span></div>
<div class="line"><a name="l00222"></a><span class="lineno"><a class="line" href="ntru__poly_8h.html#ad2a11e832808ef1cfee0eed1cc02f4b9"> 222</a></span>&#160;<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)</div>
<div class="line"><a name="l00223"></a><span class="lineno"> 223</span>&#160;{</div>
<div class="line"><a name="l00224"></a><span class="lineno"> 224</span>&#160; <span class="keywordflow">if</span> (!g &amp;&amp; !h) {</div>
<div class="line"><a name="l00225"></a><span class="lineno"> 225</span>&#160; fmpz_zero(f);</div>
<div class="line"><a name="l00226"></a><span class="lineno"> 226</span>&#160; } <span class="keywordflow">else</span> {</div>
<div class="line"><a name="l00227"></a><span class="lineno"> 227</span>&#160; <span class="keywordflow">if</span> (!g &amp;&amp; h)</div>
<div class="line"><a name="l00228"></a><span class="lineno"> 228</span>&#160; fmpz_add_ui(f, h, 0);</div>
<div class="line"><a name="l00229"></a><span class="lineno"> 229</span>&#160; <span class="keywordflow">else</span> <span class="keywordflow">if</span> (g &amp;&amp; !h)</div>
<div class="line"><a name="l00230"></a><span class="lineno"> 230</span>&#160; fmpz_add_ui(f, g, 0);</div>
<div class="line"><a name="l00231"></a><span class="lineno"> 231</span>&#160; <span class="keywordflow">else</span></div>
<div class="line"><a name="l00232"></a><span class="lineno"> 232</span>&#160; fmpz_add(f, g, h);</div>
<div class="line"><a name="l00233"></a><span class="lineno"> 233</span>&#160; }</div>
<div class="line"><a name="l00234"></a><span class="lineno"> 234</span>&#160;}</div>
<div class="line"><a name="l00235"></a><span class="lineno"> 235</span>&#160;</div>
<div class="line"><a name="l00236"></a><span class="lineno"> 236</span>&#160;<span class="comment">/*------------------------------------------------------------------------*/</span></div>
<div class="line"><a name="l00237"></a><span class="lineno"> 237</span>&#160;</div>
<div class="line"><a name="l00238"></a><span class="lineno"> 238</span>&#160;<span class="keywordtype">void</span></div>
<div class="line"><a name="l00239"></a><span class="lineno"><a class="line" href="ntru__poly_8h.html#ae96f479ddd97af709a0ed50817fd3fb3"> 239</a></span>&#160;<a class="code" href="ntru__poly_8c.html#ae96f479ddd97af709a0ed50817fd3fb3">poly_starmultiply</a>(<span class="keyword">const</span> fmpz_poly_t a,</div>
<div class="line"><a name="l00240"></a><span class="lineno"> 240</span>&#160; <span class="keyword">const</span> fmpz_poly_t b,</div>
<div class="line"><a name="l00241"></a><span class="lineno"> 241</span>&#160; fmpz_poly_t c,</div>
<div class="line"><a name="l00242"></a><span class="lineno"> 242</span>&#160; <span class="keyword">const</span> <a class="code" href="structntru__params.html">ntru_params</a> *params,</div>
<div class="line"><a name="l00243"></a><span class="lineno"> 243</span>&#160; uint32_t modulus)</div>
<div class="line"><a name="l00244"></a><span class="lineno"> 244</span>&#160;{</div>
<div class="line"><a name="l00245"></a><span class="lineno"> 245</span>&#160; fmpz_poly_t a_tmp;</div>
<div class="line"><a name="l00246"></a><span class="lineno"> 246</span>&#160; fmpz_t c_coeff_k;</div>
<div class="line"><a name="l00247"></a><span class="lineno"> 247</span>&#160;</div>
<div class="line"><a name="l00248"></a><span class="lineno"> 248</span>&#160; fmpz_poly_init(a_tmp);</div>
<div class="line"><a name="l00249"></a><span class="lineno"> 249</span>&#160; fmpz_init(c_coeff_k);</div>
<div class="line"><a name="l00250"></a><span class="lineno"> 250</span>&#160;</div>
<div class="line"><a name="l00251"></a><span class="lineno"> 251</span>&#160; <span class="comment">/* avoid side effects */</span></div>
<div class="line"><a name="l00252"></a><span class="lineno"> 252</span>&#160; fmpz_poly_set(a_tmp, a);</div>
<div class="line"><a name="l00253"></a><span class="lineno"> 253</span>&#160; fmpz_poly_zero(c);</div>
<div class="line"><a name="l00254"></a><span class="lineno"> 254</span>&#160;</div>
<div class="line"><a name="l00255"></a><span class="lineno"> 255</span>&#160; <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--) {</div>
<div class="line"><a name="l00256"></a><span class="lineno"> 256</span>&#160; <span class="keywordtype">int</span> j;</div>
<div class="line"><a name="l00257"></a><span class="lineno"> 257</span>&#160;</div>
<div class="line"><a name="l00258"></a><span class="lineno"> 258</span>&#160; j = k + 1;</div>
<div class="line"><a name="l00259"></a><span class="lineno"> 259</span>&#160;</div>
<div class="line"><a name="l00260"></a><span class="lineno"> 260</span>&#160; fmpz_set_si(c_coeff_k, 0);</div>
<div class="line"><a name="l00261"></a><span class="lineno"> 261</span>&#160;</div>
<div class="line"><a name="l00262"></a><span class="lineno"> 262</span>&#160; <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--) {</div>
<div class="line"><a name="l00263"></a><span class="lineno"> 263</span>&#160; fmpz *a_tmp_coeff_i,</div>
<div class="line"><a name="l00264"></a><span class="lineno"> 264</span>&#160; *b_coeff_j;</div>
<div class="line"><a name="l00265"></a><span class="lineno"> 265</span>&#160;</div>
<div class="line"><a name="l00266"></a><span class="lineno"> 266</span>&#160; <span class="keywordflow">if</span> (j == (<span class="keywordtype">int</span>)(params-&gt;<a class="code" href="structntru__params.html#afb8425ee3db2b917b3c4e8d9b75bd3ff">N</a>))</div>
<div class="line"><a name="l00267"></a><span class="lineno"> 267</span>&#160; j = 0;</div>
<div class="line"><a name="l00268"></a><span class="lineno"> 268</span>&#160;</div>
<div class="line"><a name="l00269"></a><span class="lineno"> 269</span>&#160; a_tmp_coeff_i = fmpz_poly_get_coeff_ptr(a_tmp, i);</div>
<div class="line"><a name="l00270"></a><span class="lineno"> 270</span>&#160; b_coeff_j = fmpz_poly_get_coeff_ptr(b, j);</div>
<div class="line"><a name="l00271"></a><span class="lineno"> 271</span>&#160;</div>
<div class="line"><a name="l00272"></a><span class="lineno"> 272</span>&#160; <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;</div>
<div class="line"><a name="l00273"></a><span class="lineno"> 273</span>&#160; <a class="code" href="ntru__poly_8c.html#aaaac83ec72414aa208832442657c3520">fmpz_cmp_si_n</a>(b_coeff_j, 0)) {</div>
<div class="line"><a name="l00274"></a><span class="lineno"> 274</span>&#160; fmpz_t fmpz_tmp;</div>
<div class="line"><a name="l00275"></a><span class="lineno"> 275</span>&#160;</div>
<div class="line"><a name="l00276"></a><span class="lineno"> 276</span>&#160; fmpz_init(fmpz_tmp);</div>
<div class="line"><a name="l00277"></a><span class="lineno"> 277</span>&#160;</div>
<div class="line"><a name="l00278"></a><span class="lineno"> 278</span>&#160; fmpz_mul(fmpz_tmp, a_tmp_coeff_i, b_coeff_j);</div>
<div class="line"><a name="l00279"></a><span class="lineno"> 279</span>&#160; fmpz_add(fmpz_tmp, fmpz_tmp, c_coeff_k);</div>
<div class="line"><a name="l00280"></a><span class="lineno"> 280</span>&#160; fmpz_mod_ui(c_coeff_k, fmpz_tmp, modulus);</div>
<div class="line"><a name="l00281"></a><span class="lineno"> 281</span>&#160;</div>
<div class="line"><a name="l00282"></a><span class="lineno"> 282</span>&#160; fmpz_poly_set_coeff_fmpz(c, k, c_coeff_k);</div>
<div class="line"><a name="l00283"></a><span class="lineno"> 283</span>&#160;</div>
<div class="line"><a name="l00284"></a><span class="lineno"> 284</span>&#160; fmpz_clear(fmpz_tmp);</div>
<div class="line"><a name="l00285"></a><span class="lineno"> 285</span>&#160; }</div>
<div class="line"><a name="l00286"></a><span class="lineno"> 286</span>&#160; j++;</div>
<div class="line"><a name="l00287"></a><span class="lineno"> 287</span>&#160; }</div>
<div class="line"><a name="l00288"></a><span class="lineno"> 288</span>&#160; fmpz_clear(c_coeff_k);</div>
<div class="line"><a name="l00289"></a><span class="lineno"> 289</span>&#160; }</div>
<div class="line"><a name="l00290"></a><span class="lineno"> 290</span>&#160;</div>
<div class="line"><a name="l00291"></a><span class="lineno"> 291</span>&#160; fmpz_poly_clear(a_tmp);</div>
<div class="line"><a name="l00292"></a><span class="lineno"> 292</span>&#160;}</div>
<div class="line"><a name="l00293"></a><span class="lineno"> 293</span>&#160;</div>
<div class="line"><a name="l00294"></a><span class="lineno"> 294</span>&#160;<span class="comment">/*------------------------------------------------------------------------*/</span></div>
<div class="line"><a name="l00295"></a><span class="lineno"> 295</span>&#160;</div>
<div class="line"><a name="l00296"></a><span class="lineno"> 296</span>&#160;<span class="keywordtype">bool</span></div>
<div class="line"><a name="l00297"></a><span class="lineno"><a class="line" href="ntru__poly_8h.html#ace66beb516186e52f9b5b1ed8a397849"> 297</a></span>&#160;<a class="code" href="ntru__poly_8c.html#ace66beb516186e52f9b5b1ed8a397849">poly_inverse_poly_q</a>(<span class="keyword">const</span> fmpz_poly_t a,</div>
<div class="line"><a name="l00298"></a><span class="lineno"> 298</span>&#160; fmpz_poly_t Fq,</div>
<div class="line"><a name="l00299"></a><span class="lineno"> 299</span>&#160; <span class="keyword">const</span> <a class="code" href="structntru__params.html">ntru_params</a> *params)</div>
<div class="line"><a name="l00300"></a><span class="lineno"> 300</span>&#160;{</div>
<div class="line"><a name="l00301"></a><span class="lineno"> 301</span>&#160; <span class="keywordtype">bool</span> retval = <span class="keyword">false</span>;</div>
<div class="line"><a name="l00302"></a><span class="lineno"> 302</span>&#160; <span class="keywordtype">int</span> k = 0,</div>
<div class="line"><a name="l00303"></a><span class="lineno"> 303</span>&#160; j = 0;</div>
<div class="line"><a name="l00304"></a><span class="lineno"> 304</span>&#160; fmpz *b_last;</div>
<div class="line"><a name="l00305"></a><span class="lineno"> 305</span>&#160; fmpz_poly_t a_tmp,</div>
<div class="line"><a name="l00306"></a><span class="lineno"> 306</span>&#160; b,</div>
<div class="line"><a name="l00307"></a><span class="lineno"> 307</span>&#160; c,</div>
<div class="line"><a name="l00308"></a><span class="lineno"> 308</span>&#160; f,</div>
<div class="line"><a name="l00309"></a><span class="lineno"> 309</span>&#160; g;</div>
<div class="line"><a name="l00310"></a><span class="lineno"> 310</span>&#160;</div>
<div class="line"><a name="l00311"></a><span class="lineno"> 311</span>&#160; <span class="comment">/* general initialization of temp variables */</span></div>
<div class="line"><a name="l00312"></a><span class="lineno"> 312</span>&#160; fmpz_poly_init(b);</div>
<div class="line"><a name="l00313"></a><span class="lineno"> 313</span>&#160; fmpz_poly_set_coeff_ui(b, 0, 1);</div>
<div class="line"><a name="l00314"></a><span class="lineno"> 314</span>&#160; fmpz_poly_init(c);</div>
<div class="line"><a name="l00315"></a><span class="lineno"> 315</span>&#160; fmpz_poly_init(f);</div>
<div class="line"><a name="l00316"></a><span class="lineno"> 316</span>&#160; fmpz_poly_set(f, a);</div>
<div class="line"><a name="l00317"></a><span class="lineno"> 317</span>&#160;</div>
<div class="line"><a name="l00318"></a><span class="lineno"> 318</span>&#160; <span class="comment">/* set g(x) = x^N 1 */</span></div>
<div class="line"><a name="l00319"></a><span class="lineno"> 319</span>&#160; fmpz_poly_init(g);</div>
<div class="line"><a name="l00320"></a><span class="lineno"> 320</span>&#160; fmpz_poly_set_coeff_si(g, 0, -1);</div>
<div class="line"><a name="l00321"></a><span class="lineno"> 321</span>&#160; fmpz_poly_set_coeff_si(g, params-&gt;<a class="code" href="structntru__params.html#afb8425ee3db2b917b3c4e8d9b75bd3ff">N</a>, 1);</div>
<div class="line"><a name="l00322"></a><span class="lineno"> 322</span>&#160;</div>
<div class="line"><a name="l00323"></a><span class="lineno"> 323</span>&#160; <span class="comment">/* avoid side effects */</span></div>
<div class="line"><a name="l00324"></a><span class="lineno"> 324</span>&#160; fmpz_poly_init(a_tmp);</div>
<div class="line"><a name="l00325"></a><span class="lineno"> 325</span>&#160; fmpz_poly_set(a_tmp, a);</div>
<div class="line"><a name="l00326"></a><span class="lineno"> 326</span>&#160; fmpz_poly_zero(Fq);</div>
<div class="line"><a name="l00327"></a><span class="lineno"> 327</span>&#160;</div>
<div class="line"><a name="l00328"></a><span class="lineno"> 328</span>&#160; <span class="keywordflow">while</span> (1) {</div>
<div class="line"><a name="l00329"></a><span class="lineno"> 329</span>&#160; <span class="keywordflow">while</span> (fmpz_is_zero(fmpz_poly_get_coeff_ptr(f, 0))) {</div>
<div class="line"><a name="l00330"></a><span class="lineno"> 330</span>&#160; <span class="keywordflow">for</span> (uint32_t i = 1; i &lt;= params-&gt;<a class="code" href="structntru__params.html#afb8425ee3db2b917b3c4e8d9b75bd3ff">N</a>; i++) {</div>
<div class="line"><a name="l00331"></a><span class="lineno"> 331</span>&#160; fmpz *f_coeff = fmpz_poly_get_coeff_ptr(f, i);</div>
<div class="line"><a name="l00332"></a><span class="lineno"> 332</span>&#160; fmpz *c_coeff = fmpz_poly_get_coeff_ptr(c, params-&gt;<a class="code" href="structntru__params.html#afb8425ee3db2b917b3c4e8d9b75bd3ff">N</a> - i);</div>
<div class="line"><a name="l00333"></a><span class="lineno"> 333</span>&#160;</div>
<div class="line"><a name="l00334"></a><span class="lineno"> 334</span>&#160; <span class="comment">/* f(x) = f(x) / x */</span></div>
<div class="line"><a name="l00335"></a><span class="lineno"> 335</span>&#160; <a class="code" href="ntru__poly_8c.html#ab1f966fe680d1ce7c19c8c812d1932a7">fmpz_poly_set_coeff_fmpz_n</a>(f, i - 1,</div>
<div class="line"><a name="l00336"></a><span class="lineno"> 336</span>&#160; f_coeff);</div>
<div class="line"><a name="l00337"></a><span class="lineno"> 337</span>&#160;</div>
<div class="line"><a name="l00338"></a><span class="lineno"> 338</span>&#160; <span class="comment">/* c(x) = c(x) * x */</span></div>
<div class="line"><a name="l00339"></a><span class="lineno"> 339</span>&#160; <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,</div>
<div class="line"><a name="l00340"></a><span class="lineno"> 340</span>&#160; c_coeff);</div>
<div class="line"><a name="l00341"></a><span class="lineno"> 341</span>&#160; }</div>
<div class="line"><a name="l00342"></a><span class="lineno"> 342</span>&#160;</div>
<div class="line"><a name="l00343"></a><span class="lineno"> 343</span>&#160; fmpz_poly_set_coeff_si(f, params-&gt;<a class="code" href="structntru__params.html#afb8425ee3db2b917b3c4e8d9b75bd3ff">N</a>, 0);</div>
<div class="line"><a name="l00344"></a><span class="lineno"> 344</span>&#160; fmpz_poly_set_coeff_si(c, 0, 0);</div>
<div class="line"><a name="l00345"></a><span class="lineno"> 345</span>&#160;</div>
<div class="line"><a name="l00346"></a><span class="lineno"> 346</span>&#160; k++;</div>
<div class="line"><a name="l00347"></a><span class="lineno"> 347</span>&#160;</div>
<div class="line"><a name="l00348"></a><span class="lineno"> 348</span>&#160; <span class="keywordflow">if</span> (fmpz_poly_degree(f) == -1)</div>
<div class="line"><a name="l00349"></a><span class="lineno"> 349</span>&#160; <span class="keywordflow">goto</span> _cleanup;</div>
<div class="line"><a name="l00350"></a><span class="lineno"> 350</span>&#160; }</div>
<div class="line"><a name="l00351"></a><span class="lineno"> 351</span>&#160;</div>
<div class="line"><a name="l00352"></a><span class="lineno"> 352</span>&#160; <span class="keywordflow">if</span> (fmpz_poly_degree(f) == 0)</div>
<div class="line"><a name="l00353"></a><span class="lineno"> 353</span>&#160; <span class="keywordflow">break</span>;</div>
<div class="line"><a name="l00354"></a><span class="lineno"> 354</span>&#160;</div>
<div class="line"><a name="l00355"></a><span class="lineno"> 355</span>&#160; <span class="keywordflow">if</span> (fmpz_poly_degree(f) &lt; fmpz_poly_degree(g)) {</div>
<div class="line"><a name="l00356"></a><span class="lineno"> 356</span>&#160; fmpz_poly_swap(f, g);</div>
<div class="line"><a name="l00357"></a><span class="lineno"> 357</span>&#160; fmpz_poly_swap(b, c);</div>
<div class="line"><a name="l00358"></a><span class="lineno"> 358</span>&#160; }</div>
<div class="line"><a name="l00359"></a><span class="lineno"> 359</span>&#160;</div>
<div class="line"><a name="l00360"></a><span class="lineno"> 360</span>&#160; fmpz_poly_add(f, g, f);</div>
<div class="line"><a name="l00361"></a><span class="lineno"> 361</span>&#160; <a class="code" href="ntru__poly_8c.html#ae7d0d8364dba689df3fb4904610634cc">fmpz_poly_mod_unsigned</a>(f, 2);</div>
<div class="line"><a name="l00362"></a><span class="lineno"> 362</span>&#160;</div>
<div class="line"><a name="l00363"></a><span class="lineno"> 363</span>&#160; fmpz_poly_add(b, c, b);</div>
<div class="line"><a name="l00364"></a><span class="lineno"> 364</span>&#160; <a class="code" href="ntru__poly_8c.html#ae7d0d8364dba689df3fb4904610634cc">fmpz_poly_mod_unsigned</a>(b, 2);</div>
<div class="line"><a name="l00365"></a><span class="lineno"> 365</span>&#160; }</div>
<div class="line"><a name="l00366"></a><span class="lineno"> 366</span>&#160;</div>
<div class="line"><a name="l00367"></a><span class="lineno"> 367</span>&#160; k = k % params-&gt;<a class="code" href="structntru__params.html#afb8425ee3db2b917b3c4e8d9b75bd3ff">N</a>;</div>
<div class="line"><a name="l00368"></a><span class="lineno"> 368</span>&#160;</div>
<div class="line"><a name="l00369"></a><span class="lineno"> 369</span>&#160; b_last = fmpz_poly_get_coeff_ptr(b, params-&gt;<a class="code" href="structntru__params.html#afb8425ee3db2b917b3c4e8d9b75bd3ff">N</a>);</div>
<div class="line"><a name="l00370"></a><span class="lineno"> 370</span>&#160; <span class="keywordflow">if</span> (<a class="code" href="ntru__poly_8c.html#aaaac83ec72414aa208832442657c3520">fmpz_cmp_si_n</a>(b_last, 0))</div>
<div class="line"><a name="l00371"></a><span class="lineno"> 371</span>&#160; <span class="keywordflow">goto</span> _cleanup;</div>
<div class="line"><a name="l00372"></a><span class="lineno"> 372</span>&#160;</div>
<div class="line"><a name="l00373"></a><span class="lineno"> 373</span>&#160; <span class="comment">/* Fq(x) = x^(N-k) * b(x) */</span></div>
<div class="line"><a name="l00374"></a><span class="lineno"> 374</span>&#160; <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--) {</div>
<div class="line"><a name="l00375"></a><span class="lineno"> 375</span>&#160; fmpz *b_i;</div>
<div class="line"><a name="l00376"></a><span class="lineno"> 376</span>&#160;</div>
<div class="line"><a name="l00377"></a><span class="lineno"> 377</span>&#160; j = i - k;</div>
<div class="line"><a name="l00378"></a><span class="lineno"> 378</span>&#160;</div>
<div class="line"><a name="l00379"></a><span class="lineno"> 379</span>&#160; <span class="keywordflow">if</span> (j &lt; 0)</div>
<div class="line"><a name="l00380"></a><span class="lineno"> 380</span>&#160; j = j + params-&gt;<a class="code" href="structntru__params.html#afb8425ee3db2b917b3c4e8d9b75bd3ff">N</a>;</div>
<div class="line"><a name="l00381"></a><span class="lineno"> 381</span>&#160;</div>
<div class="line"><a name="l00382"></a><span class="lineno"> 382</span>&#160; b_i = fmpz_poly_get_coeff_ptr(b, i);</div>
<div class="line"><a name="l00383"></a><span class="lineno"> 383</span>&#160; <a class="code" href="ntru__poly_8c.html#ab1f966fe680d1ce7c19c8c812d1932a7">fmpz_poly_set_coeff_fmpz_n</a>(Fq, j, b_i);</div>
<div class="line"><a name="l00384"></a><span class="lineno"> 384</span>&#160; }</div>
<div class="line"><a name="l00385"></a><span class="lineno"> 385</span>&#160;</div>
<div class="line"><a name="l00386"></a><span class="lineno"> 386</span>&#160; <a class="code" href="ntru__poly_8c.html#a891af13dc4355c9fab9ca3fafcac8054">poly_mod2_to_modq</a>(a_tmp, Fq, params);</div>
<div class="line"><a name="l00387"></a><span class="lineno"> 387</span>&#160;</div>
<div class="line"><a name="l00388"></a><span class="lineno"> 388</span>&#160; <span class="comment">/* check if the f * Fq = 1 (mod p) condition holds true */</span></div>
<div class="line"><a name="l00389"></a><span class="lineno"> 389</span>&#160; fmpz_poly_set(a_tmp, a);</div>
<div class="line"><a name="l00390"></a><span class="lineno"> 390</span>&#160; <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>);</div>
<div class="line"><a name="l00391"></a><span class="lineno"> 391</span>&#160; <span class="keywordflow">if</span> (fmpz_poly_is_one(a_tmp))</div>
<div class="line"><a name="l00392"></a><span class="lineno"> 392</span>&#160; retval = <span class="keyword">true</span>;</div>
<div class="line"><a name="l00393"></a><span class="lineno"> 393</span>&#160; <span class="keywordflow">else</span></div>
<div class="line"><a name="l00394"></a><span class="lineno"> 394</span>&#160; fmpz_poly_zero(Fq);</div>
<div class="line"><a name="l00395"></a><span class="lineno"> 395</span>&#160;</div>
<div class="line"><a name="l00396"></a><span class="lineno"> 396</span>&#160;_cleanup:</div>
<div class="line"><a name="l00397"></a><span class="lineno"> 397</span>&#160; fmpz_poly_clear(a_tmp);</div>
<div class="line"><a name="l00398"></a><span class="lineno"> 398</span>&#160; fmpz_poly_clear(b);</div>
<div class="line"><a name="l00399"></a><span class="lineno"> 399</span>&#160; fmpz_poly_clear(c);</div>
<div class="line"><a name="l00400"></a><span class="lineno"> 400</span>&#160; fmpz_poly_clear(f);</div>
<div class="line"><a name="l00401"></a><span class="lineno"> 401</span>&#160; fmpz_poly_clear(g);</div>
<div class="line"><a name="l00402"></a><span class="lineno"> 402</span>&#160;</div>
<div class="line"><a name="l00403"></a><span class="lineno"> 403</span>&#160; <span class="keywordflow">return</span> retval;</div>
<div class="line"><a name="l00404"></a><span class="lineno"> 404</span>&#160;}</div>
<div class="line"><a name="l00405"></a><span class="lineno"> 405</span>&#160;</div>
<div class="line"><a name="l00406"></a><span class="lineno"> 406</span>&#160;<span class="comment">/*------------------------------------------------------------------------*/</span></div>
<div class="line"><a name="l00407"></a><span class="lineno"> 407</span>&#160;</div>
<div class="line"><a name="l00408"></a><span class="lineno"> 408</span>&#160;<span class="keywordtype">bool</span></div>
<div class="line"><a name="l00409"></a><span class="lineno"><a class="line" href="ntru__poly_8h.html#ae77b2014df42e5ed612206d5930ac608"> 409</a></span>&#160;<a class="code" href="ntru__poly_8c.html#ae77b2014df42e5ed612206d5930ac608">poly_inverse_poly_p</a>(<span class="keyword">const</span> fmpz_poly_t a,</div>
<div class="line"><a name="l00410"></a><span class="lineno"> 410</span>&#160; fmpz_poly_t Fp,</div>
<div class="line"><a name="l00411"></a><span class="lineno"> 411</span>&#160; <span class="keyword">const</span> <a class="code" href="structntru__params.html">ntru_params</a> *params)</div>
<div class="line"><a name="l00412"></a><span class="lineno"> 412</span>&#160;{</div>
<div class="line"><a name="l00413"></a><span class="lineno"> 413</span>&#160; <span class="keywordtype">bool</span> retval = <span class="keyword">false</span>;</div>
<div class="line"><a name="l00414"></a><span class="lineno"> 414</span>&#160; <span class="keywordtype">int</span> k = 0,</div>
<div class="line"><a name="l00415"></a><span class="lineno"> 415</span>&#160; j = 0;</div>
<div class="line"><a name="l00416"></a><span class="lineno"> 416</span>&#160; fmpz *b_last;</div>
<div class="line"><a name="l00417"></a><span class="lineno"> 417</span>&#160; fmpz_poly_t a_tmp,</div>
<div class="line"><a name="l00418"></a><span class="lineno"> 418</span>&#160; b,</div>
<div class="line"><a name="l00419"></a><span class="lineno"> 419</span>&#160; c,</div>
<div class="line"><a name="l00420"></a><span class="lineno"> 420</span>&#160; f,</div>
<div class="line"><a name="l00421"></a><span class="lineno"> 421</span>&#160; g;</div>
<div class="line"><a name="l00422"></a><span class="lineno"> 422</span>&#160;</div>
<div class="line"><a name="l00423"></a><span class="lineno"> 423</span>&#160; <span class="comment">/* general initialization of temp variables */</span></div>
<div class="line"><a name="l00424"></a><span class="lineno"> 424</span>&#160; fmpz_poly_init(b);</div>
<div class="line"><a name="l00425"></a><span class="lineno"> 425</span>&#160; fmpz_poly_set_coeff_ui(b, 0, 1);</div>
<div class="line"><a name="l00426"></a><span class="lineno"> 426</span>&#160; fmpz_poly_init(c);</div>
<div class="line"><a name="l00427"></a><span class="lineno"> 427</span>&#160; fmpz_poly_init(f);</div>
<div class="line"><a name="l00428"></a><span class="lineno"> 428</span>&#160; fmpz_poly_set(f, a);</div>
<div class="line"><a name="l00429"></a><span class="lineno"> 429</span>&#160;</div>
<div class="line"><a name="l00430"></a><span class="lineno"> 430</span>&#160; <span class="comment">/* set g(x) = x^N 1 */</span></div>
<div class="line"><a name="l00431"></a><span class="lineno"> 431</span>&#160; fmpz_poly_init(g);</div>
<div class="line"><a name="l00432"></a><span class="lineno"> 432</span>&#160; fmpz_poly_set_coeff_si(g, 0, -1);</div>
<div class="line"><a name="l00433"></a><span class="lineno"> 433</span>&#160; fmpz_poly_set_coeff_si(g, params-&gt;<a class="code" href="structntru__params.html#afb8425ee3db2b917b3c4e8d9b75bd3ff">N</a>, 1);</div>
<div class="line"><a name="l00434"></a><span class="lineno"> 434</span>&#160;</div>
<div class="line"><a name="l00435"></a><span class="lineno"> 435</span>&#160; <span class="comment">/* avoid side effects */</span></div>
<div class="line"><a name="l00436"></a><span class="lineno"> 436</span>&#160; fmpz_poly_init(a_tmp);</div>
<div class="line"><a name="l00437"></a><span class="lineno"> 437</span>&#160; fmpz_poly_set(a_tmp, a);</div>
<div class="line"><a name="l00438"></a><span class="lineno"> 438</span>&#160; fmpz_poly_zero(Fp);</div>
<div class="line"><a name="l00439"></a><span class="lineno"> 439</span>&#160;</div>
<div class="line"><a name="l00440"></a><span class="lineno"> 440</span>&#160; <span class="keywordflow">while</span> (1) {</div>
<div class="line"><a name="l00441"></a><span class="lineno"> 441</span>&#160; <span class="keywordflow">while</span> (fmpz_is_zero(fmpz_poly_get_coeff_ptr(f, 0))) {</div>
<div class="line"><a name="l00442"></a><span class="lineno"> 442</span>&#160; <span class="keywordflow">for</span> (uint32_t i = 1; i &lt;= params-&gt;<a class="code" href="structntru__params.html#afb8425ee3db2b917b3c4e8d9b75bd3ff">N</a>; i++) {</div>
<div class="line"><a name="l00443"></a><span class="lineno"> 443</span>&#160; fmpz *f_coeff = fmpz_poly_get_coeff_ptr(f, i);</div>
<div class="line"><a name="l00444"></a><span class="lineno"> 444</span>&#160; fmpz *c_coeff = fmpz_poly_get_coeff_ptr(c, params-&gt;<a class="code" href="structntru__params.html#afb8425ee3db2b917b3c4e8d9b75bd3ff">N</a> - i);</div>
<div class="line"><a name="l00445"></a><span class="lineno"> 445</span>&#160;</div>
<div class="line"><a name="l00446"></a><span class="lineno"> 446</span>&#160; <span class="comment">/* f(x) = f(x) / x */</span></div>
<div class="line"><a name="l00447"></a><span class="lineno"> 447</span>&#160; <a class="code" href="ntru__poly_8c.html#ab1f966fe680d1ce7c19c8c812d1932a7">fmpz_poly_set_coeff_fmpz_n</a>(f, i - 1,</div>
<div class="line"><a name="l00448"></a><span class="lineno"> 448</span>&#160; f_coeff);</div>
<div class="line"><a name="l00449"></a><span class="lineno"> 449</span>&#160;</div>
<div class="line"><a name="l00450"></a><span class="lineno"> 450</span>&#160; <span class="comment">/* c(x) = c(x) * x */</span></div>
<div class="line"><a name="l00451"></a><span class="lineno"> 451</span>&#160; <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,</div>
<div class="line"><a name="l00452"></a><span class="lineno"> 452</span>&#160; c_coeff);</div>
<div class="line"><a name="l00453"></a><span class="lineno"> 453</span>&#160; }</div>
<div class="line"><a name="l00454"></a><span class="lineno"> 454</span>&#160;</div>
<div class="line"><a name="l00455"></a><span class="lineno"> 455</span>&#160; fmpz_poly_set_coeff_si(f, params-&gt;<a class="code" href="structntru__params.html#afb8425ee3db2b917b3c4e8d9b75bd3ff">N</a>, 0);</div>
<div class="line"><a name="l00456"></a><span class="lineno"> 456</span>&#160; fmpz_poly_set_coeff_si(c, 0, 0);</div>
<div class="line"><a name="l00457"></a><span class="lineno"> 457</span>&#160;</div>
<div class="line"><a name="l00458"></a><span class="lineno"> 458</span>&#160; k++;</div>
<div class="line"><a name="l00459"></a><span class="lineno"> 459</span>&#160;</div>
<div class="line"><a name="l00460"></a><span class="lineno"> 460</span>&#160; <span class="keywordflow">if</span> (fmpz_poly_degree(f) == -1)</div>
<div class="line"><a name="l00461"></a><span class="lineno"> 461</span>&#160; <span class="keywordflow">goto</span> cleanup;</div>
<div class="line"><a name="l00462"></a><span class="lineno"> 462</span>&#160; }</div>
<div class="line"><a name="l00463"></a><span class="lineno"> 463</span>&#160;</div>
<div class="line"><a name="l00464"></a><span class="lineno"> 464</span>&#160; <span class="keywordflow">if</span> (fmpz_poly_degree(f) == 0)</div>
<div class="line"><a name="l00465"></a><span class="lineno"> 465</span>&#160; <span class="keywordflow">break</span>;</div>
<div class="line"><a name="l00466"></a><span class="lineno"> 466</span>&#160;</div>
<div class="line"><a name="l00467"></a><span class="lineno"> 467</span>&#160; <span class="keywordflow">if</span> (fmpz_poly_degree(f) &lt; fmpz_poly_degree(g)) {</div>
<div class="line"><a name="l00468"></a><span class="lineno"> 468</span>&#160; <span class="comment">/* exchange f and g and exchange b and c */</span></div>
<div class="line"><a name="l00469"></a><span class="lineno"> 469</span>&#160; fmpz_poly_swap(f, g);</div>
<div class="line"><a name="l00470"></a><span class="lineno"> 470</span>&#160; fmpz_poly_swap(b, c);</div>
<div class="line"><a name="l00471"></a><span class="lineno"> 471</span>&#160; }</div>
<div class="line"><a name="l00472"></a><span class="lineno"> 472</span>&#160;</div>
<div class="line"><a name="l00473"></a><span class="lineno"> 473</span>&#160; {</div>
<div class="line"><a name="l00474"></a><span class="lineno"> 474</span>&#160; fmpz_poly_t c_tmp,</div>
<div class="line"><a name="l00475"></a><span class="lineno"> 475</span>&#160; g_tmp;</div>
<div class="line"><a name="l00476"></a><span class="lineno"> 476</span>&#160; fmpz_t u,</div>
<div class="line"><a name="l00477"></a><span class="lineno"> 477</span>&#160; mp_tmp;</div>
<div class="line"><a name="l00478"></a><span class="lineno"> 478</span>&#160;</div>
<div class="line"><a name="l00479"></a><span class="lineno"> 479</span>&#160; fmpz_init(u);</div>
<div class="line"><a name="l00480"></a><span class="lineno"> 480</span>&#160; fmpz_zero(u);</div>
<div class="line"><a name="l00481"></a><span class="lineno"> 481</span>&#160;</div>
<div class="line"><a name="l00482"></a><span class="lineno"> 482</span>&#160; fmpz_init_set(mp_tmp, fmpz_poly_get_coeff_ptr(f, 0));</div>
<div class="line"><a name="l00483"></a><span class="lineno"> 483</span>&#160;</div>
<div class="line"><a name="l00484"></a><span class="lineno"> 484</span>&#160; fmpz_poly_init(g_tmp);</div>
<div class="line"><a name="l00485"></a><span class="lineno"> 485</span>&#160; fmpz_poly_set(g_tmp, g);</div>
<div class="line"><a name="l00486"></a><span class="lineno"> 486</span>&#160;</div>
<div class="line"><a name="l00487"></a><span class="lineno"> 487</span>&#160; fmpz_poly_init(c_tmp);</div>
<div class="line"><a name="l00488"></a><span class="lineno"> 488</span>&#160; fmpz_poly_set(c_tmp, c);</div>
<div class="line"><a name="l00489"></a><span class="lineno"> 489</span>&#160;</div>
<div class="line"><a name="l00490"></a><span class="lineno"> 490</span>&#160; <span class="comment">/* u = f[0] * g[0]^(-1) mod p */</span></div>
<div class="line"><a name="l00491"></a><span class="lineno"> 491</span>&#160; <span class="comment">/* = (f[0] mod p) * (g[0] inverse mod p) mod p */</span></div>
<div class="line"><a name="l00492"></a><span class="lineno"> 492</span>&#160; <a class="code" href="ntru__poly_8c.html#a59da1b7962829af8f18d58c05f588606">fmpz_invmod_ui</a>(u,</div>
<div class="line"><a name="l00493"></a><span class="lineno"> 493</span>&#160; fmpz_poly_get_coeff_ptr(g, 0),</div>
<div class="line"><a name="l00494"></a><span class="lineno"> 494</span>&#160; params-&gt;<a class="code" href="structntru__params.html#a41b368825e1eb126604e13e8f549ec8f">p</a>);</div>
<div class="line"><a name="l00495"></a><span class="lineno"> 495</span>&#160; fmpz_mod_ui(mp_tmp, mp_tmp, params-&gt;<a class="code" href="structntru__params.html#a41b368825e1eb126604e13e8f549ec8f">p</a>);</div>
<div class="line"><a name="l00496"></a><span class="lineno"> 496</span>&#160; fmpz_mul(u, mp_tmp, u);</div>
<div class="line"><a name="l00497"></a><span class="lineno"> 497</span>&#160; fmpz_mod_ui(u, u, params-&gt;<a class="code" href="structntru__params.html#a41b368825e1eb126604e13e8f549ec8f">p</a>);</div>
<div class="line"><a name="l00498"></a><span class="lineno"> 498</span>&#160;</div>
<div class="line"><a name="l00499"></a><span class="lineno"> 499</span>&#160; <span class="comment">/* f = f - u * g mod p */</span></div>
<div class="line"><a name="l00500"></a><span class="lineno"> 500</span>&#160; fmpz_poly_scalar_mul_fmpz(g_tmp, g_tmp, u);</div>
<div class="line"><a name="l00501"></a><span class="lineno"> 501</span>&#160; fmpz_poly_sub(f, g_tmp, f);</div>
<div class="line"><a name="l00502"></a><span class="lineno"> 502</span>&#160; <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>);</div>
<div class="line"><a name="l00503"></a><span class="lineno"> 503</span>&#160;</div>
<div class="line"><a name="l00504"></a><span class="lineno"> 504</span>&#160; <span class="comment">/* b = b - u * c mod p */</span></div>
<div class="line"><a name="l00505"></a><span class="lineno"> 505</span>&#160; fmpz_poly_scalar_mul_fmpz(c_tmp, c_tmp, u);</div>
<div class="line"><a name="l00506"></a><span class="lineno"> 506</span>&#160; fmpz_poly_sub(b, c_tmp, b);</div>
<div class="line"><a name="l00507"></a><span class="lineno"> 507</span>&#160; <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>);</div>
<div class="line"><a name="l00508"></a><span class="lineno"> 508</span>&#160;</div>
<div class="line"><a name="l00509"></a><span class="lineno"> 509</span>&#160; fmpz_clear(u);</div>
<div class="line"><a name="l00510"></a><span class="lineno"> 510</span>&#160; fmpz_poly_clear(g_tmp);</div>
<div class="line"><a name="l00511"></a><span class="lineno"> 511</span>&#160; fmpz_poly_clear(c_tmp);</div>
<div class="line"><a name="l00512"></a><span class="lineno"> 512</span>&#160; }</div>
<div class="line"><a name="l00513"></a><span class="lineno"> 513</span>&#160; }</div>
<div class="line"><a name="l00514"></a><span class="lineno"> 514</span>&#160;</div>
<div class="line"><a name="l00515"></a><span class="lineno"> 515</span>&#160; k = k % params-&gt;<a class="code" href="structntru__params.html#afb8425ee3db2b917b3c4e8d9b75bd3ff">N</a>;</div>
<div class="line"><a name="l00516"></a><span class="lineno"> 516</span>&#160;</div>
<div class="line"><a name="l00517"></a><span class="lineno"> 517</span>&#160; b_last = fmpz_poly_get_coeff_ptr(b, params-&gt;<a class="code" href="structntru__params.html#afb8425ee3db2b917b3c4e8d9b75bd3ff">N</a>);</div>
<div class="line"><a name="l00518"></a><span class="lineno"> 518</span>&#160; <span class="keywordflow">if</span> (<a class="code" href="ntru__poly_8c.html#aaaac83ec72414aa208832442657c3520">fmpz_cmp_si_n</a>(b_last, 0))</div>
<div class="line"><a name="l00519"></a><span class="lineno"> 519</span>&#160; <span class="keywordflow">goto</span> cleanup;</div>
<div class="line"><a name="l00520"></a><span class="lineno"> 520</span>&#160;</div>
<div class="line"><a name="l00521"></a><span class="lineno"> 521</span>&#160; <span class="comment">/* Fp(x) = x^(N-k) * b(x) */</span></div>
<div class="line"><a name="l00522"></a><span class="lineno"> 522</span>&#160; <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--) {</div>
<div class="line"><a name="l00523"></a><span class="lineno"> 523</span>&#160; fmpz *b_i;</div>
<div class="line"><a name="l00524"></a><span class="lineno"> 524</span>&#160;</div>
<div class="line"><a name="l00525"></a><span class="lineno"> 525</span>&#160; <span class="comment">/* b(X) = f[0]^(-1) * b(X) (mod p) */</span></div>
<div class="line"><a name="l00526"></a><span class="lineno"> 526</span>&#160; {</div>
<div class="line"><a name="l00527"></a><span class="lineno"> 527</span>&#160; fmpz_t mp_tmp;</div>
<div class="line"><a name="l00528"></a><span class="lineno"> 528</span>&#160;</div>
<div class="line"><a name="l00529"></a><span class="lineno"> 529</span>&#160; fmpz_init(mp_tmp);</div>
<div class="line"><a name="l00530"></a><span class="lineno"> 530</span>&#160;</div>
<div class="line"><a name="l00531"></a><span class="lineno"> 531</span>&#160; <a class="code" href="ntru__poly_8c.html#a59da1b7962829af8f18d58c05f588606">fmpz_invmod_ui</a>(mp_tmp,</div>
<div class="line"><a name="l00532"></a><span class="lineno"> 532</span>&#160; fmpz_poly_get_coeff_ptr(f, 0),</div>
<div class="line"><a name="l00533"></a><span class="lineno"> 533</span>&#160; params-&gt;<a class="code" href="structntru__params.html#a41b368825e1eb126604e13e8f549ec8f">p</a>);</div>
<div class="line"><a name="l00534"></a><span class="lineno"> 534</span>&#160;</div>
<div class="line"><a name="l00535"></a><span class="lineno"> 535</span>&#160; <span class="keywordflow">if</span> (fmpz_poly_get_coeff_ptr(b, i)) {</div>
<div class="line"><a name="l00536"></a><span class="lineno"> 536</span>&#160; fmpz_mul(fmpz_poly_get_coeff_ptr(b, i),</div>
<div class="line"><a name="l00537"></a><span class="lineno"> 537</span>&#160; fmpz_poly_get_coeff_ptr(b, i),</div>
<div class="line"><a name="l00538"></a><span class="lineno"> 538</span>&#160; mp_tmp);</div>
<div class="line"><a name="l00539"></a><span class="lineno"> 539</span>&#160; fmpz_mod_ui(fmpz_poly_get_coeff_ptr(b, i),</div>
<div class="line"><a name="l00540"></a><span class="lineno"> 540</span>&#160; fmpz_poly_get_coeff_ptr(b, i),</div>
<div class="line"><a name="l00541"></a><span class="lineno"> 541</span>&#160; params-&gt;<a class="code" href="structntru__params.html#a41b368825e1eb126604e13e8f549ec8f">p</a>);</div>
<div class="line"><a name="l00542"></a><span class="lineno"> 542</span>&#160; }</div>
<div class="line"><a name="l00543"></a><span class="lineno"> 543</span>&#160; }</div>
<div class="line"><a name="l00544"></a><span class="lineno"> 544</span>&#160;</div>
<div class="line"><a name="l00545"></a><span class="lineno"> 545</span>&#160; j = i - k;</div>
<div class="line"><a name="l00546"></a><span class="lineno"> 546</span>&#160; <span class="keywordflow">if</span> (j &lt; 0)</div>
<div class="line"><a name="l00547"></a><span class="lineno"> 547</span>&#160; j = j + params-&gt;<a class="code" href="structntru__params.html#afb8425ee3db2b917b3c4e8d9b75bd3ff">N</a>;</div>
<div class="line"><a name="l00548"></a><span class="lineno"> 548</span>&#160;</div>
<div class="line"><a name="l00549"></a><span class="lineno"> 549</span>&#160; b_i = fmpz_poly_get_coeff_ptr(b, i);</div>
<div class="line"><a name="l00550"></a><span class="lineno"> 550</span>&#160; <a class="code" href="ntru__poly_8c.html#ab1f966fe680d1ce7c19c8c812d1932a7">fmpz_poly_set_coeff_fmpz_n</a>(Fp, j, b_i);</div>
<div class="line"><a name="l00551"></a><span class="lineno"> 551</span>&#160; }</div>
<div class="line"><a name="l00552"></a><span class="lineno"> 552</span>&#160;</div>
<div class="line"><a name="l00553"></a><span class="lineno"> 553</span>&#160; <span class="comment">/* check if the f * Fp = 1 (mod p) condition holds true */</span></div>
<div class="line"><a name="l00554"></a><span class="lineno"> 554</span>&#160; fmpz_poly_set(a_tmp, a);</div>
<div class="line"><a name="l00555"></a><span class="lineno"> 555</span>&#160; <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>);</div>
<div class="line"><a name="l00556"></a><span class="lineno"> 556</span>&#160; <span class="keywordflow">if</span> (fmpz_poly_is_one(a_tmp))</div>
<div class="line"><a name="l00557"></a><span class="lineno"> 557</span>&#160; retval = <span class="keyword">true</span>;</div>
<div class="line"><a name="l00558"></a><span class="lineno"> 558</span>&#160; <span class="keywordflow">else</span></div>
<div class="line"><a name="l00559"></a><span class="lineno"> 559</span>&#160; fmpz_poly_zero(Fp);</div>
<div class="line"><a name="l00560"></a><span class="lineno"> 560</span>&#160;</div>
<div class="line"><a name="l00561"></a><span class="lineno"> 561</span>&#160;cleanup:</div>
<div class="line"><a name="l00562"></a><span class="lineno"> 562</span>&#160; fmpz_poly_clear(a_tmp);</div>
<div class="line"><a name="l00563"></a><span class="lineno"> 563</span>&#160; fmpz_poly_clear(b);</div>
<div class="line"><a name="l00564"></a><span class="lineno"> 564</span>&#160; fmpz_poly_clear(c);</div>
<div class="line"><a name="l00565"></a><span class="lineno"> 565</span>&#160; fmpz_poly_clear(f);</div>
<div class="line"><a name="l00566"></a><span class="lineno"> 566</span>&#160; fmpz_poly_clear(g);</div>
<div class="line"><a name="l00567"></a><span class="lineno"> 567</span>&#160;</div>
<div class="line"><a name="l00568"></a><span class="lineno"> 568</span>&#160; <span class="keywordflow">return</span> retval;</div>
<div class="line"><a name="l00569"></a><span class="lineno"> 569</span>&#160;}</div>
<div class="line"><a name="l00570"></a><span class="lineno"> 570</span>&#160;</div>
<div class="line"><a name="l00571"></a><span class="lineno"> 571</span>&#160;<span class="comment">/*------------------------------------------------------------------------*/</span></div>
<div class="line"><a name="l00572"></a><span class="lineno"> 572</span>&#160;</div>
<div class="line"><a name="l00573"></a><span class="lineno"> 573</span>&#160;<span class="keywordtype">void</span></div>
<div class="line"><a name="l00574"></a><span class="lineno"><a class="line" href="ntru_8h.html#a80a8ce0f2944bc3df94291ef2f781498"> 574</a></span>&#160;<a class="code" href="ntru__poly_8c.html#a80a8ce0f2944bc3df94291ef2f781498">poly_draw</a>(<span class="keyword">const</span> fmpz_poly_t poly)</div>
<div class="line"><a name="l00575"></a><span class="lineno"> 575</span>&#160;{</div>
<div class="line"><a name="l00576"></a><span class="lineno"> 576</span>&#160; fmpz_poly_print(poly);</div>
<div class="line"><a name="l00577"></a><span class="lineno"> 577</span>&#160; flint_printf(<span class="stringliteral">&quot;\n&quot;</span>);</div>
<div class="line"><a name="l00578"></a><span class="lineno"> 578</span>&#160;}</div>
<div class="line"><a name="l00579"></a><span class="lineno"> 579</span>&#160;</div>
<div class="line"><a name="l00580"></a><span class="lineno"> 580</span>&#160;<span class="comment">/*------------------------------------------------------------------------*/</span></div>
<div class="line"><a name="l00581"></a><span class="lineno"> 581</span>&#160;</div>
<div class="line"><a name="l00582"></a><span class="lineno"> 582</span>&#160;<span class="keywordtype">void</span></div>
<div class="line"><a name="l00583"></a><span class="lineno"><a class="line" href="ntru_8h.html#aec098d00160d2d502eb1f8a7c3fa5453"> 583</a></span>&#160;<a class="code" href="ntru__poly_8c.html#aec098d00160d2d502eb1f8a7c3fa5453">poly_draw_pretty</a>(<span class="keyword">const</span> fmpz_poly_t poly)</div>
<div class="line"><a name="l00584"></a><span class="lineno"> 584</span>&#160;{</div>
<div class="line"><a name="l00585"></a><span class="lineno"> 585</span>&#160; fmpz_poly_print_pretty(poly, <span class="stringliteral">&quot;x&quot;</span>);</div>
<div class="line"><a name="l00586"></a><span class="lineno"> 586</span>&#160; flint_printf(<span class="stringliteral">&quot;\n&quot;</span>);</div>
<div class="line"><a name="l00587"></a><span class="lineno"> 587</span>&#160;}</div>
<div class="line"><a name="l00588"></a><span class="lineno"> 588</span>&#160;</div>
<div class="line"><a name="l00589"></a><span class="lineno"> 589</span>&#160;<span class="comment">/*------------------------------------------------------------------------*/</span></div>
<div class="ttc" id="ntru__poly_8c_html_ace66beb516186e52f9b5b1ed8a397849"><div class="ttname"><a href="ntru__poly_8c.html#ace66beb516186e52f9b5b1ed8a397849">poly_inverse_poly_q</a></div><div class="ttdeci">bool poly_inverse_poly_q(const fmpz_poly_t a, fmpz_poly_t Fq, const ntru_params *params)</div><div class="ttdef"><b>Definition:</b> <a href="ntru__poly_8c_source.html#l00297">ntru_poly.c:297</a></div></div>
<div class="ttc" id="structntru__params_html_afb8425ee3db2b917b3c4e8d9b75bd3ff"><div class="ttname"><a href="structntru__params.html#afb8425ee3db2b917b3c4e8d9b75bd3ff">ntru_params::N</a></div><div class="ttdeci">uint32_t N</div><div class="ttdef"><b>Definition:</b> <a href="ntru__params_8h_source.html#l00048">ntru_params.h:48</a></div></div>
<div class="ttc" id="ntru__poly_8c_html_ae7d0d8364dba689df3fb4904610634cc"><div class="ttname"><a href="ntru__poly_8c.html#ae7d0d8364dba689df3fb4904610634cc">fmpz_poly_mod_unsigned</a></div><div class="ttdeci">void fmpz_poly_mod_unsigned(fmpz_poly_t a, const uint32_t mod)</div><div class="ttdef"><b>Definition:</b> <a href="ntru__poly_8c_source.html#l00166">ntru_poly.c:166</a></div></div>
<div class="ttc" id="ntru__poly_8c_html_a7c4f5e96355518dc97a23da8f34b661a"><div class="ttname"><a href="ntru__poly_8c.html#a7c4f5e96355518dc97a23da8f34b661a">fmpz_poly_mod</a></div><div class="ttdeci">void fmpz_poly_mod(fmpz_poly_t a, const uint32_t mod)</div><div class="ttdef"><b>Definition:</b> <a href="ntru__poly_8c_source.html#l00182">ntru_poly.c:182</a></div></div>
<div class="ttc" id="structntru__params_html_a41b368825e1eb126604e13e8f549ec8f"><div class="ttname"><a href="structntru__params.html#a41b368825e1eb126604e13e8f549ec8f">ntru_params::p</a></div><div class="ttdeci">uint32_t p</div><div class="ttdef"><b>Definition:</b> <a href="ntru__params_8h_source.html#l00056">ntru_params.h:56</a></div></div>
<div class="ttc" id="ntru__poly_8c_html_ae77b2014df42e5ed612206d5930ac608"><div class="ttname"><a href="ntru__poly_8c.html#ae77b2014df42e5ed612206d5930ac608">poly_inverse_poly_p</a></div><div class="ttdeci">bool poly_inverse_poly_p(const fmpz_poly_t a, fmpz_poly_t Fp, const ntru_params *params)</div><div class="ttdef"><b>Definition:</b> <a href="ntru__poly_8c_source.html#l00409">ntru_poly.c:409</a></div></div>
<div class="ttc" id="structntru__params_html"><div class="ttname"><a href="structntru__params.html">ntru_params</a></div><div class="ttdef"><b>Definition:</b> <a href="ntru__params_8h_source.html#l00043">ntru_params.h:43</a></div></div>
<div class="ttc" id="ntru__mem_8h_html"><div class="ttname"><a href="ntru__mem_8h.html">ntru_mem.h</a></div><div class="ttdoc">header for ntru_mem.c </div></div>
<div class="ttc" id="ntru__poly_8c_html_a59da1b7962829af8f18d58c05f588606"><div class="ttname"><a href="ntru__poly_8c.html#a59da1b7962829af8f18d58c05f588606">fmpz_invmod_ui</a></div><div class="ttdeci">int fmpz_invmod_ui(fmpz_t f, const fmpz_t g, const uint32_t mod)</div><div class="ttdef"><b>Definition:</b> <a href="ntru__poly_8c_source.html#l00210">ntru_poly.c:210</a></div></div>
<div class="ttc" id="ntru__poly_8c_html_a80a8ce0f2944bc3df94291ef2f781498"><div class="ttname"><a href="ntru__poly_8c.html#a80a8ce0f2944bc3df94291ef2f781498">poly_draw</a></div><div class="ttdeci">void poly_draw(const fmpz_poly_t poly)</div><div class="ttdef"><b>Definition:</b> <a href="ntru__poly_8c_source.html#l00574">ntru_poly.c:574</a></div></div>
<div class="ttc" id="ntru__params_8h_html"><div class="ttname"><a href="ntru__params_8h.html">ntru_params.h</a></div><div class="ttdoc">NTRU parameters. </div></div>
<div class="ttc" id="ntru__poly_8c_html_ab1f966fe680d1ce7c19c8c812d1932a7"><div class="ttname"><a href="ntru__poly_8c.html#ab1f966fe680d1ce7c19c8c812d1932a7">fmpz_poly_set_coeff_fmpz_n</a></div><div class="ttdeci">void fmpz_poly_set_coeff_fmpz_n(fmpz_poly_t poly, slong n, const fmpz_t x)</div><div class="ttdef"><b>Definition:</b> <a href="ntru__poly_8c_source.html#l00198">ntru_poly.c:198</a></div></div>
<div class="ttc" id="ntru__poly_8c_html_ae96f479ddd97af709a0ed50817fd3fb3"><div class="ttname"><a href="ntru__poly_8c.html#ae96f479ddd97af709a0ed50817fd3fb3">poly_starmultiply</a></div><div class="ttdeci">void poly_starmultiply(const fmpz_poly_t a, const fmpz_poly_t b, fmpz_poly_t c, const ntru_params *params, uint32_t modulus)</div><div class="ttdef"><b>Definition:</b> <a href="ntru__poly_8c_source.html#l00239">ntru_poly.c:239</a></div></div>
<div class="ttc" id="ntru__poly_8c_html_a27ff2116f70bcbf5028219adcae4c5f0"><div class="ttname"><a href="ntru__poly_8c.html#a27ff2116f70bcbf5028219adcae4c5f0">poly_delete</a></div><div class="ttdeci">void poly_delete(fmpz_poly_t poly)</div><div class="ttdef"><b>Definition:</b> <a href="ntru__poly_8c_source.html#l00123">ntru_poly.c:123</a></div></div>
<div class="ttc" id="ntru__poly_8c_html_a83297bc2ab5b6e7ce42553570dd8268f"><div class="ttname"><a href="ntru__poly_8c.html#a83297bc2ab5b6e7ce42553570dd8268f">poly_delete_all</a></div><div class="ttdeci">void poly_delete_all(fmpz_poly_t poly,...)</div><div class="ttdef"><b>Definition:</b> <a href="ntru__poly_8c_source.html#l00149">ntru_poly.c:149</a></div></div>
<div class="ttc" id="ntru__err_8h_html"><div class="ttname"><a href="ntru__err_8h.html">ntru_err.h</a></div><div class="ttdoc">error handling </div></div>
<div class="ttc" id="ntru__poly_8c_html_a20f86085d5eb5372fd25dc270069d38c"><div class="ttname"><a href="ntru__poly_8c.html#a20f86085d5eb5372fd25dc270069d38c">poly_new</a></div><div class="ttdeci">void poly_new(fmpz_poly_t new_poly, int const *const c, const size_t len)</div><div class="ttdef"><b>Definition:</b> <a href="ntru__poly_8c_source.html#l00110">ntru_poly.c:110</a></div></div>
<div class="ttc" id="ntru__poly_8c_html_a3f53c63383ff301b20dcede0783869a7"><div class="ttname"><a href="ntru__poly_8c.html#a3f53c63383ff301b20dcede0783869a7">poly_delete_array</a></div><div class="ttdeci">void poly_delete_array(fmpz_poly_t **poly_array)</div><div class="ttdef"><b>Definition:</b> <a href="ntru__poly_8c_source.html#l00131">ntru_poly.c:131</a></div></div>
<div class="ttc" id="ntru__poly_8c_html_ad2a11e832808ef1cfee0eed1cc02f4b9"><div class="ttname"><a href="ntru__poly_8c.html#ad2a11e832808ef1cfee0eed1cc02f4b9">fmpz_add_n</a></div><div class="ttdeci">void fmpz_add_n(fmpz_t f, const fmpz_t g, const fmpz_t h)</div><div class="ttdef"><b>Definition:</b> <a href="ntru__poly_8c_source.html#l00222">ntru_poly.c:222</a></div></div>
<div class="ttc" id="structntru__params_html_a29680750bda49dc93e61a752b2f2a0f7"><div class="ttname"><a href="structntru__params.html#a29680750bda49dc93e61a752b2f2a0f7">ntru_params::q</a></div><div class="ttdeci">uint32_t q</div><div class="ttdef"><b>Definition:</b> <a href="ntru__params_8h_source.html#l00052">ntru_params.h:52</a></div></div>
<div class="ttc" id="ntru__poly_8c_html_aaaac83ec72414aa208832442657c3520"><div class="ttname"><a href="ntru__poly_8c.html#aaaac83ec72414aa208832442657c3520">fmpz_cmp_si_n</a></div><div class="ttdeci">int fmpz_cmp_si_n(const fmpz_t f, slong g)</div><div class="ttdef"><b>Definition:</b> <a href="ntru__poly_8c_source.html#l00093">ntru_poly.c:93</a></div></div>
<div class="ttc" id="ntru__poly_8c_html_aec098d00160d2d502eb1f8a7c3fa5453"><div class="ttname"><a href="ntru__poly_8c.html#aec098d00160d2d502eb1f8a7c3fa5453">poly_draw_pretty</a></div><div class="ttdeci">void poly_draw_pretty(const fmpz_poly_t poly)</div><div class="ttdef"><b>Definition:</b> <a href="ntru__poly_8c_source.html#l00583">ntru_poly.c:583</a></div></div>
<div class="ttc" id="ntru__poly_8h_html"><div class="ttname"><a href="ntru__poly_8h.html">ntru_poly.h</a></div><div class="ttdoc">header for ntru_poly.c </div></div>
<div class="ttc" id="ntru__poly_8c_html_a891af13dc4355c9fab9ca3fafcac8054"><div class="ttname"><a href="ntru__poly_8c.html#a891af13dc4355c9fab9ca3fafcac8054">poly_mod2_to_modq</a></div><div class="ttdeci">static void poly_mod2_to_modq(const fmpz_poly_t a, fmpz_poly_t Fq, const ntru_params *params)</div><div class="ttdef"><b>Definition:</b> <a href="ntru__poly_8c_source.html#l00063">ntru_poly.c:63</a></div></div>
</div><!-- fragment --></div><!-- contents -->
<!-- start footer part -->
<hr class="footer"/><address class="footer"><small>
Generated on Sun Jun 8 2014 23:33:23 for post quantum cryptography by &#160;<a href="http://www.doxygen.org/index.html">
<img class="footer" src="doxygen.png" alt="doxygen"/>
</a> 1.8.7
</small></address>
</body>
</html>