mirror of
https://github.com/TheAlgorithms/C-Plus-Plus.git
synced 2026-03-25 14:23:03 +08:00
Documentation for af72fab013
This commit is contained in:
@@ -137,20 +137,130 @@ Namespaces</h2></td></tr>
|
||||
<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">namespace  </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d4/db9/namespacencr__modulo__p.html">ncr_modulo_p</a></td></tr>
|
||||
<tr class="memdesc:d4/db9/namespacencr__modulo__p"><td class="mdescLeft"> </td><td class="mdescRight">Functions for <a href="https://cp-algorithms.com/combinatorics/binomial-coefficients.html" target="_blank">nCr modulo p</a> implementation. <br /></td></tr>
|
||||
<tr class="separator:"><td class="memSeparator" colspan="2"> </td></tr>
|
||||
<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">namespace  </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d6/d84/namespaceutils.html">utils</a></td></tr>
|
||||
<tr class="memdesc:d6/d84/namespaceutils"><td class="mdescLeft"> </td><td class="mdescRight">this namespace contains the definitions of the functions called from the class <a class="el" href="../../d6/dc1/classmath_1_1ncr__modulo__p_1_1_n_c_r_modulo_p.html" title="Class which contains all methods required for calculating nCr mod p.">math::ncr_modulo_p::NCRModuloP</a> <br /></td></tr>
|
||||
<tr class="separator:"><td class="memSeparator" colspan="2"> </td></tr>
|
||||
</table><table class="memberdecls">
|
||||
<tr class="heading"><td colspan="2"><h2 class="groupheader"><a id="func-members" name="func-members"></a>
|
||||
Functions</h2></td></tr>
|
||||
<tr class="memitem:af0a3e6827f41c151e47451f5ff98b1f1" id="r_af0a3e6827f41c151e47451f5ff98b1f1"><td class="memItemLeft" align="right" valign="top">static void </td><td class="memItemRight" valign="bottom"><a class="el" href="#af0a3e6827f41c151e47451f5ff98b1f1">tests</a> (<a class="el" href="../../d6/dc1/classmath_1_1ncr__modulo__p_1_1_n_c_r_modulo_p.html">math::ncr_modulo_p::NCRModuloP</a> ncrObj)</td></tr>
|
||||
<tr class="memdesc:af0a3e6827f41c151e47451f5ff98b1f1"><td class="mdescLeft"> </td><td class="mdescRight">Test implementations. <br /></td></tr>
|
||||
<tr class="separator:af0a3e6827f41c151e47451f5ff98b1f1"><td class="memSeparator" colspan="2"> </td></tr>
|
||||
<tr class="memitem:a9010ad5669d31449c3bf3271ab5ebc86" id="r_a9010ad5669d31449c3bf3271ab5ebc86"><td class="memItemLeft" align="right" valign="top">int64_t </td><td class="memItemRight" valign="bottom"><a class="el" href="#a9010ad5669d31449c3bf3271ab5ebc86">math::ncr_modulo_p::utils::gcdExtended</a> (const int64_t &a, const int64_t &b, int64_t &x, int64_t &y)</td></tr>
|
||||
<tr class="memdesc:a9010ad5669d31449c3bf3271ab5ebc86"><td class="mdescLeft"> </td><td class="mdescRight">finds the values x and y such that a*x + b*y = gcd(a,b) <br /></td></tr>
|
||||
<tr class="separator:a9010ad5669d31449c3bf3271ab5ebc86"><td class="memSeparator" colspan="2"> </td></tr>
|
||||
<tr class="memitem:a6c7bfe3bdaa086d32261a5c5584d0fa9" id="r_a6c7bfe3bdaa086d32261a5c5584d0fa9"><td class="memItemLeft" align="right" valign="top">int64_t </td><td class="memItemRight" valign="bottom"><a class="el" href="#a6c7bfe3bdaa086d32261a5c5584d0fa9">math::ncr_modulo_p::utils::modInverse</a> (const int64_t &a, const int64_t &m)</td></tr>
|
||||
<tr class="separator:a6c7bfe3bdaa086d32261a5c5584d0fa9"><td class="memSeparator" colspan="2"> </td></tr>
|
||||
<tr class="memitem:a483bb8ccf42aaf7375a83e91490eda1e" id="r_a483bb8ccf42aaf7375a83e91490eda1e"><td class="memItemLeft" align="right" valign="top">static void </td><td class="memItemRight" valign="bottom"><a class="el" href="#a483bb8ccf42aaf7375a83e91490eda1e">tests</a> ()</td></tr>
|
||||
<tr class="memdesc:a483bb8ccf42aaf7375a83e91490eda1e"><td class="mdescLeft"> </td><td class="mdescRight">tests <a class="el" href="../../d6/dc1/classmath_1_1ncr__modulo__p_1_1_n_c_r_modulo_p.html" title="Class which contains all methods required for calculating nCr mod p.">math::ncr_modulo_p::NCRModuloP</a> <br /></td></tr>
|
||||
<tr class="separator:a483bb8ccf42aaf7375a83e91490eda1e"><td class="memSeparator" colspan="2"> </td></tr>
|
||||
<tr class="memitem:afa2b50f4716fc3b42221a72e676e1422" id="r_afa2b50f4716fc3b42221a72e676e1422"><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="#afa2b50f4716fc3b42221a72e676e1422">example</a> ()</td></tr>
|
||||
<tr class="memdesc:afa2b50f4716fc3b42221a72e676e1422"><td class="mdescLeft"> </td><td class="mdescRight">example showing the usage of the <a class="el" href="../../d6/dc1/classmath_1_1ncr__modulo__p_1_1_n_c_r_modulo_p.html" title="Class which contains all methods required for calculating nCr mod p.">math::ncr_modulo_p::NCRModuloP</a> class <br /></td></tr>
|
||||
<tr class="separator:afa2b50f4716fc3b42221a72e676e1422"><td class="memSeparator" colspan="2"> </td></tr>
|
||||
<tr class="memitem:ae66f6b31b5ad750f1fe042a706a4e3d4" id="r_ae66f6b31b5ad750f1fe042a706a4e3d4"><td class="memItemLeft" align="right" valign="top">int </td><td class="memItemRight" valign="bottom"><a class="el" href="#ae66f6b31b5ad750f1fe042a706a4e3d4">main</a> ()</td></tr>
|
||||
<tr class="memdesc:ae66f6b31b5ad750f1fe042a706a4e3d4"><td class="mdescLeft"> </td><td class="mdescRight">Main function. <br /></td></tr>
|
||||
<tr class="separator:ae66f6b31b5ad750f1fe042a706a4e3d4"><td class="memSeparator" colspan="2"> </td></tr>
|
||||
</table>
|
||||
<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
|
||||
<div class="textblock"><p>This program aims at calculating <a href="https://cp-algorithms.com/combinatorics/binomial-coefficients.html" target="_blank">nCr modulo p</a>. </p>
|
||||
<p>nCr is defined as n! / (r! * (n-r)!) where n! represents factorial of n. In many cases, the value of nCr is too large to fit in a 64 bit integer. Hence, in competitive programming, there are many problems or subproblems to compute nCr modulo p where p is a given number. </p><dl class="section author"><dt>Author</dt><dd><a href="https://github.com/KaustubhDamania" target="_blank">Kaustubh Damania</a> </dd></dl>
|
||||
</div><h2 class="groupheader">Function Documentation</h2>
|
||||
<a id="afa2b50f4716fc3b42221a72e676e1422" name="afa2b50f4716fc3b42221a72e676e1422"></a>
|
||||
<h2 class="memtitle"><span class="permalink"><a href="#afa2b50f4716fc3b42221a72e676e1422">◆ </a></span>example()</h2>
|
||||
|
||||
<div class="memitem">
|
||||
<div class="memproto">
|
||||
<table class="memname">
|
||||
<tr>
|
||||
<td class="memname">void example </td>
|
||||
<td>(</td>
|
||||
<td class="paramname"><span class="paramname"><em></em></span></td><td>)</td>
|
||||
<td></td>
|
||||
</tr>
|
||||
</table>
|
||||
</div><div class="memdoc">
|
||||
|
||||
<p>example showing the usage of the <a class="el" href="../../d6/dc1/classmath_1_1ncr__modulo__p_1_1_n_c_r_modulo_p.html" title="Class which contains all methods required for calculating nCr mod p.">math::ncr_modulo_p::NCRModuloP</a> class </p>
|
||||
<div class="fragment"><div class="line"><span class="lineno"> 175</span> {</div>
|
||||
<div class="line"><span class="lineno"> 176</span> <span class="keyword">const</span> int64_t size = 1e6 + 1;</div>
|
||||
<div class="line"><span class="lineno"> 177</span> <span class="keyword">const</span> int64_t p = 1e9 + 7;</div>
|
||||
<div class="line"><span class="lineno"> 178</span> </div>
|
||||
<div class="line"><span class="lineno"> 179</span> <span class="comment">// the ncrObj contains the precomputed values of factorials modulo p for</span></div>
|
||||
<div class="line"><span class="lineno"> 180</span> <span class="comment">// values from 0 to size</span></div>
|
||||
<div class="line"><span class="lineno"> 181</span> <span class="keyword">const</span> <span class="keyword">auto</span> ncrObj = <a class="code hl_class" href="../../d6/dc1/classmath_1_1ncr__modulo__p_1_1_n_c_r_modulo_p.html">math::ncr_modulo_p::NCRModuloP</a>(size, p);</div>
|
||||
<div class="line"><span class="lineno"> 182</span> </div>
|
||||
<div class="line"><span class="lineno"> 183</span> <span class="comment">// having the ncrObj we can efficiently query the values of (n C r)%p</span></div>
|
||||
<div class="line"><span class="lineno"> 184</span> <span class="comment">// note that time of the computation does not depend on size</span></div>
|
||||
<div class="line"><span class="lineno"> 185</span> <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 0; i <= 7; i++) {</div>
|
||||
<div class="line"><span class="lineno"> 186</span> <a class="code hl_classRef" target="_blank" href="http://en.cppreference.com/w/cpp/io/basic_ostream.html">std::cout</a> << 6 << <span class="stringliteral">"C"</span> << i << <span class="stringliteral">" mod "</span> << p << <span class="stringliteral">" = "</span> << ncrObj.ncr(6, i)</div>
|
||||
<div class="line"><span class="lineno"> 187</span> << <span class="stringliteral">"\n"</span>;</div>
|
||||
<div class="line"><span class="lineno"> 188</span> }</div>
|
||||
<div class="line"><span class="lineno"> 189</span>}</div>
|
||||
<div class="ttc" id="abasic_ostream_html"><div class="ttname"><a href="http://en.cppreference.com/w/cpp/io/basic_ostream.html">std::cout</a></div></div>
|
||||
<div class="ttc" id="aclassmath_1_1ncr__modulo__p_1_1_n_c_r_modulo_p_html"><div class="ttname"><a href="../../d6/dc1/classmath_1_1ncr__modulo__p_1_1_n_c_r_modulo_p.html">math::ncr_modulo_p::NCRModuloP</a></div><div class="ttdoc">Class which contains all methods required for calculating nCr mod p.</div><div class="ttdef"><b>Definition</b> ncr_modulo_p.cpp:79</div></div>
|
||||
</div><!-- fragment -->
|
||||
</div>
|
||||
</div>
|
||||
<a id="a9010ad5669d31449c3bf3271ab5ebc86" name="a9010ad5669d31449c3bf3271ab5ebc86"></a>
|
||||
<h2 class="memtitle"><span class="permalink"><a href="#a9010ad5669d31449c3bf3271ab5ebc86">◆ </a></span>gcdExtended()</h2>
|
||||
|
||||
<div class="memitem">
|
||||
<div class="memproto">
|
||||
<table class="memname">
|
||||
<tr>
|
||||
<td class="memname">int64_t math::ncr_modulo_p::utils::gcdExtended </td>
|
||||
<td>(</td>
|
||||
<td class="paramtype">const int64_t &</td> <td class="paramname"><span class="paramname"><em>a</em></span>, </td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="paramkey"></td>
|
||||
<td></td>
|
||||
<td class="paramtype">const int64_t &</td> <td class="paramname"><span class="paramname"><em>b</em></span>, </td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="paramkey"></td>
|
||||
<td></td>
|
||||
<td class="paramtype">int64_t &</td> <td class="paramname"><span class="paramname"><em>x</em></span>, </td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="paramkey"></td>
|
||||
<td></td>
|
||||
<td class="paramtype">int64_t &</td> <td class="paramname"><span class="paramname"><em>y</em></span> )</td>
|
||||
</tr>
|
||||
</table>
|
||||
</div><div class="memdoc">
|
||||
|
||||
<p>finds the values x and y such that a*x + b*y = gcd(a,b) </p>
|
||||
<dl class="params"><dt>Parameters</dt><dd>
|
||||
<table class="params">
|
||||
<tr><td class="paramdir">[in]</td><td class="paramname">a</td><td>the first input of the gcd </td></tr>
|
||||
<tr><td class="paramdir">[in]</td><td class="paramname">a</td><td>the second input of the gcd </td></tr>
|
||||
<tr><td class="paramdir">[out]</td><td class="paramname">x</td><td>the Bézout coefficient of a </td></tr>
|
||||
<tr><td class="paramdir">[out]</td><td class="paramname">y</td><td>the Bézout coefficient of b </td></tr>
|
||||
</table>
|
||||
</dd>
|
||||
</dl>
|
||||
<dl class="section return"><dt>Returns</dt><dd>the gcd of a and b </dd></dl>
|
||||
<div class="fragment"><div class="line"><span class="lineno"> 45</span> {</div>
|
||||
<div class="line"><span class="lineno"> 46</span> <span class="keywordflow">if</span> (a == 0) {</div>
|
||||
<div class="line"><span class="lineno"> 47</span> x = 0;</div>
|
||||
<div class="line"><span class="lineno"> 48</span> y = 1;</div>
|
||||
<div class="line"><span class="lineno"> 49</span> <span class="keywordflow">return</span> b;</div>
|
||||
<div class="line"><span class="lineno"> 50</span> }</div>
|
||||
<div class="line"><span class="lineno"> 51</span> </div>
|
||||
<div class="line"><span class="lineno"> 52</span> int64_t x1 = 0, y1 = 0;</div>
|
||||
<div class="line"><span class="lineno"> 53</span> <span class="keyword">const</span> int64_t <a class="code hl_function" href="../../d4/da0/gcd__iterative__euclidean_8cpp.html#ae48807fa2b7000afae599e67f327545e">gcd</a> = <a class="code hl_function" href="#a9010ad5669d31449c3bf3271ab5ebc86">gcdExtended</a>(b % a, a, x1, y1);</div>
|
||||
<div class="line"><span class="lineno"> 54</span> </div>
|
||||
<div class="line"><span class="lineno"> 55</span> x = y1 - (b / a) * x1;</div>
|
||||
<div class="line"><span class="lineno"> 56</span> y = x1;</div>
|
||||
<div class="line"><span class="lineno"> 57</span> <span class="keywordflow">return</span> <a class="code hl_function" href="../../d4/da0/gcd__iterative__euclidean_8cpp.html#ae48807fa2b7000afae599e67f327545e">gcd</a>;</div>
|
||||
<div class="line"><span class="lineno"> 58</span>}</div>
|
||||
<div class="ttc" id="agcd__iterative__euclidean_8cpp_html_ae48807fa2b7000afae599e67f327545e"><div class="ttname"><a href="../../d4/da0/gcd__iterative__euclidean_8cpp.html#ae48807fa2b7000afae599e67f327545e">gcd</a></div><div class="ttdeci">int gcd(int num1, int num2)</div><div class="ttdef"><b>Definition</b> gcd_iterative_euclidean.cpp:15</div></div>
|
||||
<div class="ttc" id="ancr__modulo__p_8cpp_html_a9010ad5669d31449c3bf3271ab5ebc86"><div class="ttname"><a href="#a9010ad5669d31449c3bf3271ab5ebc86">math::ncr_modulo_p::utils::gcdExtended</a></div><div class="ttdeci">int64_t gcdExtended(const int64_t &a, const int64_t &b, int64_t &x, int64_t &y)</div><div class="ttdoc">finds the values x and y such that a*x + b*y = gcd(a,b)</div><div class="ttdef"><b>Definition</b> ncr_modulo_p.cpp:44</div></div>
|
||||
</div><!-- fragment --><div class="dynheader">
|
||||
Here is the call graph for this function:</div>
|
||||
<div class="dyncontent">
|
||||
<div class="center"><iframe scrolling="no" frameborder="0" src="../../de/dab/ncr__modulo__p_8cpp_a9010ad5669d31449c3bf3271ab5ebc86_cgraph.svg" width="240" height="76"><p><b>This browser is not able to show SVG: try Firefox, Chrome, Safari, or Opera instead.</b></p></iframe></div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
<a id="ae66f6b31b5ad750f1fe042a706a4e3d4" name="ae66f6b31b5ad750f1fe042a706a4e3d4"></a>
|
||||
<h2 class="memtitle"><span class="permalink"><a href="#ae66f6b31b5ad750f1fe042a706a4e3d4">◆ </a></span>main()</h2>
|
||||
|
||||
@@ -165,37 +275,63 @@ Functions</h2></td></tr>
|
||||
</tr>
|
||||
</table>
|
||||
</div><div class="memdoc">
|
||||
<div class="fragment"><div class="line"><span class="lineno"> 191</span> {</div>
|
||||
<div class="line"><span class="lineno"> 192</span> <a class="code hl_function" href="#a483bb8ccf42aaf7375a83e91490eda1e">tests</a>();</div>
|
||||
<div class="line"><span class="lineno"> 193</span> <a class="code hl_function" href="#afa2b50f4716fc3b42221a72e676e1422">example</a>();</div>
|
||||
<div class="line"><span class="lineno"> 194</span> <span class="keywordflow">return</span> 0;</div>
|
||||
<div class="line"><span class="lineno"> 195</span>}</div>
|
||||
<div class="ttc" id="ancr__modulo__p_8cpp_html_a483bb8ccf42aaf7375a83e91490eda1e"><div class="ttname"><a href="#a483bb8ccf42aaf7375a83e91490eda1e">tests</a></div><div class="ttdeci">static void tests()</div><div class="ttdoc">tests math::ncr_modulo_p::NCRModuloP</div><div class="ttdef"><b>Definition</b> ncr_modulo_p.cpp:142</div></div>
|
||||
<div class="ttc" id="ancr__modulo__p_8cpp_html_afa2b50f4716fc3b42221a72e676e1422"><div class="ttname"><a href="#afa2b50f4716fc3b42221a72e676e1422">example</a></div><div class="ttdeci">void example()</div><div class="ttdoc">example showing the usage of the math::ncr_modulo_p::NCRModuloP class</div><div class="ttdef"><b>Definition</b> ncr_modulo_p.cpp:175</div></div>
|
||||
</div><!-- fragment -->
|
||||
</div>
|
||||
</div>
|
||||
<a id="a6c7bfe3bdaa086d32261a5c5584d0fa9" name="a6c7bfe3bdaa086d32261a5c5584d0fa9"></a>
|
||||
<h2 class="memtitle"><span class="permalink"><a href="#a6c7bfe3bdaa086d32261a5c5584d0fa9">◆ </a></span>modInverse()</h2>
|
||||
|
||||
<p>Main function. </p>
|
||||
<dl class="section return"><dt>Returns</dt><dd>0 on exit </dd></dl>
|
||||
<div class="fragment"><div class="line"><span class="lineno"> 137</span> {</div>
|
||||
<div class="line"><span class="lineno"> 138</span> <span class="comment">// populate the fac array</span></div>
|
||||
<div class="line"><span class="lineno"> 139</span> <span class="keyword">const</span> uint64_t size = 1e6 + 1;</div>
|
||||
<div class="line"><span class="lineno"> 140</span> <span class="keyword">const</span> uint64_t p = 1e9 + 7;</div>
|
||||
<div class="line"><span class="lineno"> 141</span> <a class="code hl_class" href="../../d6/dc1/classmath_1_1ncr__modulo__p_1_1_n_c_r_modulo_p.html">math::ncr_modulo_p::NCRModuloP</a> ncrObj =</div>
|
||||
<div class="line"><span class="lineno"> 142</span> <a class="code hl_class" href="../../d6/dc1/classmath_1_1ncr__modulo__p_1_1_n_c_r_modulo_p.html">math::ncr_modulo_p::NCRModuloP</a>(size, p);</div>
|
||||
<div class="line"><span class="lineno"> 143</span> <span class="comment">// test 6Ci for i=0 to 7</span></div>
|
||||
<div class="line"><span class="lineno"> 144</span> <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 0; i <= 7; i++) {</div>
|
||||
<div class="line"><span class="lineno"> 145</span> <a class="code hl_classRef" target="_blank" href="http://en.cppreference.com/w/cpp/io/basic_ostream.html">std::cout</a> << 6 << <span class="stringliteral">"C"</span> << i << <span class="stringliteral">" = "</span> << ncrObj.<a class="code hl_function" href="../../d6/dc1/classmath_1_1ncr__modulo__p_1_1_n_c_r_modulo_p.html#a6b95277f5f527beacc8d0f3bc91fcd08">ncr</a>(6, i, p) << <span class="stringliteral">"\n"</span>;</div>
|
||||
<div class="line"><span class="lineno"> 146</span> }</div>
|
||||
<div class="line"><span class="lineno"> 147</span> <a class="code hl_namespace" href="../../d9/df4/namespacetests.html">tests</a>(ncrObj); <span class="comment">// execute the tests</span></div>
|
||||
<div class="line"><span class="lineno"> 148</span> <a class="code hl_classRef" target="_blank" href="http://en.cppreference.com/w/cpp/io/basic_ostream.html">std::cout</a> << <span class="stringliteral">"Assertions passed\n"</span>;</div>
|
||||
<div class="line"><span class="lineno"> 149</span> <span class="keywordflow">return</span> 0;</div>
|
||||
<div class="line"><span class="lineno"> 150</span>}</div>
|
||||
<div class="ttc" id="abasic_ostream_html"><div class="ttname"><a href="http://en.cppreference.com/w/cpp/io/basic_ostream.html">std::cout</a></div></div>
|
||||
<div class="ttc" id="aclassmath_1_1ncr__modulo__p_1_1_n_c_r_modulo_p_html"><div class="ttname"><a href="../../d6/dc1/classmath_1_1ncr__modulo__p_1_1_n_c_r_modulo_p.html">math::ncr_modulo_p::NCRModuloP</a></div><div class="ttdoc">Class which contains all methods required for calculating nCr mod p.</div><div class="ttdef"><b>Definition</b> ncr_modulo_p.cpp:31</div></div>
|
||||
<div class="ttc" id="aclassmath_1_1ncr__modulo__p_1_1_n_c_r_modulo_p_html_a6b95277f5f527beacc8d0f3bc91fcd08"><div class="ttname"><a href="../../d6/dc1/classmath_1_1ncr__modulo__p_1_1_n_c_r_modulo_p.html#a6b95277f5f527beacc8d0f3bc91fcd08">math::ncr_modulo_p::NCRModuloP::ncr</a></div><div class="ttdeci">int64_t ncr(const uint64_t &n, const uint64_t &r, const uint64_t &p)</div><div class="ttdef"><b>Definition</b> ncr_modulo_p.cpp:92</div></div>
|
||||
<div class="ttc" id="anamespacetests_html"><div class="ttname"><a href="../../d9/df4/namespacetests.html">tests</a></div><div class="ttdoc">Testcases to check Union of Two Arrays.</div></div>
|
||||
<div class="memitem">
|
||||
<div class="memproto">
|
||||
<table class="memname">
|
||||
<tr>
|
||||
<td class="memname">int64_t math::ncr_modulo_p::utils::modInverse </td>
|
||||
<td>(</td>
|
||||
<td class="paramtype">const int64_t &</td> <td class="paramname"><span class="paramname"><em>a</em></span>, </td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="paramkey"></td>
|
||||
<td></td>
|
||||
<td class="paramtype">const int64_t &</td> <td class="paramname"><span class="paramname"><em>m</em></span> )</td>
|
||||
</tr>
|
||||
</table>
|
||||
</div><div class="memdoc">
|
||||
<p>Find modular inverse of a modulo m i.e. a number x such that (a*x)m = 1</p>
|
||||
<dl class="params"><dt>Parameters</dt><dd>
|
||||
<table class="params">
|
||||
<tr><td class="paramdir">[in]</td><td class="paramname">a</td><td>the number for which the modular inverse is queried </td></tr>
|
||||
<tr><td class="paramdir">[in]</td><td class="paramname">m</td><td>the modulus </td></tr>
|
||||
</table>
|
||||
</dd>
|
||||
</dl>
|
||||
<dl class="section return"><dt>Returns</dt><dd>the inverce of a modulo m, if it exists, -1 otherwise </dd></dl>
|
||||
<div class="fragment"><div class="line"><span class="lineno"> 66</span> {</div>
|
||||
<div class="line"><span class="lineno"> 67</span> int64_t x = 0, y = 0;</div>
|
||||
<div class="line"><span class="lineno"> 68</span> <span class="keyword">const</span> int64_t <a class="code hl_function" href="../../d4/d18/composite__simpson__rule_8cpp.html#a2f67508d5f392b0321772169342c98ad">g</a> = <a class="code hl_function" href="#a9010ad5669d31449c3bf3271ab5ebc86">gcdExtended</a>(a, m, x, y);</div>
|
||||
<div class="line"><span class="lineno"> 69</span> <span class="keywordflow">if</span> (g != 1) { <span class="comment">// modular inverse doesn't exist</span></div>
|
||||
<div class="line"><span class="lineno"> 70</span> <span class="keywordflow">return</span> -1;</div>
|
||||
<div class="line"><span class="lineno"> 71</span> } <span class="keywordflow">else</span> {</div>
|
||||
<div class="line"><span class="lineno"> 72</span> <span class="keywordflow">return</span> ((x + m) % m);</div>
|
||||
<div class="line"><span class="lineno"> 73</span> }</div>
|
||||
<div class="line"><span class="lineno"> 74</span>}</div>
|
||||
<div class="ttc" id="acomposite__simpson__rule_8cpp_html_a2f67508d5f392b0321772169342c98ad"><div class="ttname"><a href="../../d4/d18/composite__simpson__rule_8cpp.html#a2f67508d5f392b0321772169342c98ad">numerical_methods::simpson_method::g</a></div><div class="ttdeci">double g(double x)</div><div class="ttdoc">Another test function.</div><div class="ttdef"><b>Definition</b> composite_simpson_rule.cpp:115</div></div>
|
||||
</div><!-- fragment --><div class="dynheader">
|
||||
Here is the call graph for this function:</div>
|
||||
<div class="dyncontent">
|
||||
<div class="center"><div class="zoom"><iframe scrolling="no" frameborder="0" src="../../de/dab/ncr__modulo__p_8cpp_ae66f6b31b5ad750f1fe042a706a4e3d4_cgraph.svg" width="100%" height="300"><p><b>This browser is not able to show SVG: try Firefox, Chrome, Safari, or Opera instead.</b></p></iframe></div></div>
|
||||
<div class="center"><iframe scrolling="no" frameborder="0" src="../../de/dab/ncr__modulo__p_8cpp_a6c7bfe3bdaa086d32261a5c5584d0fa9_cgraph.svg" width="428" height="76"><p><b>This browser is not able to show SVG: try Firefox, Chrome, Safari, or Opera instead.</b></p></iframe></div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
<a id="af0a3e6827f41c151e47451f5ff98b1f1" name="af0a3e6827f41c151e47451f5ff98b1f1"></a>
|
||||
<h2 class="memtitle"><span class="permalink"><a href="#af0a3e6827f41c151e47451f5ff98b1f1">◆ </a></span>tests()</h2>
|
||||
<a id="a483bb8ccf42aaf7375a83e91490eda1e" name="a483bb8ccf42aaf7375a83e91490eda1e"></a>
|
||||
<h2 class="memtitle"><span class="permalink"><a href="#a483bb8ccf42aaf7375a83e91490eda1e">◆ </a></span>tests()</h2>
|
||||
|
||||
<div class="memitem">
|
||||
<div class="memproto">
|
||||
@@ -206,7 +342,7 @@ Here is the call graph for this function:</div>
|
||||
<tr>
|
||||
<td class="memname">static void tests </td>
|
||||
<td>(</td>
|
||||
<td class="paramtype"><a class="el" href="../../d6/dc1/classmath_1_1ncr__modulo__p_1_1_n_c_r_modulo_p.html">math::ncr_modulo_p::NCRModuloP</a></td> <td class="paramname"><span class="paramname"><em>ncrObj</em></span></td><td>)</td>
|
||||
<td class="paramname"><span class="paramname"><em></em></span></td><td>)</td>
|
||||
<td></td>
|
||||
</tr>
|
||||
</table>
|
||||
@@ -217,26 +353,43 @@ Here is the call graph for this function:</div>
|
||||
</table>
|
||||
</div><div class="memdoc">
|
||||
|
||||
<p>Test implementations. </p>
|
||||
<dl class="params"><dt>Parameters</dt><dd>
|
||||
<table class="params">
|
||||
<tr><td class="paramname">ncrObj</td><td>object which contains the precomputed factorial values and ncr function </td></tr>
|
||||
</table>
|
||||
</dd>
|
||||
</dl>
|
||||
<dl class="section return"><dt>Returns</dt><dd>void </dd></dl>
|
||||
<div class="fragment"><div class="line"><span class="lineno"> 124</span> {</div>
|
||||
<div class="line"><span class="lineno"> 125</span> <span class="comment">// (52323 C 26161) % (1e9 + 7) = 224944353</span></div>
|
||||
<div class="line"><span class="lineno"> 126</span> assert(ncrObj.<a class="code hl_function" href="../../d6/dc1/classmath_1_1ncr__modulo__p_1_1_n_c_r_modulo_p.html#a6b95277f5f527beacc8d0f3bc91fcd08">ncr</a>(52323, 26161, 1000000007) == 224944353);</div>
|
||||
<div class="line"><span class="lineno"> 127</span> <span class="comment">// 6 C 2 = 30, 30%5 = 0</span></div>
|
||||
<div class="line"><span class="lineno"> 128</span> assert(ncrObj.<a class="code hl_function" href="../../d6/dc1/classmath_1_1ncr__modulo__p_1_1_n_c_r_modulo_p.html#a6b95277f5f527beacc8d0f3bc91fcd08">ncr</a>(6, 2, 5) == 0);</div>
|
||||
<div class="line"><span class="lineno"> 129</span> <span class="comment">// 7C3 = 35, 35 % 29 = 8</span></div>
|
||||
<div class="line"><span class="lineno"> 130</span> assert(ncrObj.<a class="code hl_function" href="../../d6/dc1/classmath_1_1ncr__modulo__p_1_1_n_c_r_modulo_p.html#a6b95277f5f527beacc8d0f3bc91fcd08">ncr</a>(7, 3, 29) == 6);</div>
|
||||
<div class="line"><span class="lineno"> 131</span>}</div>
|
||||
<p>tests <a class="el" href="../../d6/dc1/classmath_1_1ncr__modulo__p_1_1_n_c_r_modulo_p.html" title="Class which contains all methods required for calculating nCr mod p.">math::ncr_modulo_p::NCRModuloP</a> </p>
|
||||
<div class="fragment"><div class="line"><span class="lineno"> 142</span> {</div>
|
||||
<div class="line"><span class="lineno"> 143</span> <span class="keyword">struct </span><a class="code hl_struct" href="../../da/d86/struct_test_case.html">TestCase</a> {</div>
|
||||
<div class="line"><span class="lineno"> 144</span> <span class="keyword">const</span> int64_t size;</div>
|
||||
<div class="line"><span class="lineno"> 145</span> <span class="keyword">const</span> int64_t p;</div>
|
||||
<div class="line"><span class="lineno"> 146</span> <span class="keyword">const</span> int64_t n;</div>
|
||||
<div class="line"><span class="lineno"> 147</span> <span class="keyword">const</span> int64_t r;</div>
|
||||
<div class="line"><span class="lineno"> 148</span> <span class="keyword">const</span> int64_t expected;</div>
|
||||
<div class="line"><span class="lineno"> 149</span> </div>
|
||||
<div class="line"><span class="lineno"> 150</span> <a class="code hl_struct" href="../../da/d86/struct_test_case.html">TestCase</a>(<span class="keyword">const</span> int64_t size, <span class="keyword">const</span> int64_t p, <span class="keyword">const</span> int64_t n,</div>
|
||||
<div class="line"><span class="lineno"> 151</span> <span class="keyword">const</span> int64_t r, <span class="keyword">const</span> int64_t expected)</div>
|
||||
<div class="line"><span class="lineno"> 152</span> : size(size), p(p), n(n), r(r), expected(expected) {}</div>
|
||||
<div class="line"><span class="lineno"> 153</span> };</div>
|
||||
<div class="line"><span class="lineno"> 154</span> <span class="keyword">const</span> <a class="code hl_classRef" target="_blank" href="http://en.cppreference.com/w/cpp/container/vector.html">std::vector<TestCase></a> test_cases = {</div>
|
||||
<div class="line"><span class="lineno"> 155</span> <a class="code hl_struct" href="../../da/d86/struct_test_case.html">TestCase</a>(60000, 1000000007, 52323, 26161, 224944353),</div>
|
||||
<div class="line"><span class="lineno"> 156</span> <a class="code hl_struct" href="../../da/d86/struct_test_case.html">TestCase</a>(20, 5, 6, 2, 30 % 5),</div>
|
||||
<div class="line"><span class="lineno"> 157</span> <a class="code hl_struct" href="../../da/d86/struct_test_case.html">TestCase</a>(100, 29, 7, 3, 35 % 29),</div>
|
||||
<div class="line"><span class="lineno"> 158</span> <a class="code hl_struct" href="../../da/d86/struct_test_case.html">TestCase</a>(1000, 13, 10, 3, 120 % 13),</div>
|
||||
<div class="line"><span class="lineno"> 159</span> <a class="code hl_struct" href="../../da/d86/struct_test_case.html">TestCase</a>(20, 17, 1, 10, 0),</div>
|
||||
<div class="line"><span class="lineno"> 160</span> <a class="code hl_struct" href="../../da/d86/struct_test_case.html">TestCase</a>(45, 19, 23, 1, 23 % 19),</div>
|
||||
<div class="line"><span class="lineno"> 161</span> <a class="code hl_struct" href="../../da/d86/struct_test_case.html">TestCase</a>(45, 19, 23, 0, 1),</div>
|
||||
<div class="line"><span class="lineno"> 162</span> <a class="code hl_struct" href="../../da/d86/struct_test_case.html">TestCase</a>(45, 19, 23, 23, 1),</div>
|
||||
<div class="line"><span class="lineno"> 163</span> <a class="code hl_struct" href="../../da/d86/struct_test_case.html">TestCase</a>(20, 9, 10, 2, -1)};</div>
|
||||
<div class="line"><span class="lineno"> 164</span> <span class="keywordflow">for</span> (<span class="keyword">const</span> <span class="keyword">auto</span>& tc : test_cases) {</div>
|
||||
<div class="line"><span class="lineno"> 165</span> assert(<a class="code hl_class" href="../../d6/dc1/classmath_1_1ncr__modulo__p_1_1_n_c_r_modulo_p.html">math::ncr_modulo_p::NCRModuloP</a>(tc.size, tc.p).<a class="code hl_function" href="../../d6/dc1/classmath_1_1ncr__modulo__p_1_1_n_c_r_modulo_p.html#a499df7a01bcd348345dc5a0ab79bb0e9">ncr</a>(tc.n, tc.r) ==</div>
|
||||
<div class="line"><span class="lineno"> 166</span> tc.expected);</div>
|
||||
<div class="line"><span class="lineno"> 167</span> }</div>
|
||||
<div class="line"><span class="lineno"> 168</span> </div>
|
||||
<div class="line"><span class="lineno"> 169</span> <a class="code hl_classRef" target="_blank" href="http://en.cppreference.com/w/cpp/io/basic_ostream.html">std::cout</a> << <span class="stringliteral">"\n\nAll tests have successfully passed!\n"</span>;</div>
|
||||
<div class="line"><span class="lineno"> 170</span>}</div>
|
||||
<div class="ttc" id="aclassmath_1_1ncr__modulo__p_1_1_n_c_r_modulo_p_html_a499df7a01bcd348345dc5a0ab79bb0e9"><div class="ttname"><a href="../../d6/dc1/classmath_1_1ncr__modulo__p_1_1_n_c_r_modulo_p.html#a499df7a01bcd348345dc5a0ab79bb0e9">math::ncr_modulo_p::NCRModuloP::ncr</a></div><div class="ttdeci">int64_t ncr(const int64_t &n, const int64_t &r) const</div><div class="ttdoc">computes nCr % p</div><div class="ttdef"><b>Definition</b> ncr_modulo_p.cpp:116</div></div>
|
||||
<div class="ttc" id="astruct_test_case_html"><div class="ttname"><a href="../../da/d86/struct_test_case.html">TestCase</a></div><div class="ttdoc">represents single example inputs and expected output of the function longest_common_string_length</div><div class="ttdef"><b>Definition</b> longest_common_string.cpp:54</div></div>
|
||||
<div class="ttc" id="avector_html"><div class="ttname"><a href="http://en.cppreference.com/w/cpp/container/vector.html">std::vector</a></div></div>
|
||||
</div><!-- fragment --><div class="dynheader">
|
||||
Here is the call graph for this function:</div>
|
||||
<div class="dyncontent">
|
||||
<div class="center"><div class="zoom"><iframe scrolling="no" frameborder="0" src="../../de/dab/ncr__modulo__p_8cpp_af0a3e6827f41c151e47451f5ff98b1f1_cgraph.svg" width="100%" height="300"><p><b>This browser is not able to show SVG: try Firefox, Chrome, Safari, or Opera instead.</b></p></iframe></div></div>
|
||||
<div class="center"><iframe scrolling="no" frameborder="0" src="../../de/dab/ncr__modulo__p_8cpp_a483bb8ccf42aaf7375a83e91490eda1e_cgraph.svg" width="248" height="52"><p><b>This browser is not able to show SVG: try Firefox, Chrome, Safari, or Opera instead.</b></p></iframe></div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
Reference in New Issue
Block a user