mirror of
https://github.com/TheAlgorithms/C-Plus-Plus.git
synced 2026-03-22 12:52:48 +08:00
466 lines
34 KiB
HTML
466 lines
34 KiB
HTML
<!-- HTML header for doxygen 1.12.0-->
|
|
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
|
<html xmlns="http://www.w3.org/1999/xhtml" lang="en-US">
|
|
<head>
|
|
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
|
|
<meta http-equiv="X-UA-Compatible" content="IE=11"/>
|
|
<meta name="generator" content="Doxygen 1.14.0"/>
|
|
<meta name="viewport" content="width=device-width, initial-scale=1"/>
|
|
<title>TheAlgorithms/C++: math/miller_rabin.cpp File Reference</title>
|
|
<link rel="icon" href="../../favicon.svg" type="image/x-icon" />
|
|
<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>
|
|
<script type="text/javascript" src="https://cdn.jsdelivr.net/npm/@xpack-3rd-party/doxygen-awesome-css@2.2.0-1/doxygen-awesome-darkmode-toggle.js"></script>
|
|
<script type="text/javascript">
|
|
DoxygenAwesomeDarkModeToggle.init()
|
|
</script>
|
|
<script type="text/javascript" src="../../clipboard.js"></script>
|
|
<link href="../../navtree.css" rel="stylesheet" type="text/css"/>
|
|
<script type="text/javascript" src="../../navtreedata.js"></script>
|
|
<script type="text/javascript" src="../../navtree.js"></script>
|
|
<script type="text/javascript" src="../../cookie.js"></script>
|
|
<link href="../../search/search.css" rel="stylesheet" type="text/css"/>
|
|
<script type="text/javascript" src="../../search/searchdata.js"></script>
|
|
<script type="text/javascript" src="../../search/search.js"></script>
|
|
<script type="text/javascript">
|
|
window.MathJax = {
|
|
options: {
|
|
ignoreHtmlClass: 'tex2jax_ignore',
|
|
processHtmlClass: 'tex2jax_process'
|
|
},
|
|
loader: {
|
|
load: ['[tex]/ams']
|
|
},
|
|
tex: {
|
|
macros: {},
|
|
packages: ['base','configmacros','ams']
|
|
}
|
|
};
|
|
</script>
|
|
<script type="text/javascript" id="MathJax-script" async="async" src="https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-chtml.js"></script>
|
|
<link href="../../doxygen.css" rel="stylesheet" type="text/css" />
|
|
<link href="../../doxygen-awesome.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 id="projectrow">
|
|
<td id="projectlogo"><img alt="Logo" src="../../project_logo.png"/></td>
|
|
<td id="projectalign">
|
|
<div id="projectname">TheAlgorithms/C++<span id="projectnumber"> 1.0.0</span>
|
|
</div>
|
|
<div id="projectbrief">All the algorithms implemented in C++</div>
|
|
</td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
</div>
|
|
<!-- end header part -->
|
|
<!-- Generated by Doxygen 1.14.0 -->
|
|
<script type="text/javascript">
|
|
var searchBox = new SearchBox("searchBox", "../../search/",'.html');
|
|
</script>
|
|
<script type="text/javascript">
|
|
$(function() { codefold.init(); });
|
|
</script>
|
|
<script type="text/javascript" src="../../menudata.js"></script>
|
|
<script type="text/javascript" src="../../menu.js"></script>
|
|
<script type="text/javascript">
|
|
$(function() {
|
|
initMenu('../../',true,false,'search.php','Search',true);
|
|
$(function() { init_search(); });
|
|
});
|
|
</script>
|
|
<div id="main-nav"></div>
|
|
</div><!-- top -->
|
|
<div id="side-nav" class="ui-resizable side-nav-resizable">
|
|
<div id="nav-tree">
|
|
<div id="nav-tree-contents">
|
|
<div id="nav-sync" class="sync"></div>
|
|
</div>
|
|
</div>
|
|
<div id="splitbar" style="-moz-user-select:none;"
|
|
class="ui-resizable-handle">
|
|
</div>
|
|
</div>
|
|
<script type="text/javascript">
|
|
$(function(){initNavTree('d6/d42/miller__rabin_8cpp.html','../../',''); });
|
|
</script>
|
|
<div id="container">
|
|
<div id="doc-content">
|
|
<!-- window showing the filter options -->
|
|
<div id="MSearchSelectWindow"
|
|
onmouseover="return searchBox.OnSearchSelectShow()"
|
|
onmouseout="return searchBox.OnSearchSelectHide()"
|
|
onkeydown="return searchBox.OnSearchSelectKey(event)">
|
|
</div>
|
|
|
|
<!-- iframe showing the search results (closed by default) -->
|
|
<div id="MSearchResultsWindow">
|
|
<div id="MSearchResults">
|
|
<div class="SRPage">
|
|
<div id="SRIndex">
|
|
<div id="SRResults"></div>
|
|
<div class="SRStatus" id="Loading">Loading...</div>
|
|
<div class="SRStatus" id="Searching">Searching...</div>
|
|
<div class="SRStatus" id="NoMatches">No Matches</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="header">
|
|
<div class="headertitle"><div class="title">miller_rabin.cpp File Reference</div></div>
|
|
</div><!--header-->
|
|
<div class="contents">
|
|
<div class="textblock"><code>#include <cassert></code><br />
|
|
<code>#include <iostream></code><br />
|
|
<code>#include <random></code><br />
|
|
<code>#include <vector></code><br />
|
|
</div><div class="textblock"><div class="dynheader">
|
|
Include dependency graph for miller_rabin.cpp:</div>
|
|
<div class="dyncontent">
|
|
<div class="center"><iframe scrolling="no" loading="lazy" frameborder="0" src="../../d9/dcc/miller__rabin_8cpp__incl.svg" width="342" height="111"><p><b>This browser is not able to show SVG: try Firefox, Chrome, Safari, or Opera instead.</b></p></iframe></div>
|
|
</div>
|
|
</div>
|
|
<p><a href="../../d6/d42/miller__rabin_8cpp_source.html">Go to the source code of this file.</a></p>
|
|
<table class="memberdecls">
|
|
<tr class="heading"><td colspan="2"><h2 id="header-func-members" class="groupheader"><a id="func-members" name="func-members"></a>
|
|
Functions</h2></td></tr>
|
|
<tr class="memitem:a091662a787d5ad4866713021f580fddb" id="r_a091662a787d5ad4866713021f580fddb"><td class="memTemplParams" colspan="2">template<typename T> </td></tr>
|
|
<tr class="memitem:a091662a787d5ad4866713021f580fddb template"><td class="memItemLeft" align="right" valign="top">std::vector< T > </td><td class="memItemRight" valign="bottom"><a class="el" href="#a091662a787d5ad4866713021f580fddb">reverse_binary</a> (T num)</td></tr>
|
|
<tr class="memitem:ad6c2c67ea416d0e80003a88623f98b29" id="r_ad6c2c67ea416d0e80003a88623f98b29"><td class="memTemplParams" colspan="2">template<typename T> </td></tr>
|
|
<tr class="memitem:ad6c2c67ea416d0e80003a88623f98b29 template"><td class="memItemLeft" align="right" valign="top">T </td><td class="memItemRight" valign="bottom"><a class="el" href="#ad6c2c67ea416d0e80003a88623f98b29">modular_exponentiation</a> (T base, const std::vector< T > &rev_binary_exponent, T mod)</td></tr>
|
|
<tr class="memitem:a6f9c31c1047aa3191676d64571d4c506" id="r_a6f9c31c1047aa3191676d64571d4c506"><td class="memTemplParams" colspan="2">template<typename T> </td></tr>
|
|
<tr class="memitem:a6f9c31c1047aa3191676d64571d4c506 template"><td class="memItemLeft" align="right" valign="top">bool </td><td class="memItemRight" valign="bottom"><a class="el" href="#a6f9c31c1047aa3191676d64571d4c506">miller_test</a> (T d, T num)</td></tr>
|
|
<tr class="memitem:a901288288ef5ebe8e97414cc30797cce" id="r_a901288288ef5ebe8e97414cc30797cce"><td class="memTemplParams" colspan="2">template<typename T> </td></tr>
|
|
<tr class="memitem:a901288288ef5ebe8e97414cc30797cce template"><td class="memItemLeft" align="right" valign="top">bool </td><td class="memItemRight" valign="bottom"><a class="el" href="#a901288288ef5ebe8e97414cc30797cce">miller_rabin_primality_test</a> (T num, T repeats)</td></tr>
|
|
<tr class="memitem:a88ec9ad42717780d6caaff9d3d6977f9" id="r_a88ec9ad42717780d6caaff9d3d6977f9"><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="#a88ec9ad42717780d6caaff9d3d6977f9">tests</a> ()</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>
|
|
</table>
|
|
<a name="details" id="details"></a><h2 id="header-details" class="groupheader">Detailed Description</h2>
|
|
<div class="textblock"><p>Copyright 2020 </p><dl class="section author"><dt>Author</dt><dd>tjgurwara99</dd></dl>
|
|
<p>A basic implementation of Miller-Rabin primality test. </p>
|
|
|
|
<p class="definition">Definition in file <a class="el" href="../../d6/d42/miller__rabin_8cpp_source.html">miller_rabin.cpp</a>.</p>
|
|
</div><a name="doc-func-members" id="doc-func-members"></a><h2 id="header-doc-func-members" class="groupheader">Function Documentation</h2>
|
|
<a id="ae66f6b31b5ad750f1fe042a706a4e3d4" name="ae66f6b31b5ad750f1fe042a706a4e3d4"></a>
|
|
<h2 class="memtitle"><span class="permalink"><a href="#ae66f6b31b5ad750f1fe042a706a4e3d4">◆ </a></span>main()</h2>
|
|
|
|
<div class="memitem">
|
|
<div class="memproto">
|
|
<table class="memname">
|
|
<tr>
|
|
<td class="memname">int main </td>
|
|
<td>(</td>
|
|
<td class="paramtype">void</td> <td class="paramname"><span class="paramname"><em></em></span></td><td>)</td>
|
|
<td></td>
|
|
</tr>
|
|
</table>
|
|
</div><div class="memdoc">
|
|
<p>Main function </p>
|
|
|
|
<p class="definition">Definition at line <a class="el" href="../../d6/d42/miller__rabin_8cpp_source.html#l00183">183</a> of file <a class="el" href="../../d6/d42/miller__rabin_8cpp_source.html">miller_rabin.cpp</a>.</p>
|
|
<div class="fragment"><div class="line"><span class="lineno"> 183</span> {</div>
|
|
<div class="line"><span class="lineno"> 184</span> <a class="code hl_function" href="#a88ec9ad42717780d6caaff9d3d6977f9">tests</a>();</div>
|
|
<div class="line"><span class="lineno"> 185</span> <span class="keywordflow">return</span> 0;</div>
|
|
<div class="line"><span class="lineno"> 186</span>}</div>
|
|
<div class="ttc" id="amiller__rabin_8cpp_html_a88ec9ad42717780d6caaff9d3d6977f9"><div class="ttname"><a href="#a88ec9ad42717780d6caaff9d3d6977f9">tests</a></div><div class="ttdeci">void tests()</div><div class="ttdef"><b>Definition</b> <a href="../../d6/d42/miller__rabin_8cpp_source.html#l00157">miller_rabin.cpp:157</a></div></div>
|
|
</div><!-- fragment -->
|
|
</div>
|
|
</div>
|
|
<a id="a901288288ef5ebe8e97414cc30797cce" name="a901288288ef5ebe8e97414cc30797cce"></a>
|
|
<h2 class="memtitle"><span class="permalink"><a href="#a901288288ef5ebe8e97414cc30797cce">◆ </a></span>miller_rabin_primality_test()</h2>
|
|
|
|
<div class="memitem">
|
|
<div class="memproto">
|
|
<div class="memtemplate">
|
|
template<typename T> </div>
|
|
<table class="memname">
|
|
<tr>
|
|
<td class="memname">bool miller_rabin_primality_test </td>
|
|
<td>(</td>
|
|
<td class="paramtype">T</td> <td class="paramname"><span class="paramname"><em>num</em></span>, </td>
|
|
</tr>
|
|
<tr>
|
|
<td class="paramkey"></td>
|
|
<td></td>
|
|
<td class="paramtype">T</td> <td class="paramname"><span class="paramname"><em>repeats</em></span> )</td>
|
|
</tr>
|
|
</table>
|
|
</div><div class="memdoc">
|
|
<p>Function that test (probabilistically) whether a given number is a prime based on the Miller-Rabin Primality Test. </p><dl class="params"><dt>Parameters</dt><dd>
|
|
<table class="params">
|
|
<tr><td class="paramname">num</td><td>number to be tested for primality. </td></tr>
|
|
<tr><td class="paramname">repeats</td><td>number of repetitions for the test to increase probability of correct result. </td></tr>
|
|
</table>
|
|
</dd>
|
|
</dl>
|
|
<dl class="section return"><dt>Returns</dt><dd>'false' if num is composite </dd>
|
|
<dd>
|
|
'true' if num is (probably) prime</dd></dl>
|
|
<p>\detail First we check whether the num input is less than 4, if so we can determine whether this is a prime or composite by checking for 2 and 3. Next we check whether this num is odd (as all primes greater than 2 are odd). Next we write our num in the following format \(num = 2^r \cdot d + 1\). After finding r and d for our input num, we use for loop repeat number of times inside which we check the miller conditions using the function miller_test. If miller_test returns false then the number is composite After the loop finishes completely without issuing a false return call, we can conclude that this number is probably prime. </p>
|
|
|
|
<p class="definition">Definition at line <a class="el" href="../../d6/d42/miller__rabin_8cpp_source.html#l00125">125</a> of file <a class="el" href="../../d6/d42/miller__rabin_8cpp_source.html">miller_rabin.cpp</a>.</p>
|
|
<div class="fragment"><div class="line"><span class="lineno"> 125</span> {</div>
|
|
<div class="line"><span class="lineno"> 126</span> <span class="keywordflow">if</span> (num <= 4) {</div>
|
|
<div class="line"><span class="lineno"> 127</span> <span class="comment">// If num == 2 or num == 3 then prime</span></div>
|
|
<div class="line"><span class="lineno"> 128</span> <span class="keywordflow">if</span> (num == 2 || num == 3) {</div>
|
|
<div class="line"><span class="lineno"> 129</span> <span class="keywordflow">return</span> <span class="keyword">true</span>;</div>
|
|
<div class="line"><span class="lineno"> 130</span> } <span class="keywordflow">else</span> {</div>
|
|
<div class="line"><span class="lineno"> 131</span> <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
|
|
<div class="line"><span class="lineno"> 132</span> }</div>
|
|
<div class="line"><span class="lineno"> 133</span> }</div>
|
|
<div class="line"><span class="lineno"> 134</span> <span class="comment">// If num is even then not prime</span></div>
|
|
<div class="line"><span class="lineno"> 135</span> <span class="keywordflow">if</span> (num % 2 == 0) {</div>
|
|
<div class="line"><span class="lineno"> 136</span> <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
|
|
<div class="line"><span class="lineno"> 137</span> }</div>
|
|
<div class="line"><span class="lineno"> 138</span> <span class="comment">// Finding d and r in num = 2^r * d + 1</span></div>
|
|
<div class="line"><span class="lineno"> 139</span> T d = num - 1, r = 0;</div>
|
|
<div class="line"><span class="lineno"> 140</span> <span class="keywordflow">while</span> (d % 2 == 0) {</div>
|
|
<div class="line"><span class="lineno"> 141</span> d = d / 2;</div>
|
|
<div class="line"><span class="lineno"> 142</span> r++;</div>
|
|
<div class="line"><span class="lineno"> 143</span> }</div>
|
|
<div class="line"><span class="lineno"> 144</span> </div>
|
|
<div class="line"><span class="lineno"> 145</span> <span class="keywordflow">for</span> (T i = 0; i < repeats; ++i) {</div>
|
|
<div class="line"><span class="lineno"> 146</span> <span class="keywordflow">if</span> (!<a class="code hl_function" href="#a6f9c31c1047aa3191676d64571d4c506">miller_test</a>(d, num)) {</div>
|
|
<div class="line"><span class="lineno"> 147</span> <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
|
|
<div class="line"><span class="lineno"> 148</span> }</div>
|
|
<div class="line"><span class="lineno"> 149</span> }</div>
|
|
<div class="line"><span class="lineno"> 150</span> <span class="keywordflow">return</span> <span class="keyword">true</span>;</div>
|
|
<div class="line"><span class="lineno"> 151</span>}</div>
|
|
<div class="ttc" id="amiller__rabin_8cpp_html_a6f9c31c1047aa3191676d64571d4c506"><div class="ttname"><a href="#a6f9c31c1047aa3191676d64571d4c506">miller_test</a></div><div class="ttdeci">bool miller_test(T d, T num)</div><div class="ttdef"><b>Definition</b> <a href="../../d6/d42/miller__rabin_8cpp_source.html#l00073">miller_rabin.cpp:73</a></div></div>
|
|
</div><!-- fragment -->
|
|
</div>
|
|
</div>
|
|
<a id="a6f9c31c1047aa3191676d64571d4c506" name="a6f9c31c1047aa3191676d64571d4c506"></a>
|
|
<h2 class="memtitle"><span class="permalink"><a href="#a6f9c31c1047aa3191676d64571d4c506">◆ </a></span>miller_test()</h2>
|
|
|
|
<div class="memitem">
|
|
<div class="memproto">
|
|
<div class="memtemplate">
|
|
template<typename T> </div>
|
|
<table class="memname">
|
|
<tr>
|
|
<td class="memname">bool miller_test </td>
|
|
<td>(</td>
|
|
<td class="paramtype">T</td> <td class="paramname"><span class="paramname"><em>d</em></span>, </td>
|
|
</tr>
|
|
<tr>
|
|
<td class="paramkey"></td>
|
|
<td></td>
|
|
<td class="paramtype">T</td> <td class="paramname"><span class="paramname"><em>num</em></span> )</td>
|
|
</tr>
|
|
</table>
|
|
</div><div class="memdoc">
|
|
<p>Function for testing the conditions that are satisfied when a number is prime. </p><dl class="params"><dt>Parameters</dt><dd>
|
|
<table class="params">
|
|
<tr><td class="paramname">d</td><td>number such that \(d \cdot 2^r = n - 1\) where \(n = num\) parameter and \(r \geq 1\) </td></tr>
|
|
<tr><td class="paramname">num</td><td>number being tested for primality. </td></tr>
|
|
</table>
|
|
</dd>
|
|
</dl>
|
|
<dl class="section return"><dt>Returns</dt><dd>'false' if n is composite </dd>
|
|
<dd>
|
|
'true' if n is (probably) prime. </dd></dl>
|
|
|
|
<p class="definition">Definition at line <a class="el" href="../../d6/d42/miller__rabin_8cpp_source.html#l00073">73</a> of file <a class="el" href="../../d6/d42/miller__rabin_8cpp_source.html">miller_rabin.cpp</a>.</p>
|
|
<div class="fragment"><div class="line"><span class="lineno"> 73</span> {</div>
|
|
<div class="line"><span class="lineno"> 74</span> <span class="comment">// random number seed</span></div>
|
|
<div class="line"><span class="lineno"> 75</span> std::random_device rd_seed;</div>
|
|
<div class="line"><span class="lineno"> 76</span> <span class="comment">// random number generator</span></div>
|
|
<div class="line"><span class="lineno"> 77</span> std::mt19937 gen(rd_seed());</div>
|
|
<div class="line"><span class="lineno"> 78</span> <span class="comment">// Uniformly distributed range [2, num - 2] for random numbers</span></div>
|
|
<div class="line"><span class="lineno"> 79</span> std::uniform_int_distribution<> distribution(2, num - 2);</div>
|
|
<div class="line"><span class="lineno"> 80</span> <span class="comment">// Random number generated in the range [2, num -2].</span></div>
|
|
<div class="line"><span class="lineno"> 81</span> T random = distribution(gen);</div>
|
|
<div class="line"><span class="lineno"> 82</span> <span class="comment">// vector for reverse binary of the power</span></div>
|
|
<div class="line"><span class="lineno"> 83</span> std::vector<T> <a class="code hl_function" href="../../df/def/power__for__huge__numbers_8cpp.html#ae249a2af508aa94266023ce8aa81426f">power</a> = <a class="code hl_function" href="#a091662a787d5ad4866713021f580fddb">reverse_binary</a>(d);</div>
|
|
<div class="line"><span class="lineno"> 84</span> <span class="comment">// x = random ^ d % num</span></div>
|
|
<div class="line"><span class="lineno"> 85</span> T x = <a class="code hl_function" href="#ad6c2c67ea416d0e80003a88623f98b29">modular_exponentiation</a>(random, <a class="code hl_function" href="../../df/def/power__for__huge__numbers_8cpp.html#ae249a2af508aa94266023ce8aa81426f">power</a>, num);</div>
|
|
<div class="line"><span class="lineno"> 86</span> <span class="comment">// miller conditions</span></div>
|
|
<div class="line"><span class="lineno"> 87</span> <span class="keywordflow">if</span> (x == 1 || x == num - 1) {</div>
|
|
<div class="line"><span class="lineno"> 88</span> <span class="keywordflow">return</span> <span class="keyword">true</span>;</div>
|
|
<div class="line"><span class="lineno"> 89</span> }</div>
|
|
<div class="line"><span class="lineno"> 90</span> </div>
|
|
<div class="line"><span class="lineno"> 91</span> <span class="keywordflow">while</span> (d != num - 1) {</div>
|
|
<div class="line"><span class="lineno"> 92</span> x = (x * x) % num;</div>
|
|
<div class="line"><span class="lineno"> 93</span> d *= 2;</div>
|
|
<div class="line"><span class="lineno"> 94</span> <span class="keywordflow">if</span> (x == 1) {</div>
|
|
<div class="line"><span class="lineno"> 95</span> <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
|
|
<div class="line"><span class="lineno"> 96</span> }</div>
|
|
<div class="line"><span class="lineno"> 97</span> <span class="keywordflow">if</span> (x == num - 1) {</div>
|
|
<div class="line"><span class="lineno"> 98</span> <span class="keywordflow">return</span> <span class="keyword">true</span>;</div>
|
|
<div class="line"><span class="lineno"> 99</span> }</div>
|
|
<div class="line"><span class="lineno"> 100</span> }</div>
|
|
<div class="line"><span class="lineno"> 101</span> <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
|
|
<div class="line"><span class="lineno"> 102</span>}</div>
|
|
<div class="ttc" id="amiller__rabin_8cpp_html_a091662a787d5ad4866713021f580fddb"><div class="ttname"><a href="#a091662a787d5ad4866713021f580fddb">reverse_binary</a></div><div class="ttdeci">std::vector< T > reverse_binary(T num)</div><div class="ttdef"><b>Definition</b> <a href="../../d6/d42/miller__rabin_8cpp_source.html#l00019">miller_rabin.cpp:19</a></div></div>
|
|
<div class="ttc" id="amiller__rabin_8cpp_html_ad6c2c67ea416d0e80003a88623f98b29"><div class="ttname"><a href="#ad6c2c67ea416d0e80003a88623f98b29">modular_exponentiation</a></div><div class="ttdeci">T modular_exponentiation(T base, const std::vector< T > &rev_binary_exponent, T mod)</div><div class="ttdef"><b>Definition</b> <a href="../../d6/d42/miller__rabin_8cpp_source.html#l00043">miller_rabin.cpp:43</a></div></div>
|
|
<div class="ttc" id="apower__for__huge__numbers_8cpp_html_ae249a2af508aa94266023ce8aa81426f"><div class="ttname"><a href="../../df/def/power__for__huge__numbers_8cpp.html#ae249a2af508aa94266023ce8aa81426f">power</a></div><div class="ttdeci">void power(int x, int n)</div><div class="ttdef"><b>Definition</b> <a href="../../df/def/power__for__huge__numbers_8cpp_source.html#l00056">power_for_huge_numbers.cpp:56</a></div></div>
|
|
</div><!-- fragment -->
|
|
</div>
|
|
</div>
|
|
<a id="ad6c2c67ea416d0e80003a88623f98b29" name="ad6c2c67ea416d0e80003a88623f98b29"></a>
|
|
<h2 class="memtitle"><span class="permalink"><a href="#ad6c2c67ea416d0e80003a88623f98b29">◆ </a></span>modular_exponentiation()</h2>
|
|
|
|
<div class="memitem">
|
|
<div class="memproto">
|
|
<div class="memtemplate">
|
|
template<typename T> </div>
|
|
<table class="memname">
|
|
<tr>
|
|
<td class="memname">T modular_exponentiation </td>
|
|
<td>(</td>
|
|
<td class="paramtype">T</td> <td class="paramname"><span class="paramname"><em>base</em></span>, </td>
|
|
</tr>
|
|
<tr>
|
|
<td class="paramkey"></td>
|
|
<td></td>
|
|
<td class="paramtype">const std::vector< T > &</td> <td class="paramname"><span class="paramname"><em>rev_binary_exponent</em></span>, </td>
|
|
</tr>
|
|
<tr>
|
|
<td class="paramkey"></td>
|
|
<td></td>
|
|
<td class="paramtype">T</td> <td class="paramname"><span class="paramname"><em>mod</em></span> )</td>
|
|
</tr>
|
|
</table>
|
|
</div><div class="memdoc">
|
|
<p>Function for modular exponentiation. This function is an efficient modular exponentiation function. It can be used with any big integer library such as Boost multiprecision to give result any modular exponentiation problem relatively quickly. </p><dl class="params"><dt>Parameters</dt><dd>
|
|
<table class="params">
|
|
<tr><td class="paramname">base</td><td>number being raised to a power as integer </td></tr>
|
|
<tr><td class="paramname">rev_binary_exponent</td><td>reverse binary of the power the base is being raised to </td></tr>
|
|
<tr><td class="paramname">mod</td><td>modulo </td></tr>
|
|
</table>
|
|
</dd>
|
|
</dl>
|
|
<dl class="section return"><dt>Returns</dt><dd>r the modular exponentiation of \(a^{n} \equiv r \mod{m}\) where \(n\) is the base 10 representation of rev_binary_exponent and \(m = mod
|
|
\) parameter. </dd></dl>
|
|
|
|
<p class="definition">Definition at line <a class="el" href="../../d6/d42/miller__rabin_8cpp_source.html#l00043">43</a> of file <a class="el" href="../../d6/d42/miller__rabin_8cpp_source.html">miller_rabin.cpp</a>.</p>
|
|
<div class="fragment"><div class="line"><span class="lineno"> 44</span> {</div>
|
|
<div class="line"><span class="lineno"> 45</span> <span class="keywordflow">if</span> (mod == 1)</div>
|
|
<div class="line"><span class="lineno"> 46</span> <span class="keywordflow">return</span> 0;</div>
|
|
<div class="line"><span class="lineno"> 47</span> T b = 1;</div>
|
|
<div class="line"><span class="lineno"> 48</span> <span class="keywordflow">if</span> (rev_binary_exponent.size() == 0)</div>
|
|
<div class="line"><span class="lineno"> 49</span> <span class="keywordflow">return</span> b;</div>
|
|
<div class="line"><span class="lineno"> 50</span> T A = base;</div>
|
|
<div class="line"><span class="lineno"> 51</span> <span class="keywordflow">if</span> (rev_binary_exponent[0] == 1)</div>
|
|
<div class="line"><span class="lineno"> 52</span> b = base;</div>
|
|
<div class="line"><span class="lineno"> 53</span> </div>
|
|
<div class="line"><span class="lineno"> 54</span> <span class="keywordflow">for</span> (<span class="keyword">typename</span> std::vector<T>::const_iterator it =</div>
|
|
<div class="line"><span class="lineno"> 55</span> rev_binary_exponent.cbegin() + 1;</div>
|
|
<div class="line"><span class="lineno"> 56</span> it != rev_binary_exponent.cend(); ++it) {</div>
|
|
<div class="line"><span class="lineno"> 57</span> A = A * A % mod;</div>
|
|
<div class="line"><span class="lineno"> 58</span> <span class="keywordflow">if</span> (*it == 1)</div>
|
|
<div class="line"><span class="lineno"> 59</span> b = A * b % mod;</div>
|
|
<div class="line"><span class="lineno"> 60</span> }</div>
|
|
<div class="line"><span class="lineno"> 61</span> <span class="keywordflow">return</span> b;</div>
|
|
<div class="line"><span class="lineno"> 62</span>}</div>
|
|
</div><!-- fragment -->
|
|
</div>
|
|
</div>
|
|
<a id="a091662a787d5ad4866713021f580fddb" name="a091662a787d5ad4866713021f580fddb"></a>
|
|
<h2 class="memtitle"><span class="permalink"><a href="#a091662a787d5ad4866713021f580fddb">◆ </a></span>reverse_binary()</h2>
|
|
|
|
<div class="memitem">
|
|
<div class="memproto">
|
|
<div class="memtemplate">
|
|
template<typename T> </div>
|
|
<table class="memname">
|
|
<tr>
|
|
<td class="memname">std::vector< T > reverse_binary </td>
|
|
<td>(</td>
|
|
<td class="paramtype">T</td> <td class="paramname"><span class="paramname"><em>num</em></span></td><td>)</td>
|
|
<td></td>
|
|
</tr>
|
|
</table>
|
|
</div><div class="memdoc">
|
|
<p>Function to give a binary representation of a number in reverse order </p><dl class="params"><dt>Parameters</dt><dd>
|
|
<table class="params">
|
|
<tr><td class="paramname">num</td><td>integer number that we want to convert </td></tr>
|
|
</table>
|
|
</dd>
|
|
</dl>
|
|
<dl class="section return"><dt>Returns</dt><dd>result vector of the number input in reverse binary </dd></dl>
|
|
|
|
<p class="definition">Definition at line <a class="el" href="../../d6/d42/miller__rabin_8cpp_source.html#l00019">19</a> of file <a class="el" href="../../d6/d42/miller__rabin_8cpp_source.html">miller_rabin.cpp</a>.</p>
|
|
<div class="fragment"><div class="line"><span class="lineno"> 19</span> {</div>
|
|
<div class="line"><span class="lineno"> 20</span> std::vector<T> <a class="code hl_function" href="../../de/dc3/fibonacci__sum_8cpp.html#aadb40ac4c74a7efc0680b83eeee138aa">result</a>;</div>
|
|
<div class="line"><span class="lineno"> 21</span> T temp = num;</div>
|
|
<div class="line"><span class="lineno"> 22</span> <span class="keywordflow">while</span> (temp > 0) {</div>
|
|
<div class="line"><span class="lineno"> 23</span> <a class="code hl_function" href="../../de/dc3/fibonacci__sum_8cpp.html#aadb40ac4c74a7efc0680b83eeee138aa">result</a>.push_back(temp % 2);</div>
|
|
<div class="line"><span class="lineno"> 24</span> temp = temp / 2;</div>
|
|
<div class="line"><span class="lineno"> 25</span> }</div>
|
|
<div class="line"><span class="lineno"> 26</span> <span class="keywordflow">return</span> <a class="code hl_function" href="../../de/dc3/fibonacci__sum_8cpp.html#aadb40ac4c74a7efc0680b83eeee138aa">result</a>;</div>
|
|
<div class="line"><span class="lineno"> 27</span>}</div>
|
|
<div class="ttc" id="afibonacci__sum_8cpp_html_aadb40ac4c74a7efc0680b83eeee138aa"><div class="ttname"><a href="../../de/dc3/fibonacci__sum_8cpp.html#aadb40ac4c74a7efc0680b83eeee138aa">math::fibonacci_sum::result</a></div><div class="ttdeci">uint64_t result(uint64_t n)</div><div class="ttdef"><b>Definition</b> <a href="../../de/dc3/fibonacci__sum_8cpp_source.html#l00077">fibonacci_sum.cpp:77</a></div></div>
|
|
</div><!-- fragment -->
|
|
</div>
|
|
</div>
|
|
<a id="a88ec9ad42717780d6caaff9d3d6977f9" name="a88ec9ad42717780d6caaff9d3d6977f9"></a>
|
|
<h2 class="memtitle"><span class="permalink"><a href="#a88ec9ad42717780d6caaff9d3d6977f9">◆ </a></span>tests()</h2>
|
|
|
|
<div class="memitem">
|
|
<div class="memproto">
|
|
<table class="memname">
|
|
<tr>
|
|
<td class="memname">void tests </td>
|
|
<td>(</td>
|
|
<td class="paramname"><span class="paramname"><em></em></span></td><td>)</td>
|
|
<td></td>
|
|
</tr>
|
|
</table>
|
|
</div><div class="memdoc">
|
|
<p>Functions for testing the <a class="el" href="#a901288288ef5ebe8e97414cc30797cce">miller_rabin_primality_test()</a> function with some assert statements. </p>
|
|
|
|
<p class="definition">Definition at line <a class="el" href="../../d6/d42/miller__rabin_8cpp_source.html#l00157">157</a> of file <a class="el" href="../../d6/d42/miller__rabin_8cpp_source.html">miller_rabin.cpp</a>.</p>
|
|
<div class="fragment"><div class="line"><span class="lineno"> 157</span> {</div>
|
|
<div class="line"><span class="lineno"> 158</span> <span class="comment">// First test on 2</span></div>
|
|
<div class="line"><span class="lineno"> 159</span> assert(((<span class="keywordtype">void</span>)<span class="stringliteral">"2 is prime but function says otherwise.\n"</span>,</div>
|
|
<div class="line"><span class="lineno"> 160</span> <a class="code hl_function" href="#a901288288ef5ebe8e97414cc30797cce">miller_rabin_primality_test</a>(2, 1) == <span class="keyword">true</span>));</div>
|
|
<div class="line"><span class="lineno"> 161</span> std::cout << <span class="stringliteral">"First test passes."</span> << std::endl;</div>
|
|
<div class="line"><span class="lineno"> 162</span> <span class="comment">// Second test on 5</span></div>
|
|
<div class="line"><span class="lineno"> 163</span> assert(((<span class="keywordtype">void</span>)<span class="stringliteral">"5 should be prime but the function says otherwise.\n"</span>,</div>
|
|
<div class="line"><span class="lineno"> 164</span> <a class="code hl_function" href="#a901288288ef5ebe8e97414cc30797cce">miller_rabin_primality_test</a>(5, 3) == <span class="keyword">true</span>));</div>
|
|
<div class="line"><span class="lineno"> 165</span> std::cout << <span class="stringliteral">"Second test passes."</span> << std::endl;</div>
|
|
<div class="line"><span class="lineno"> 166</span> <span class="comment">// Third test on 23</span></div>
|
|
<div class="line"><span class="lineno"> 167</span> assert(((<span class="keywordtype">void</span>)<span class="stringliteral">"23 should be prime but the function says otherwise.\n"</span>,</div>
|
|
<div class="line"><span class="lineno"> 168</span> <a class="code hl_function" href="#a901288288ef5ebe8e97414cc30797cce">miller_rabin_primality_test</a>(23, 3) == <span class="keyword">true</span>));</div>
|
|
<div class="line"><span class="lineno"> 169</span> std::cout << <span class="stringliteral">"Third test passes."</span> << std::endl;</div>
|
|
<div class="line"><span class="lineno"> 170</span> <span class="comment">// Fourth test on 16</span></div>
|
|
<div class="line"><span class="lineno"> 171</span> assert(((<span class="keywordtype">void</span>)<span class="stringliteral">"16 is not a prime but the function says otherwise.\n"</span>,</div>
|
|
<div class="line"><span class="lineno"> 172</span> <a class="code hl_function" href="#a901288288ef5ebe8e97414cc30797cce">miller_rabin_primality_test</a>(16, 3) == <span class="keyword">false</span>));</div>
|
|
<div class="line"><span class="lineno"> 173</span> std::cout << <span class="stringliteral">"Fourth test passes."</span> << std::endl;</div>
|
|
<div class="line"><span class="lineno"> 174</span> <span class="comment">// Fifth test on 27</span></div>
|
|
<div class="line"><span class="lineno"> 175</span> assert(((<span class="keywordtype">void</span>)<span class="stringliteral">"27 is not a prime but the function says otherwise.\n"</span>,</div>
|
|
<div class="line"><span class="lineno"> 176</span> <a class="code hl_function" href="#a901288288ef5ebe8e97414cc30797cce">miller_rabin_primality_test</a>(27, 3) == <span class="keyword">false</span>));</div>
|
|
<div class="line"><span class="lineno"> 177</span> std::cout << <span class="stringliteral">"Fifth test passes."</span> << std::endl;</div>
|
|
<div class="line"><span class="lineno"> 178</span>}</div>
|
|
<div class="ttc" id="amiller__rabin_8cpp_html_a901288288ef5ebe8e97414cc30797cce"><div class="ttname"><a href="#a901288288ef5ebe8e97414cc30797cce">miller_rabin_primality_test</a></div><div class="ttdeci">bool miller_rabin_primality_test(T num, T repeats)</div><div class="ttdef"><b>Definition</b> <a href="../../d6/d42/miller__rabin_8cpp_source.html#l00125">miller_rabin.cpp:125</a></div></div>
|
|
</div><!-- fragment -->
|
|
</div>
|
|
</div>
|
|
</div><!-- contents -->
|
|
</div><!-- doc-content -->
|
|
<div id="page-nav" class="page-nav-panel">
|
|
<div id="page-nav-resize-handle"></div>
|
|
<div id="page-nav-tree">
|
|
<div id="page-nav-contents">
|
|
</div><!-- page-nav-contents -->
|
|
</div><!-- page-nav-tree -->
|
|
</div><!-- page-nav -->
|
|
</div><!-- container -->
|
|
<!-- start footer part -->
|
|
<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
|
|
<ul>
|
|
<li class="navelem"><a href="../../dir_296d53ceaeaa7e099814a6def439fe8a.html">math</a></li><li class="navelem"><a href="../../d6/d42/miller__rabin_8cpp.html">miller_rabin.cpp</a></li>
|
|
<li class="footer">Generated by <a href="https://www.doxygen.org/index.html"><img class="footer" src="../../doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.14.0 </li>
|
|
</ul>
|
|
</div>
|
|
</body>
|
|
</html>
|