3060 lines
162 KiB
HTML
3060 lines
162 KiB
HTML
<!DOCTYPE html>
|
||
<html class="writer-html5" lang="en" >
|
||
<head>
|
||
<meta charset="utf-8" />
|
||
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
|
||
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
||
<link rel="shortcut icon" href="../img/favicon.ico" />
|
||
<title>Group theory - CryptoTools documentation</title>
|
||
<link rel="stylesheet" href="../css/theme.css" />
|
||
<link rel="stylesheet" href="../css/theme_extra.css" />
|
||
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.8.0/styles/github.min.css" />
|
||
<link href="../assets/_mkdocstrings.css" rel="stylesheet" />
|
||
|
||
<script>
|
||
// Current page data
|
||
var mkdocs_page_name = "Group theory";
|
||
var mkdocs_page_input_path = "group-theory.md";
|
||
var mkdocs_page_url = null;
|
||
</script>
|
||
|
||
<!--[if lt IE 9]>
|
||
<script src="../js/html5shiv.min.js"></script>
|
||
<![endif]-->
|
||
<script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.8.0/highlight.min.js"></script>
|
||
<script>hljs.highlightAll();</script>
|
||
</head>
|
||
|
||
<body class="wy-body-for-nav" role="document">
|
||
|
||
<div class="wy-grid-for-nav">
|
||
<nav data-toggle="wy-nav-shift" class="wy-nav-side stickynav">
|
||
<div class="wy-side-scroll">
|
||
<div class="wy-side-nav-search">
|
||
<a href=".." class="icon icon-home"> CryptoTools documentation
|
||
</a>
|
||
</div>
|
||
|
||
<div class="wy-menu wy-menu-vertical" data-spy="affix" role="navigation" aria-label="Navigation menu">
|
||
<ul>
|
||
<li class="toctree-l1"><a class="reference internal" href="../introduction/">Introduction</a>
|
||
</li>
|
||
</ul>
|
||
<ul>
|
||
<li class="toctree-l1"><a class="reference internal" href="../installation/">Installation</a>
|
||
</li>
|
||
</ul>
|
||
<p class="caption"><span class="caption-text">Low-level cryptographic</span></p>
|
||
<ul class="current">
|
||
<li class="toctree-l1"><a class="reference internal" href="../number-theory/">Number theory</a>
|
||
</li>
|
||
<li class="toctree-l1 current"><a class="reference internal current" href="#">Group theory</a>
|
||
<ul class="current">
|
||
<li class="toctree-l2"><a class="reference internal" href="#group">Group</a>
|
||
</li>
|
||
<li class="toctree-l2"><a class="reference internal" href="#Cryptotools.Groups.group">group</a>
|
||
</li>
|
||
<li class="toctree-l2"><a class="reference internal" href="#Cryptotools.Groups.group.Group">Group</a>
|
||
<ul>
|
||
<li class="toctree-l3"><a class="reference internal" href="#Cryptotools.Groups.group.Group.associative">associative</a>
|
||
</li>
|
||
<li class="toctree-l3"><a class="reference internal" href="#Cryptotools.Groups.group.Group.closure">closure</a>
|
||
</li>
|
||
<li class="toctree-l3"><a class="reference internal" href="#Cryptotools.Groups.group.Group.getG">getG</a>
|
||
</li>
|
||
<li class="toctree-l3"><a class="reference internal" href="#Cryptotools.Groups.group.Group.getIdentity">getIdentity</a>
|
||
</li>
|
||
<li class="toctree-l3"><a class="reference internal" href="#Cryptotools.Groups.group.Group.getReverses">getReverses</a>
|
||
</li>
|
||
<li class="toctree-l3"><a class="reference internal" href="#Cryptotools.Groups.group.Group.identity">identity</a>
|
||
</li>
|
||
<li class="toctree-l3"><a class="reference internal" href="#Cryptotools.Groups.group.Group.reverse">reverse</a>
|
||
</li>
|
||
</ul>
|
||
</li>
|
||
<li class="toctree-l2"><a class="reference internal" href="#cyclic-group">Cyclic group</a>
|
||
</li>
|
||
<li class="toctree-l2"><a class="reference internal" href="#Cryptotools.Groups.cyclic">cyclic</a>
|
||
</li>
|
||
<li class="toctree-l2"><a class="reference internal" href="#Cryptotools.Groups.cyclic.Cyclic">Cyclic</a>
|
||
<ul>
|
||
<li class="toctree-l3"><a class="reference internal" href="#Cryptotools.Groups.cyclic.Cyclic.generator">generator</a>
|
||
</li>
|
||
<li class="toctree-l3"><a class="reference internal" href="#Cryptotools.Groups.cyclic.Cyclic.getGenerators">getGenerators</a>
|
||
</li>
|
||
<li class="toctree-l3"><a class="reference internal" href="#Cryptotools.Groups.cyclic.Cyclic.getPrimitiveRoot">getPrimitiveRoot</a>
|
||
</li>
|
||
<li class="toctree-l3"><a class="reference internal" href="#Cryptotools.Groups.cyclic.Cyclic.isCyclic">isCyclic</a>
|
||
</li>
|
||
</ul>
|
||
</li>
|
||
<li class="toctree-l2"><a class="reference internal" href="#galois-field-finite-field">Galois Field (Finite Field)</a>
|
||
</li>
|
||
<li class="toctree-l2"><a class="reference internal" href="#Cryptotools.Groups.galois">galois</a>
|
||
</li>
|
||
<li class="toctree-l2"><a class="reference internal" href="#Cryptotools.Groups.galois.Galois">Galois</a>
|
||
<ul>
|
||
<li class="toctree-l3"><a class="reference internal" href="#Cryptotools.Groups.galois.Galois.add">add</a>
|
||
</li>
|
||
<li class="toctree-l3"><a class="reference internal" href="#Cryptotools.Groups.galois.Galois.check_closure_law">check_closure_law</a>
|
||
</li>
|
||
<li class="toctree-l3"><a class="reference internal" href="#Cryptotools.Groups.galois.Galois.check_identity_add">check_identity_add</a>
|
||
</li>
|
||
<li class="toctree-l3"><a class="reference internal" href="#Cryptotools.Groups.galois.Galois.check_identity_mul">check_identity_mul</a>
|
||
</li>
|
||
<li class="toctree-l3"><a class="reference internal" href="#Cryptotools.Groups.galois.Galois.div">div</a>
|
||
</li>
|
||
<li class="toctree-l3"><a class="reference internal" href="#Cryptotools.Groups.galois.Galois.getPrimitiveRoot">getPrimitiveRoot</a>
|
||
</li>
|
||
<li class="toctree-l3"><a class="reference internal" href="#Cryptotools.Groups.galois.Galois.isPrimitiveRoot">isPrimitiveRoot</a>
|
||
</li>
|
||
<li class="toctree-l3"><a class="reference internal" href="#Cryptotools.Groups.galois.Galois.mul">mul</a>
|
||
</li>
|
||
<li class="toctree-l3"><a class="reference internal" href="#Cryptotools.Groups.galois.Galois.primitiveRoot">primitiveRoot</a>
|
||
</li>
|
||
<li class="toctree-l3"><a class="reference internal" href="#Cryptotools.Groups.galois.Galois.printMatrice">printMatrice</a>
|
||
</li>
|
||
<li class="toctree-l3"><a class="reference internal" href="#Cryptotools.Groups.galois.Galois.sub">sub</a>
|
||
</li>
|
||
</ul>
|
||
</li>
|
||
</ul>
|
||
</li>
|
||
</ul>
|
||
<p class="caption"><span class="caption-text">Public Keys</span></p>
|
||
<ul>
|
||
<li class="toctree-l1"><a class="reference internal" href="../rsa/">RSA</a>
|
||
</li>
|
||
</ul>
|
||
<p class="caption"><span class="caption-text">Examples</span></p>
|
||
<ul>
|
||
<li class="toctree-l1"><a class="reference internal" href="../examples-rsa-keys/">Generating RSA Keys</a>
|
||
</li>
|
||
</ul>
|
||
</div>
|
||
</div>
|
||
</nav>
|
||
|
||
<section data-toggle="wy-nav-shift" class="wy-nav-content-wrap">
|
||
<nav class="wy-nav-top" role="navigation" aria-label="Mobile navigation menu">
|
||
<i data-toggle="wy-nav-top" class="fa fa-bars"></i>
|
||
<a href="..">CryptoTools documentation</a>
|
||
|
||
</nav>
|
||
<div class="wy-nav-content">
|
||
<div class="rst-content"><div role="navigation" aria-label="breadcrumbs navigation">
|
||
<ul class="wy-breadcrumbs">
|
||
<li><a href=".." class="icon icon-home" aria-label="Docs"></a></li>
|
||
<li class="breadcrumb-item">Low-level cryptographic</li>
|
||
<li class="breadcrumb-item active">Group theory</li>
|
||
<li class="wy-breadcrumbs-aside">
|
||
</li>
|
||
</ul>
|
||
<hr/>
|
||
</div>
|
||
<div role="main" class="document" itemscope="itemscope" itemtype="http://schema.org/Article">
|
||
<div class="section" itemprop="articleBody">
|
||
|
||
<h1 id="group-theory">Group Theory</h1>
|
||
<h2 id="group">Group</h2>
|
||
|
||
|
||
<div class="doc doc-object doc-module">
|
||
|
||
|
||
|
||
<a id="Cryptotools.Groups.group"></a>
|
||
<div class="doc doc-contents first">
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
<div class="doc doc-children">
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
<div class="doc doc-object doc-class">
|
||
|
||
|
||
|
||
<h2 id="Cryptotools.Groups.group.Group" class="doc doc-heading">
|
||
<code>Group</code>
|
||
|
||
|
||
</h2>
|
||
|
||
|
||
<div class="doc doc-contents ">
|
||
|
||
|
||
<p>This class generate a group self._g based on the operation (here denoted +)
|
||
with the function ope: (a ** b) % n</p>
|
||
<p>In group theory, any group has an identity element (e), which with the binary operation, do not change the value and must satisfy the condition: $a + e = 0$</p>
|
||
|
||
|
||
<table class="field-list">
|
||
<colgroup>
|
||
<col class="field-name" />
|
||
<col class="field-body" />
|
||
</colgroup>
|
||
<tbody valign="top">
|
||
<tr class="field">
|
||
<th class="field-name">Attributes:</th>
|
||
<td class="field-body">
|
||
<ul class="first simple">
|
||
<li>
|
||
<b><code>n</code></b>
|
||
(<code><span title="Integer">Integer</span></code>)
|
||
–
|
||
<div class="doc-md-description">
|
||
<p>It's the G_n elements in the Group</p>
|
||
</div>
|
||
</li>
|
||
<li>
|
||
<b><code>g</code></b>
|
||
(<code><span title="List">List</span></code>)
|
||
–
|
||
<div class="doc-md-description">
|
||
<p>The set of the Group</p>
|
||
</div>
|
||
</li>
|
||
<li>
|
||
<b><code>operation</code></b>
|
||
(<code><span title="Function">Function</span></code>)
|
||
–
|
||
<div class="doc-md-description">
|
||
<p>Function for generating the Group</p>
|
||
</div>
|
||
</li>
|
||
<li>
|
||
<b><code>identity</code></b>
|
||
(<code><span title="Integer">Integer</span></code>)
|
||
–
|
||
<div class="doc-md-description">
|
||
<p>The identity of the group.</p>
|
||
</div>
|
||
</li>
|
||
<li>
|
||
<b><code>reverse</code></b>
|
||
(<code><span title="Dict">Dict</span></code>)
|
||
–
|
||
<div class="doc-md-description">
|
||
<p>For each elements of the Group of n, we have the reverse value</p>
|
||
</div>
|
||
</li>
|
||
</ul>
|
||
</td>
|
||
</tr>
|
||
</tbody>
|
||
</table>
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
<details class="quote">
|
||
<summary>Source code in <code>Cryptotools/Groups/group.py</code></summary>
|
||
<div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"> 3</span>
|
||
<span class="normal"> 4</span>
|
||
<span class="normal"> 5</span>
|
||
<span class="normal"> 6</span>
|
||
<span class="normal"> 7</span>
|
||
<span class="normal"> 8</span>
|
||
<span class="normal"> 9</span>
|
||
<span class="normal"> 10</span>
|
||
<span class="normal"> 11</span>
|
||
<span class="normal"> 12</span>
|
||
<span class="normal"> 13</span>
|
||
<span class="normal"> 14</span>
|
||
<span class="normal"> 15</span>
|
||
<span class="normal"> 16</span>
|
||
<span class="normal"> 17</span>
|
||
<span class="normal"> 18</span>
|
||
<span class="normal"> 19</span>
|
||
<span class="normal"> 20</span>
|
||
<span class="normal"> 21</span>
|
||
<span class="normal"> 22</span>
|
||
<span class="normal"> 23</span>
|
||
<span class="normal"> 24</span>
|
||
<span class="normal"> 25</span>
|
||
<span class="normal"> 26</span>
|
||
<span class="normal"> 27</span>
|
||
<span class="normal"> 28</span>
|
||
<span class="normal"> 29</span>
|
||
<span class="normal"> 30</span>
|
||
<span class="normal"> 31</span>
|
||
<span class="normal"> 32</span>
|
||
<span class="normal"> 33</span>
|
||
<span class="normal"> 34</span>
|
||
<span class="normal"> 35</span>
|
||
<span class="normal"> 36</span>
|
||
<span class="normal"> 37</span>
|
||
<span class="normal"> 38</span>
|
||
<span class="normal"> 39</span>
|
||
<span class="normal"> 40</span>
|
||
<span class="normal"> 41</span>
|
||
<span class="normal"> 42</span>
|
||
<span class="normal"> 43</span>
|
||
<span class="normal"> 44</span>
|
||
<span class="normal"> 45</span>
|
||
<span class="normal"> 46</span>
|
||
<span class="normal"> 47</span>
|
||
<span class="normal"> 48</span>
|
||
<span class="normal"> 49</span>
|
||
<span class="normal"> 50</span>
|
||
<span class="normal"> 51</span>
|
||
<span class="normal"> 52</span>
|
||
<span class="normal"> 53</span>
|
||
<span class="normal"> 54</span>
|
||
<span class="normal"> 55</span>
|
||
<span class="normal"> 56</span>
|
||
<span class="normal"> 57</span>
|
||
<span class="normal"> 58</span>
|
||
<span class="normal"> 59</span>
|
||
<span class="normal"> 60</span>
|
||
<span class="normal"> 61</span>
|
||
<span class="normal"> 62</span>
|
||
<span class="normal"> 63</span>
|
||
<span class="normal"> 64</span>
|
||
<span class="normal"> 65</span>
|
||
<span class="normal"> 66</span>
|
||
<span class="normal"> 67</span>
|
||
<span class="normal"> 68</span>
|
||
<span class="normal"> 69</span>
|
||
<span class="normal"> 70</span>
|
||
<span class="normal"> 71</span>
|
||
<span class="normal"> 72</span>
|
||
<span class="normal"> 73</span>
|
||
<span class="normal"> 74</span>
|
||
<span class="normal"> 75</span>
|
||
<span class="normal"> 76</span>
|
||
<span class="normal"> 77</span>
|
||
<span class="normal"> 78</span>
|
||
<span class="normal"> 79</span>
|
||
<span class="normal"> 80</span>
|
||
<span class="normal"> 81</span>
|
||
<span class="normal"> 82</span>
|
||
<span class="normal"> 83</span>
|
||
<span class="normal"> 84</span>
|
||
<span class="normal"> 85</span>
|
||
<span class="normal"> 86</span>
|
||
<span class="normal"> 87</span>
|
||
<span class="normal"> 88</span>
|
||
<span class="normal"> 89</span>
|
||
<span class="normal"> 90</span>
|
||
<span class="normal"> 91</span>
|
||
<span class="normal"> 92</span>
|
||
<span class="normal"> 93</span>
|
||
<span class="normal"> 94</span>
|
||
<span class="normal"> 95</span>
|
||
<span class="normal"> 96</span>
|
||
<span class="normal"> 97</span>
|
||
<span class="normal"> 98</span>
|
||
<span class="normal"> 99</span>
|
||
<span class="normal">100</span>
|
||
<span class="normal">101</span>
|
||
<span class="normal">102</span>
|
||
<span class="normal">103</span>
|
||
<span class="normal">104</span>
|
||
<span class="normal">105</span>
|
||
<span class="normal">106</span>
|
||
<span class="normal">107</span>
|
||
<span class="normal">108</span>
|
||
<span class="normal">109</span>
|
||
<span class="normal">110</span>
|
||
<span class="normal">111</span>
|
||
<span class="normal">112</span>
|
||
<span class="normal">113</span>
|
||
<span class="normal">114</span>
|
||
<span class="normal">115</span>
|
||
<span class="normal">116</span>
|
||
<span class="normal">117</span>
|
||
<span class="normal">118</span>
|
||
<span class="normal">119</span>
|
||
<span class="normal">120</span>
|
||
<span class="normal">121</span>
|
||
<span class="normal">122</span>
|
||
<span class="normal">123</span>
|
||
<span class="normal">124</span></pre></div></td><td class="code"><div><pre><span></span><code><span class="k">class</span> <span class="nc">Group</span><span class="p">:</span>
|
||
<span class="w"> </span><span class="sd">"""</span>
|
||
<span class="sd"> This class generate a group self._g based on the operation (here denoted +)</span>
|
||
<span class="sd"> with the function ope: (a ** b) % n</span>
|
||
|
||
<span class="sd"> In group theory, any group has an identity element (e), which with the binary operation, do not change the value and must satisfy the condition: $a + e = 0$</span>
|
||
|
||
<span class="sd"> Attributes:</span>
|
||
<span class="sd"> n (Integer): It's the G_n elements in the Group</span>
|
||
<span class="sd"> g (List): The set of the Group</span>
|
||
<span class="sd"> operation (Function): Function for generating the Group</span>
|
||
<span class="sd"> identity (Integer): The identity of the group.</span>
|
||
<span class="sd"> reverse (Dict): For each elements of the Group of n, we have the reverse value</span>
|
||
<span class="sd"> """</span>
|
||
<span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">n</span><span class="p">,</span> <span class="n">g</span><span class="p">,</span> <span class="n">ope</span><span class="p">):</span>
|
||
<span class="bp">self</span><span class="o">.</span><span class="n">_n</span> <span class="o">=</span> <span class="n">n</span>
|
||
<span class="bp">self</span><span class="o">.</span><span class="n">_g</span> <span class="o">=</span> <span class="n">g</span>
|
||
<span class="bp">self</span><span class="o">.</span><span class="n">_operation</span> <span class="o">=</span> <span class="n">ope</span>
|
||
<span class="bp">self</span><span class="o">.</span><span class="n">_identity</span> <span class="o">=</span> <span class="mi">0</span>
|
||
<span class="bp">self</span><span class="o">.</span><span class="n">_reverse</span> <span class="o">=</span> <span class="nb">dict</span><span class="p">()</span>
|
||
|
||
<span class="k">def</span> <span class="nf">getG</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span> <span class="o">-></span> <span class="nb">list</span><span class="p">():</span>
|
||
<span class="w"> </span><span class="sd">"""</span>
|
||
<span class="sd"> This function return the Group</span>
|
||
|
||
<span class="sd"> Returns:</span>
|
||
<span class="sd"> List of all elements in the Group</span>
|
||
<span class="sd"> """</span>
|
||
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_g</span>
|
||
|
||
<span class="k">def</span> <span class="nf">closure</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span> <span class="o">-></span> <span class="nb">bool</span><span class="p">:</span>
|
||
<span class="w"> </span><span class="sd">"""</span>
|
||
<span class="sd"> Check the closure law</span>
|
||
<span class="sd"> In a group, each element a, b belongs to G, such as a + b belongs to G</span>
|
||
|
||
<span class="sd"> Returns:</span>
|
||
<span class="sd"> Return a Boolean if the closure law is respected. True if yes otherwise it's False</span>
|
||
<span class="sd"> """</span>
|
||
<span class="k">for</span> <span class="n">e1</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">_g</span><span class="p">:</span>
|
||
<span class="k">for</span> <span class="n">e2</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">_g</span><span class="p">:</span>
|
||
<span class="n">res</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_operation</span><span class="p">(</span><span class="n">e1</span><span class="p">,</span> <span class="n">e2</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">_n</span><span class="p">)</span>
|
||
<span class="k">if</span> <span class="ow">not</span> <span class="n">res</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">_g</span><span class="p">:</span>
|
||
<span class="c1"># raise Exception(f"{res} not in g. g is not a group")</span>
|
||
<span class="k">return</span> <span class="kc">False</span>
|
||
<span class="k">return</span> <span class="kc">True</span>
|
||
|
||
<span class="k">def</span> <span class="nf">associative</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span> <span class="o">-></span> <span class="nb">bool</span><span class="p">:</span>
|
||
<span class="w"> </span><span class="sd">"""</span>
|
||
<span class="sd"> Check the associative law. </span>
|
||
<span class="sd"> In a group, for any a, b and c belongs to G,</span>
|
||
<span class="sd"> they must respect this condition: (a + b) + c = a + (a + b)</span>
|
||
|
||
<span class="sd"> Returns:</span>
|
||
<span class="sd"> Return a boolean if the Associative law is respected. True if yes otherwise it's False</span>
|
||
<span class="sd"> """</span>
|
||
<span class="n">a</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_g</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
|
||
<span class="n">b</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_g</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span>
|
||
<span class="n">c</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_g</span><span class="p">[</span><span class="mi">2</span><span class="p">]</span>
|
||
|
||
<span class="n">res_ope</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_operation</span><span class="p">(</span><span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">_n</span><span class="p">)</span>
|
||
<span class="n">res1</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_operation</span><span class="p">(</span><span class="n">res_ope</span><span class="p">,</span> <span class="n">c</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">_n</span><span class="p">)</span>
|
||
|
||
<span class="n">res_ope</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_operation</span><span class="p">(</span><span class="n">b</span><span class="p">,</span> <span class="n">c</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">_n</span><span class="p">)</span>
|
||
<span class="n">res2</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_operation</span><span class="p">(</span><span class="n">a</span><span class="p">,</span> <span class="n">res_ope</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">_n</span><span class="p">)</span>
|
||
<span class="k">if</span> <span class="n">res1</span> <span class="o">!=</span> <span class="n">res2</span><span class="p">:</span>
|
||
<span class="c1"># raise Exception(f"{res1} is different from {res2}. g is not a group")</span>
|
||
<span class="k">return</span> <span class="kc">False</span>
|
||
<span class="k">return</span> <span class="kc">True</span>
|
||
|
||
<span class="k">def</span> <span class="nf">identity</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span> <span class="o">-></span> <span class="nb">bool</span><span class="p">:</span>
|
||
<span class="w"> </span><span class="sd">"""</span>
|
||
<span class="sd"> Check the identity law.</span>
|
||
<span class="sd"> In a group, an identity element exist and must be uniq</span>
|
||
|
||
<span class="sd"> Returns:</span>
|
||
<span class="sd"> Return a Boolean if the identity elements has been found. True if found otherwise it's False</span>
|
||
<span class="sd"> """</span>
|
||
<span class="k">for</span> <span class="n">a</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">_g</span><span class="p">:</span>
|
||
<span class="k">for</span> <span class="n">b</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">_g</span><span class="p">:</span>
|
||
<span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">_operation</span><span class="p">(</span><span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">_n</span><span class="p">)</span> <span class="o">==</span> <span class="n">b</span><span class="p">:</span>
|
||
<span class="k">break</span>
|
||
|
||
<span class="bp">self</span><span class="o">.</span><span class="n">_identity</span> <span class="o">=</span> <span class="n">a</span>
|
||
<span class="k">return</span> <span class="kc">True</span>
|
||
<span class="k">return</span> <span class="kc">False</span>
|
||
|
||
<span class="k">def</span> <span class="nf">getIdentity</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span> <span class="o">-></span> <span class="nb">int</span><span class="p">:</span>
|
||
<span class="w"> </span><span class="sd">"""</span>
|
||
<span class="sd"> Return the identity element. The function identitu() must be called before.</span>
|
||
|
||
<span class="sd"> Returns:</span>
|
||
<span class="sd"> Return the identity element if it has been found</span>
|
||
<span class="sd"> """</span>
|
||
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_identity</span>
|
||
|
||
<span class="k">def</span> <span class="nf">reverse</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span> <span class="o">-></span> <span class="nb">bool</span><span class="p">:</span>
|
||
<span class="w"> </span><span class="sd">"""</span>
|
||
<span class="sd"> Check the inverse law</span>
|
||
<span class="sd"> In a group, for each element belongs to G</span>
|
||
<span class="sd"> they must have an inverse a ^ (-1) = e (identity)</span>
|
||
|
||
<span class="sd"> Returns:</span>
|
||
<span class="sd"> Return a Boolean if the all elements ha a reverse element. True if yes otherwise it's False</span>
|
||
<span class="sd"> """</span>
|
||
<span class="n">reverse</span> <span class="o">=</span> <span class="kc">False</span>
|
||
<span class="k">for</span> <span class="n">a</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">_g</span><span class="p">:</span>
|
||
<span class="k">for</span> <span class="n">b</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">_g</span><span class="p">:</span>
|
||
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">_operation</span><span class="p">(</span><span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">_n</span><span class="p">)</span> <span class="o">==</span> <span class="bp">self</span><span class="o">.</span><span class="n">_identity</span><span class="p">:</span>
|
||
<span class="bp">self</span><span class="o">.</span><span class="n">_reverse</span><span class="p">[</span><span class="n">a</span><span class="p">]</span> <span class="o">=</span> <span class="n">b</span>
|
||
<span class="n">reverse</span> <span class="o">=</span> <span class="kc">True</span>
|
||
<span class="k">break</span>
|
||
<span class="k">return</span> <span class="n">reverse</span>
|
||
|
||
<span class="k">def</span> <span class="nf">getReverses</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span> <span class="o">-></span> <span class="nb">dict</span><span class="p">:</span>
|
||
<span class="w"> </span><span class="sd">"""</span>
|
||
<span class="sd"> This function return the dictionary of all reverses elements. The key is the element in G and the value is the reverse element</span>
|
||
|
||
<span class="sd"> Returns:</span>
|
||
<span class="sd"> Return the reverse dictionary</span>
|
||
|
||
<span class="sd"> """</span>
|
||
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_reverse</span>
|
||
</code></pre></div></td></tr></table></div>
|
||
</details>
|
||
|
||
|
||
|
||
<div class="doc doc-children">
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
<div class="doc doc-object doc-function">
|
||
|
||
|
||
<h3 id="Cryptotools.Groups.group.Group.associative" class="doc doc-heading">
|
||
<code class="highlight language-python"><span class="n">associative</span><span class="p">()</span></code>
|
||
|
||
</h3>
|
||
|
||
|
||
<div class="doc doc-contents ">
|
||
|
||
<p>Check the associative law.
|
||
In a group, for any a, b and c belongs to G,
|
||
they must respect this condition: (a + b) + c = a + (a + b)</p>
|
||
|
||
|
||
<table class="field-list">
|
||
<colgroup>
|
||
<col class="field-name" />
|
||
<col class="field-body" />
|
||
</colgroup>
|
||
<tbody valign="top">
|
||
<tr class="field">
|
||
<th class="field-name">Returns:</th>
|
||
<td class="field-body">
|
||
<ul class="first simple">
|
||
<li>
|
||
<code><span title="bool">bool</span></code>
|
||
–
|
||
<div class="doc-md-description">
|
||
<p>Return a boolean if the Associative law is respected. True if yes otherwise it's False</p>
|
||
</div>
|
||
</li>
|
||
</ul>
|
||
</td>
|
||
</tr>
|
||
</tbody>
|
||
</table>
|
||
|
||
<details class="quote">
|
||
<summary>Source code in <code>Cryptotools/Groups/group.py</code></summary>
|
||
<div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal">49</span>
|
||
<span class="normal">50</span>
|
||
<span class="normal">51</span>
|
||
<span class="normal">52</span>
|
||
<span class="normal">53</span>
|
||
<span class="normal">54</span>
|
||
<span class="normal">55</span>
|
||
<span class="normal">56</span>
|
||
<span class="normal">57</span>
|
||
<span class="normal">58</span>
|
||
<span class="normal">59</span>
|
||
<span class="normal">60</span>
|
||
<span class="normal">61</span>
|
||
<span class="normal">62</span>
|
||
<span class="normal">63</span>
|
||
<span class="normal">64</span>
|
||
<span class="normal">65</span>
|
||
<span class="normal">66</span>
|
||
<span class="normal">67</span>
|
||
<span class="normal">68</span>
|
||
<span class="normal">69</span>
|
||
<span class="normal">70</span></pre></div></td><td class="code"><div><pre><span></span><code><span class="k">def</span> <span class="nf">associative</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span> <span class="o">-></span> <span class="nb">bool</span><span class="p">:</span>
|
||
<span class="w"> </span><span class="sd">"""</span>
|
||
<span class="sd"> Check the associative law. </span>
|
||
<span class="sd"> In a group, for any a, b and c belongs to G,</span>
|
||
<span class="sd"> they must respect this condition: (a + b) + c = a + (a + b)</span>
|
||
|
||
<span class="sd"> Returns:</span>
|
||
<span class="sd"> Return a boolean if the Associative law is respected. True if yes otherwise it's False</span>
|
||
<span class="sd"> """</span>
|
||
<span class="n">a</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_g</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
|
||
<span class="n">b</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_g</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span>
|
||
<span class="n">c</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_g</span><span class="p">[</span><span class="mi">2</span><span class="p">]</span>
|
||
|
||
<span class="n">res_ope</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_operation</span><span class="p">(</span><span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">_n</span><span class="p">)</span>
|
||
<span class="n">res1</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_operation</span><span class="p">(</span><span class="n">res_ope</span><span class="p">,</span> <span class="n">c</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">_n</span><span class="p">)</span>
|
||
|
||
<span class="n">res_ope</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_operation</span><span class="p">(</span><span class="n">b</span><span class="p">,</span> <span class="n">c</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">_n</span><span class="p">)</span>
|
||
<span class="n">res2</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_operation</span><span class="p">(</span><span class="n">a</span><span class="p">,</span> <span class="n">res_ope</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">_n</span><span class="p">)</span>
|
||
<span class="k">if</span> <span class="n">res1</span> <span class="o">!=</span> <span class="n">res2</span><span class="p">:</span>
|
||
<span class="c1"># raise Exception(f"{res1} is different from {res2}. g is not a group")</span>
|
||
<span class="k">return</span> <span class="kc">False</span>
|
||
<span class="k">return</span> <span class="kc">True</span>
|
||
</code></pre></div></td></tr></table></div>
|
||
</details>
|
||
</div>
|
||
|
||
</div>
|
||
|
||
<div class="doc doc-object doc-function">
|
||
|
||
|
||
<h3 id="Cryptotools.Groups.group.Group.closure" class="doc doc-heading">
|
||
<code class="highlight language-python"><span class="n">closure</span><span class="p">()</span></code>
|
||
|
||
</h3>
|
||
|
||
|
||
<div class="doc doc-contents ">
|
||
|
||
<p>Check the closure law
|
||
In a group, each element a, b belongs to G, such as a + b belongs to G</p>
|
||
|
||
|
||
<table class="field-list">
|
||
<colgroup>
|
||
<col class="field-name" />
|
||
<col class="field-body" />
|
||
</colgroup>
|
||
<tbody valign="top">
|
||
<tr class="field">
|
||
<th class="field-name">Returns:</th>
|
||
<td class="field-body">
|
||
<ul class="first simple">
|
||
<li>
|
||
<code><span title="bool">bool</span></code>
|
||
–
|
||
<div class="doc-md-description">
|
||
<p>Return a Boolean if the closure law is respected. True if yes otherwise it's False</p>
|
||
</div>
|
||
</li>
|
||
</ul>
|
||
</td>
|
||
</tr>
|
||
</tbody>
|
||
</table>
|
||
|
||
<details class="quote">
|
||
<summary>Source code in <code>Cryptotools/Groups/group.py</code></summary>
|
||
<div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal">33</span>
|
||
<span class="normal">34</span>
|
||
<span class="normal">35</span>
|
||
<span class="normal">36</span>
|
||
<span class="normal">37</span>
|
||
<span class="normal">38</span>
|
||
<span class="normal">39</span>
|
||
<span class="normal">40</span>
|
||
<span class="normal">41</span>
|
||
<span class="normal">42</span>
|
||
<span class="normal">43</span>
|
||
<span class="normal">44</span>
|
||
<span class="normal">45</span>
|
||
<span class="normal">46</span>
|
||
<span class="normal">47</span></pre></div></td><td class="code"><div><pre><span></span><code><span class="k">def</span> <span class="nf">closure</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span> <span class="o">-></span> <span class="nb">bool</span><span class="p">:</span>
|
||
<span class="w"> </span><span class="sd">"""</span>
|
||
<span class="sd"> Check the closure law</span>
|
||
<span class="sd"> In a group, each element a, b belongs to G, such as a + b belongs to G</span>
|
||
|
||
<span class="sd"> Returns:</span>
|
||
<span class="sd"> Return a Boolean if the closure law is respected. True if yes otherwise it's False</span>
|
||
<span class="sd"> """</span>
|
||
<span class="k">for</span> <span class="n">e1</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">_g</span><span class="p">:</span>
|
||
<span class="k">for</span> <span class="n">e2</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">_g</span><span class="p">:</span>
|
||
<span class="n">res</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_operation</span><span class="p">(</span><span class="n">e1</span><span class="p">,</span> <span class="n">e2</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">_n</span><span class="p">)</span>
|
||
<span class="k">if</span> <span class="ow">not</span> <span class="n">res</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">_g</span><span class="p">:</span>
|
||
<span class="c1"># raise Exception(f"{res} not in g. g is not a group")</span>
|
||
<span class="k">return</span> <span class="kc">False</span>
|
||
<span class="k">return</span> <span class="kc">True</span>
|
||
</code></pre></div></td></tr></table></div>
|
||
</details>
|
||
</div>
|
||
|
||
</div>
|
||
|
||
<div class="doc doc-object doc-function">
|
||
|
||
|
||
<h3 id="Cryptotools.Groups.group.Group.getG" class="doc doc-heading">
|
||
<code class="highlight language-python"><span class="n">getG</span><span class="p">()</span></code>
|
||
|
||
</h3>
|
||
|
||
|
||
<div class="doc doc-contents ">
|
||
|
||
<p>This function return the Group</p>
|
||
|
||
|
||
<table class="field-list">
|
||
<colgroup>
|
||
<col class="field-name" />
|
||
<col class="field-body" />
|
||
</colgroup>
|
||
<tbody valign="top">
|
||
<tr class="field">
|
||
<th class="field-name">Returns:</th>
|
||
<td class="field-body">
|
||
<ul class="first simple">
|
||
<li>
|
||
<code><span title="list">list</span>()</code>
|
||
–
|
||
<div class="doc-md-description">
|
||
<p>List of all elements in the Group</p>
|
||
</div>
|
||
</li>
|
||
</ul>
|
||
</td>
|
||
</tr>
|
||
</tbody>
|
||
</table>
|
||
|
||
<details class="quote">
|
||
<summary>Source code in <code>Cryptotools/Groups/group.py</code></summary>
|
||
<div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal">24</span>
|
||
<span class="normal">25</span>
|
||
<span class="normal">26</span>
|
||
<span class="normal">27</span>
|
||
<span class="normal">28</span>
|
||
<span class="normal">29</span>
|
||
<span class="normal">30</span>
|
||
<span class="normal">31</span></pre></div></td><td class="code"><div><pre><span></span><code><span class="k">def</span> <span class="nf">getG</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span> <span class="o">-></span> <span class="nb">list</span><span class="p">():</span>
|
||
<span class="w"> </span><span class="sd">"""</span>
|
||
<span class="sd"> This function return the Group</span>
|
||
|
||
<span class="sd"> Returns:</span>
|
||
<span class="sd"> List of all elements in the Group</span>
|
||
<span class="sd"> """</span>
|
||
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_g</span>
|
||
</code></pre></div></td></tr></table></div>
|
||
</details>
|
||
</div>
|
||
|
||
</div>
|
||
|
||
<div class="doc doc-object doc-function">
|
||
|
||
|
||
<h3 id="Cryptotools.Groups.group.Group.getIdentity" class="doc doc-heading">
|
||
<code class="highlight language-python"><span class="n">getIdentity</span><span class="p">()</span></code>
|
||
|
||
</h3>
|
||
|
||
|
||
<div class="doc doc-contents ">
|
||
|
||
<p>Return the identity element. The function identitu() must be called before.</p>
|
||
|
||
|
||
<table class="field-list">
|
||
<colgroup>
|
||
<col class="field-name" />
|
||
<col class="field-body" />
|
||
</colgroup>
|
||
<tbody valign="top">
|
||
<tr class="field">
|
||
<th class="field-name">Returns:</th>
|
||
<td class="field-body">
|
||
<ul class="first simple">
|
||
<li>
|
||
<code><span title="int">int</span></code>
|
||
–
|
||
<div class="doc-md-description">
|
||
<p>Return the identity element if it has been found</p>
|
||
</div>
|
||
</li>
|
||
</ul>
|
||
</td>
|
||
</tr>
|
||
</tbody>
|
||
</table>
|
||
|
||
<details class="quote">
|
||
<summary>Source code in <code>Cryptotools/Groups/group.py</code></summary>
|
||
<div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal">89</span>
|
||
<span class="normal">90</span>
|
||
<span class="normal">91</span>
|
||
<span class="normal">92</span>
|
||
<span class="normal">93</span>
|
||
<span class="normal">94</span>
|
||
<span class="normal">95</span>
|
||
<span class="normal">96</span></pre></div></td><td class="code"><div><pre><span></span><code><span class="k">def</span> <span class="nf">getIdentity</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span> <span class="o">-></span> <span class="nb">int</span><span class="p">:</span>
|
||
<span class="w"> </span><span class="sd">"""</span>
|
||
<span class="sd"> Return the identity element. The function identitu() must be called before.</span>
|
||
|
||
<span class="sd"> Returns:</span>
|
||
<span class="sd"> Return the identity element if it has been found</span>
|
||
<span class="sd"> """</span>
|
||
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_identity</span>
|
||
</code></pre></div></td></tr></table></div>
|
||
</details>
|
||
</div>
|
||
|
||
</div>
|
||
|
||
<div class="doc doc-object doc-function">
|
||
|
||
|
||
<h3 id="Cryptotools.Groups.group.Group.getReverses" class="doc doc-heading">
|
||
<code class="highlight language-python"><span class="n">getReverses</span><span class="p">()</span></code>
|
||
|
||
</h3>
|
||
|
||
|
||
<div class="doc doc-contents ">
|
||
|
||
<p>This function return the dictionary of all reverses elements. The key is the element in G and the value is the reverse element</p>
|
||
|
||
|
||
<table class="field-list">
|
||
<colgroup>
|
||
<col class="field-name" />
|
||
<col class="field-body" />
|
||
</colgroup>
|
||
<tbody valign="top">
|
||
<tr class="field">
|
||
<th class="field-name">Returns:</th>
|
||
<td class="field-body">
|
||
<ul class="first simple">
|
||
<li>
|
||
<code><span title="dict">dict</span></code>
|
||
–
|
||
<div class="doc-md-description">
|
||
<p>Return the reverse dictionary</p>
|
||
</div>
|
||
</li>
|
||
</ul>
|
||
</td>
|
||
</tr>
|
||
</tbody>
|
||
</table>
|
||
|
||
<details class="quote">
|
||
<summary>Source code in <code>Cryptotools/Groups/group.py</code></summary>
|
||
<div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal">116</span>
|
||
<span class="normal">117</span>
|
||
<span class="normal">118</span>
|
||
<span class="normal">119</span>
|
||
<span class="normal">120</span>
|
||
<span class="normal">121</span>
|
||
<span class="normal">122</span>
|
||
<span class="normal">123</span>
|
||
<span class="normal">124</span></pre></div></td><td class="code"><div><pre><span></span><code><span class="k">def</span> <span class="nf">getReverses</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span> <span class="o">-></span> <span class="nb">dict</span><span class="p">:</span>
|
||
<span class="w"> </span><span class="sd">"""</span>
|
||
<span class="sd"> This function return the dictionary of all reverses elements. The key is the element in G and the value is the reverse element</span>
|
||
|
||
<span class="sd"> Returns:</span>
|
||
<span class="sd"> Return the reverse dictionary</span>
|
||
|
||
<span class="sd"> """</span>
|
||
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_reverse</span>
|
||
</code></pre></div></td></tr></table></div>
|
||
</details>
|
||
</div>
|
||
|
||
</div>
|
||
|
||
<div class="doc doc-object doc-function">
|
||
|
||
|
||
<h3 id="Cryptotools.Groups.group.Group.identity" class="doc doc-heading">
|
||
<code class="highlight language-python"><span class="n">identity</span><span class="p">()</span></code>
|
||
|
||
</h3>
|
||
|
||
|
||
<div class="doc doc-contents ">
|
||
|
||
<p>Check the identity law.
|
||
In a group, an identity element exist and must be uniq</p>
|
||
|
||
|
||
<table class="field-list">
|
||
<colgroup>
|
||
<col class="field-name" />
|
||
<col class="field-body" />
|
||
</colgroup>
|
||
<tbody valign="top">
|
||
<tr class="field">
|
||
<th class="field-name">Returns:</th>
|
||
<td class="field-body">
|
||
<ul class="first simple">
|
||
<li>
|
||
<code><span title="bool">bool</span></code>
|
||
–
|
||
<div class="doc-md-description">
|
||
<p>Return a Boolean if the identity elements has been found. True if found otherwise it's False</p>
|
||
</div>
|
||
</li>
|
||
</ul>
|
||
</td>
|
||
</tr>
|
||
</tbody>
|
||
</table>
|
||
|
||
<details class="quote">
|
||
<summary>Source code in <code>Cryptotools/Groups/group.py</code></summary>
|
||
<div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal">72</span>
|
||
<span class="normal">73</span>
|
||
<span class="normal">74</span>
|
||
<span class="normal">75</span>
|
||
<span class="normal">76</span>
|
||
<span class="normal">77</span>
|
||
<span class="normal">78</span>
|
||
<span class="normal">79</span>
|
||
<span class="normal">80</span>
|
||
<span class="normal">81</span>
|
||
<span class="normal">82</span>
|
||
<span class="normal">83</span>
|
||
<span class="normal">84</span>
|
||
<span class="normal">85</span>
|
||
<span class="normal">86</span>
|
||
<span class="normal">87</span></pre></div></td><td class="code"><div><pre><span></span><code><span class="k">def</span> <span class="nf">identity</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span> <span class="o">-></span> <span class="nb">bool</span><span class="p">:</span>
|
||
<span class="w"> </span><span class="sd">"""</span>
|
||
<span class="sd"> Check the identity law.</span>
|
||
<span class="sd"> In a group, an identity element exist and must be uniq</span>
|
||
|
||
<span class="sd"> Returns:</span>
|
||
<span class="sd"> Return a Boolean if the identity elements has been found. True if found otherwise it's False</span>
|
||
<span class="sd"> """</span>
|
||
<span class="k">for</span> <span class="n">a</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">_g</span><span class="p">:</span>
|
||
<span class="k">for</span> <span class="n">b</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">_g</span><span class="p">:</span>
|
||
<span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">_operation</span><span class="p">(</span><span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">_n</span><span class="p">)</span> <span class="o">==</span> <span class="n">b</span><span class="p">:</span>
|
||
<span class="k">break</span>
|
||
|
||
<span class="bp">self</span><span class="o">.</span><span class="n">_identity</span> <span class="o">=</span> <span class="n">a</span>
|
||
<span class="k">return</span> <span class="kc">True</span>
|
||
<span class="k">return</span> <span class="kc">False</span>
|
||
</code></pre></div></td></tr></table></div>
|
||
</details>
|
||
</div>
|
||
|
||
</div>
|
||
|
||
<div class="doc doc-object doc-function">
|
||
|
||
|
||
<h3 id="Cryptotools.Groups.group.Group.reverse" class="doc doc-heading">
|
||
<code class="highlight language-python"><span class="n">reverse</span><span class="p">()</span></code>
|
||
|
||
</h3>
|
||
|
||
|
||
<div class="doc doc-contents ">
|
||
|
||
<p>Check the inverse law
|
||
In a group, for each element belongs to G
|
||
they must have an inverse a ^ (-1) = e (identity)</p>
|
||
|
||
|
||
<table class="field-list">
|
||
<colgroup>
|
||
<col class="field-name" />
|
||
<col class="field-body" />
|
||
</colgroup>
|
||
<tbody valign="top">
|
||
<tr class="field">
|
||
<th class="field-name">Returns:</th>
|
||
<td class="field-body">
|
||
<ul class="first simple">
|
||
<li>
|
||
<code><span title="bool">bool</span></code>
|
||
–
|
||
<div class="doc-md-description">
|
||
<p>Return a Boolean if the all elements ha a reverse element. True if yes otherwise it's False</p>
|
||
</div>
|
||
</li>
|
||
</ul>
|
||
</td>
|
||
</tr>
|
||
</tbody>
|
||
</table>
|
||
|
||
<details class="quote">
|
||
<summary>Source code in <code>Cryptotools/Groups/group.py</code></summary>
|
||
<div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"> 98</span>
|
||
<span class="normal"> 99</span>
|
||
<span class="normal">100</span>
|
||
<span class="normal">101</span>
|
||
<span class="normal">102</span>
|
||
<span class="normal">103</span>
|
||
<span class="normal">104</span>
|
||
<span class="normal">105</span>
|
||
<span class="normal">106</span>
|
||
<span class="normal">107</span>
|
||
<span class="normal">108</span>
|
||
<span class="normal">109</span>
|
||
<span class="normal">110</span>
|
||
<span class="normal">111</span>
|
||
<span class="normal">112</span>
|
||
<span class="normal">113</span>
|
||
<span class="normal">114</span></pre></div></td><td class="code"><div><pre><span></span><code><span class="k">def</span> <span class="nf">reverse</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span> <span class="o">-></span> <span class="nb">bool</span><span class="p">:</span>
|
||
<span class="w"> </span><span class="sd">"""</span>
|
||
<span class="sd"> Check the inverse law</span>
|
||
<span class="sd"> In a group, for each element belongs to G</span>
|
||
<span class="sd"> they must have an inverse a ^ (-1) = e (identity)</span>
|
||
|
||
<span class="sd"> Returns:</span>
|
||
<span class="sd"> Return a Boolean if the all elements ha a reverse element. True if yes otherwise it's False</span>
|
||
<span class="sd"> """</span>
|
||
<span class="n">reverse</span> <span class="o">=</span> <span class="kc">False</span>
|
||
<span class="k">for</span> <span class="n">a</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">_g</span><span class="p">:</span>
|
||
<span class="k">for</span> <span class="n">b</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">_g</span><span class="p">:</span>
|
||
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">_operation</span><span class="p">(</span><span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">_n</span><span class="p">)</span> <span class="o">==</span> <span class="bp">self</span><span class="o">.</span><span class="n">_identity</span><span class="p">:</span>
|
||
<span class="bp">self</span><span class="o">.</span><span class="n">_reverse</span><span class="p">[</span><span class="n">a</span><span class="p">]</span> <span class="o">=</span> <span class="n">b</span>
|
||
<span class="n">reverse</span> <span class="o">=</span> <span class="kc">True</span>
|
||
<span class="k">break</span>
|
||
<span class="k">return</span> <span class="n">reverse</span>
|
||
</code></pre></div></td></tr></table></div>
|
||
</details>
|
||
</div>
|
||
|
||
</div>
|
||
|
||
|
||
|
||
</div>
|
||
|
||
</div>
|
||
|
||
</div>
|
||
|
||
|
||
|
||
|
||
</div>
|
||
|
||
</div>
|
||
|
||
</div><h2 id="cyclic-group">Cyclic group</h2>
|
||
|
||
|
||
<div class="doc doc-object doc-module">
|
||
|
||
|
||
|
||
<a id="Cryptotools.Groups.cyclic"></a>
|
||
<div class="doc doc-contents first">
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
<div class="doc doc-children">
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
<div class="doc doc-object doc-class">
|
||
|
||
|
||
|
||
<h2 id="Cryptotools.Groups.cyclic.Cyclic" class="doc doc-heading">
|
||
<code>Cyclic</code>
|
||
|
||
|
||
</h2>
|
||
|
||
|
||
<div class="doc doc-contents ">
|
||
<p class="doc doc-class-bases">
|
||
Bases: <code><a class="autorefs autorefs-internal" title="Group (Cryptotools.Groups.group.Group)" href="#Cryptotools.Groups.group.Group">Group</a></code></p>
|
||
|
||
|
||
<p>This object contain a list of the Group for a cyclic group. This class find all generator of the group.
|
||
This class is inherited from Group object</p>
|
||
|
||
|
||
<table class="field-list">
|
||
<colgroup>
|
||
<col class="field-name" />
|
||
<col class="field-body" />
|
||
</colgroup>
|
||
<tbody valign="top">
|
||
<tr class="field">
|
||
<th class="field-name">Attributes:</th>
|
||
<td class="field-body">
|
||
<ul class="first simple">
|
||
<li>
|
||
<b><code>G</code></b>
|
||
(<code><span title="list">list</span></code>)
|
||
–
|
||
<div class="doc-md-description">
|
||
<p>list of all elements in the group</p>
|
||
</div>
|
||
</li>
|
||
<li>
|
||
<b><code>n</code></b>
|
||
(<code><span title="Integer">Integer</span></code>)
|
||
–
|
||
<div class="doc-md-description">
|
||
<p>it's the value where the group has been generated</p>
|
||
</div>
|
||
</li>
|
||
<li>
|
||
<b><code>operation</code></b>
|
||
(<code><span title="Function">Function</span></code>)
|
||
–
|
||
<div class="doc-md-description">
|
||
<p>it's the operation generating the group</p>
|
||
</div>
|
||
</li>
|
||
<li>
|
||
<b><code>generators</code></b>
|
||
(<code><span title="list">list</span></code>)
|
||
–
|
||
<div class="doc-md-description">
|
||
<p>contain all generators of the group </p>
|
||
</div>
|
||
</li>
|
||
<li>
|
||
<b><code>generatorChecked</code></b>
|
||
(<code><span title="boolean">boolean</span></code>)
|
||
–
|
||
<div class="doc-md-description">
|
||
<p>Check if generators has been found</p>
|
||
</div>
|
||
</li>
|
||
</ul>
|
||
</td>
|
||
</tr>
|
||
</tbody>
|
||
</table>
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
<details class="quote">
|
||
<summary>Source code in <code>Cryptotools/Groups/cyclic.py</code></summary>
|
||
<div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"> 6</span>
|
||
<span class="normal"> 7</span>
|
||
<span class="normal"> 8</span>
|
||
<span class="normal"> 9</span>
|
||
<span class="normal">10</span>
|
||
<span class="normal">11</span>
|
||
<span class="normal">12</span>
|
||
<span class="normal">13</span>
|
||
<span class="normal">14</span>
|
||
<span class="normal">15</span>
|
||
<span class="normal">16</span>
|
||
<span class="normal">17</span>
|
||
<span class="normal">18</span>
|
||
<span class="normal">19</span>
|
||
<span class="normal">20</span>
|
||
<span class="normal">21</span>
|
||
<span class="normal">22</span>
|
||
<span class="normal">23</span>
|
||
<span class="normal">24</span>
|
||
<span class="normal">25</span>
|
||
<span class="normal">26</span>
|
||
<span class="normal">27</span>
|
||
<span class="normal">28</span>
|
||
<span class="normal">29</span>
|
||
<span class="normal">30</span>
|
||
<span class="normal">31</span>
|
||
<span class="normal">32</span>
|
||
<span class="normal">33</span>
|
||
<span class="normal">34</span>
|
||
<span class="normal">35</span>
|
||
<span class="normal">36</span>
|
||
<span class="normal">37</span>
|
||
<span class="normal">38</span>
|
||
<span class="normal">39</span>
|
||
<span class="normal">40</span>
|
||
<span class="normal">41</span>
|
||
<span class="normal">42</span>
|
||
<span class="normal">43</span>
|
||
<span class="normal">44</span>
|
||
<span class="normal">45</span>
|
||
<span class="normal">46</span>
|
||
<span class="normal">47</span>
|
||
<span class="normal">48</span>
|
||
<span class="normal">49</span>
|
||
<span class="normal">50</span>
|
||
<span class="normal">51</span>
|
||
<span class="normal">52</span>
|
||
<span class="normal">53</span>
|
||
<span class="normal">54</span>
|
||
<span class="normal">55</span>
|
||
<span class="normal">56</span>
|
||
<span class="normal">57</span>
|
||
<span class="normal">58</span>
|
||
<span class="normal">59</span>
|
||
<span class="normal">60</span>
|
||
<span class="normal">61</span>
|
||
<span class="normal">62</span>
|
||
<span class="normal">63</span>
|
||
<span class="normal">64</span>
|
||
<span class="normal">65</span>
|
||
<span class="normal">66</span>
|
||
<span class="normal">67</span>
|
||
<span class="normal">68</span>
|
||
<span class="normal">69</span>
|
||
<span class="normal">70</span>
|
||
<span class="normal">71</span>
|
||
<span class="normal">72</span>
|
||
<span class="normal">73</span>
|
||
<span class="normal">74</span>
|
||
<span class="normal">75</span>
|
||
<span class="normal">76</span>
|
||
<span class="normal">77</span>
|
||
<span class="normal">78</span>
|
||
<span class="normal">79</span>
|
||
<span class="normal">80</span>
|
||
<span class="normal">81</span>
|
||
<span class="normal">82</span>
|
||
<span class="normal">83</span>
|
||
<span class="normal">84</span>
|
||
<span class="normal">85</span>
|
||
<span class="normal">86</span>
|
||
<span class="normal">87</span>
|
||
<span class="normal">88</span>
|
||
<span class="normal">89</span>
|
||
<span class="normal">90</span>
|
||
<span class="normal">91</span></pre></div></td><td class="code"><div><pre><span></span><code><span class="k">class</span> <span class="nc">Cyclic</span><span class="p">(</span><span class="n">Group</span><span class="p">):</span>
|
||
<span class="w"> </span><span class="sd">"""</span>
|
||
<span class="sd"> This object contain a list of the Group for a cyclic group. This class find all generator of the group.</span>
|
||
<span class="sd"> This class is inherited from Group object</span>
|
||
|
||
<span class="sd"> Attributes:</span>
|
||
<span class="sd"> G (list): list of all elements in the group</span>
|
||
<span class="sd"> n (Integer): it's the value where the group has been generated</span>
|
||
<span class="sd"> operation (Function): it's the operation generating the group</span>
|
||
<span class="sd"> generators (list): contain all generators of the group </span>
|
||
<span class="sd"> generatorChecked (boolean): Check if generators has been found</span>
|
||
<span class="sd"> """</span>
|
||
<span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">G</span><span class="p">:</span><span class="nb">list</span><span class="p">,</span> <span class="n">n</span><span class="p">,</span> <span class="n">ope</span><span class="p">):</span>
|
||
<span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="fm">__init__</span><span class="p">(</span><span class="n">n</span><span class="p">,</span> <span class="n">G</span><span class="p">,</span> <span class="n">ope</span><span class="p">)</span> <span class="c1"># Call the Group's constructor</span>
|
||
<span class="bp">self</span><span class="o">.</span><span class="n">_G</span> <span class="o">=</span> <span class="n">G</span>
|
||
<span class="bp">self</span><span class="o">.</span><span class="n">_n</span> <span class="o">=</span> <span class="n">n</span>
|
||
<span class="bp">self</span><span class="o">.</span><span class="n">_operation</span> <span class="o">=</span> <span class="n">ope</span>
|
||
<span class="bp">self</span><span class="o">.</span><span class="n">_generators</span> <span class="o">=</span> <span class="nb">list</span><span class="p">()</span>
|
||
<span class="bp">self</span><span class="o">.</span><span class="n">_generatorChecked</span> <span class="o">=</span> <span class="kc">False</span>
|
||
|
||
<span class="k">def</span> <span class="nf">generator</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
||
<span class="w"> </span><span class="sd">"""</span>
|
||
<span class="sd"> This function find all generators in the group G</span>
|
||
<span class="sd"> """</span>
|
||
|
||
<span class="n">index</span> <span class="o">=</span> <span class="mi">1</span>
|
||
<span class="n">G</span> <span class="o">=</span> <span class="nb">sorted</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_g</span><span class="p">)</span>
|
||
<span class="k">for</span> <span class="n">g</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">2</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">_n</span><span class="p">):</span>
|
||
<span class="n">z</span> <span class="o">=</span> <span class="nb">list</span><span class="p">()</span>
|
||
<span class="k">for</span> <span class="n">entry</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">_n</span><span class="p">):</span>
|
||
<span class="n">res</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_operation</span><span class="p">(</span><span class="n">g</span><span class="p">,</span> <span class="n">index</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">_n</span><span class="p">)</span>
|
||
<span class="k">if</span> <span class="n">res</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">z</span><span class="p">:</span>
|
||
<span class="n">z</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">res</span><span class="p">)</span>
|
||
<span class="n">index</span> <span class="o">=</span> <span class="n">index</span> <span class="o">+</span> <span class="mi">1</span>
|
||
|
||
<span class="c1"># We check if that match with G</span>
|
||
<span class="c1"># If yes, we find a generator</span>
|
||
<span class="k">if</span> <span class="nb">sorted</span><span class="p">(</span><span class="n">z</span><span class="p">)</span> <span class="o">==</span> <span class="n">G</span><span class="p">:</span>
|
||
<span class="bp">self</span><span class="o">.</span><span class="n">_generators</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">g</span><span class="p">)</span>
|
||
<span class="bp">self</span><span class="o">.</span><span class="n">_generatorChecked</span> <span class="o">=</span> <span class="kc">True</span>
|
||
|
||
<span class="k">def</span> <span class="nf">getPrimitiveRoot</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
||
<span class="w"> </span><span class="sd">"""</span>
|
||
<span class="sd"> This function return the primitive root modulo of n</span>
|
||
|
||
<span class="sd"> Returns:</span>
|
||
<span class="sd"> Return the primitive root of the group. None if no primitive has been found</span>
|
||
<span class="sd"> """</span>
|
||
|
||
<span class="n">index</span> <span class="o">=</span> <span class="mi">1</span>
|
||
<span class="n">G</span> <span class="o">=</span> <span class="nb">sorted</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_g</span><span class="p">)</span>
|
||
<span class="k">for</span> <span class="n">g</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">2</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">_n</span><span class="p">):</span>
|
||
<span class="n">z</span> <span class="o">=</span> <span class="nb">list</span><span class="p">()</span>
|
||
<span class="k">for</span> <span class="n">entry</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">_n</span><span class="p">):</span>
|
||
<span class="n">res</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_operation</span><span class="p">(</span><span class="n">g</span><span class="p">,</span> <span class="n">index</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">_n</span><span class="p">)</span>
|
||
<span class="k">if</span> <span class="n">res</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">z</span><span class="p">:</span>
|
||
<span class="n">z</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">res</span><span class="p">)</span>
|
||
<span class="n">index</span> <span class="o">+=</span> <span class="mi">1</span>
|
||
|
||
<span class="c1"># If the group is the same has G, we found a generator</span>
|
||
<span class="k">if</span> <span class="nb">sorted</span><span class="p">(</span><span class="n">z</span><span class="p">)</span> <span class="o">==</span> <span class="n">G</span><span class="p">:</span>
|
||
<span class="k">return</span> <span class="n">g</span>
|
||
<span class="k">return</span> <span class="kc">None</span>
|
||
|
||
<span class="k">def</span> <span class="nf">getGenerators</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span> <span class="o">-></span> <span class="nb">list</span><span class="p">:</span>
|
||
<span class="w"> </span><span class="sd">"""</span>
|
||
<span class="sd"> This function return all generators of that group</span>
|
||
|
||
<span class="sd"> Returns:</span>
|
||
<span class="sd"> Return the list of generators found. The function generators() must be called before to call this function</span>
|
||
<span class="sd"> """</span>
|
||
<span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">_generatorChecked</span><span class="p">:</span>
|
||
<span class="bp">self</span><span class="o">.</span><span class="n">generator</span><span class="p">()</span>
|
||
<span class="bp">self</span><span class="o">.</span><span class="n">_generatorChecked</span> <span class="o">=</span> <span class="kc">True</span>
|
||
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_generators</span>
|
||
|
||
<span class="k">def</span> <span class="nf">isCyclic</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span> <span class="o">-></span> <span class="nb">bool</span><span class="p">:</span>
|
||
<span class="w"> </span><span class="sd">"""</span>
|
||
<span class="sd"> Check if the group is a cyclic group, means we have at least one generator</span>
|
||
|
||
<span class="sd"> Returns:</span>
|
||
<span class="sd"> REturn a boolean, False if the group is not Cyclic otherwise return True</span>
|
||
<span class="sd"> """</span>
|
||
<span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">getGenerators</span><span class="p">())</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
|
||
<span class="k">return</span> <span class="kc">False</span>
|
||
<span class="k">return</span> <span class="kc">True</span>
|
||
</code></pre></div></td></tr></table></div>
|
||
</details>
|
||
|
||
|
||
|
||
<div class="doc doc-children">
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
<div class="doc doc-object doc-function">
|
||
|
||
|
||
<h3 id="Cryptotools.Groups.cyclic.Cyclic.generator" class="doc doc-heading">
|
||
<code class="highlight language-python"><span class="n">generator</span><span class="p">()</span></code>
|
||
|
||
</h3>
|
||
|
||
|
||
<div class="doc doc-contents ">
|
||
|
||
<p>This function find all generators in the group G</p>
|
||
|
||
|
||
<details class="quote">
|
||
<summary>Source code in <code>Cryptotools/Groups/cyclic.py</code></summary>
|
||
<div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal">26</span>
|
||
<span class="normal">27</span>
|
||
<span class="normal">28</span>
|
||
<span class="normal">29</span>
|
||
<span class="normal">30</span>
|
||
<span class="normal">31</span>
|
||
<span class="normal">32</span>
|
||
<span class="normal">33</span>
|
||
<span class="normal">34</span>
|
||
<span class="normal">35</span>
|
||
<span class="normal">36</span>
|
||
<span class="normal">37</span>
|
||
<span class="normal">38</span>
|
||
<span class="normal">39</span>
|
||
<span class="normal">40</span>
|
||
<span class="normal">41</span>
|
||
<span class="normal">42</span>
|
||
<span class="normal">43</span>
|
||
<span class="normal">44</span>
|
||
<span class="normal">45</span></pre></div></td><td class="code"><div><pre><span></span><code><span class="k">def</span> <span class="nf">generator</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
||
<span class="w"> </span><span class="sd">"""</span>
|
||
<span class="sd"> This function find all generators in the group G</span>
|
||
<span class="sd"> """</span>
|
||
|
||
<span class="n">index</span> <span class="o">=</span> <span class="mi">1</span>
|
||
<span class="n">G</span> <span class="o">=</span> <span class="nb">sorted</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_g</span><span class="p">)</span>
|
||
<span class="k">for</span> <span class="n">g</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">2</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">_n</span><span class="p">):</span>
|
||
<span class="n">z</span> <span class="o">=</span> <span class="nb">list</span><span class="p">()</span>
|
||
<span class="k">for</span> <span class="n">entry</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">_n</span><span class="p">):</span>
|
||
<span class="n">res</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_operation</span><span class="p">(</span><span class="n">g</span><span class="p">,</span> <span class="n">index</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">_n</span><span class="p">)</span>
|
||
<span class="k">if</span> <span class="n">res</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">z</span><span class="p">:</span>
|
||
<span class="n">z</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">res</span><span class="p">)</span>
|
||
<span class="n">index</span> <span class="o">=</span> <span class="n">index</span> <span class="o">+</span> <span class="mi">1</span>
|
||
|
||
<span class="c1"># We check if that match with G</span>
|
||
<span class="c1"># If yes, we find a generator</span>
|
||
<span class="k">if</span> <span class="nb">sorted</span><span class="p">(</span><span class="n">z</span><span class="p">)</span> <span class="o">==</span> <span class="n">G</span><span class="p">:</span>
|
||
<span class="bp">self</span><span class="o">.</span><span class="n">_generators</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">g</span><span class="p">)</span>
|
||
<span class="bp">self</span><span class="o">.</span><span class="n">_generatorChecked</span> <span class="o">=</span> <span class="kc">True</span>
|
||
</code></pre></div></td></tr></table></div>
|
||
</details>
|
||
</div>
|
||
|
||
</div>
|
||
|
||
<div class="doc doc-object doc-function">
|
||
|
||
|
||
<h3 id="Cryptotools.Groups.cyclic.Cyclic.getGenerators" class="doc doc-heading">
|
||
<code class="highlight language-python"><span class="n">getGenerators</span><span class="p">()</span></code>
|
||
|
||
</h3>
|
||
|
||
|
||
<div class="doc doc-contents ">
|
||
|
||
<p>This function return all generators of that group</p>
|
||
|
||
|
||
<table class="field-list">
|
||
<colgroup>
|
||
<col class="field-name" />
|
||
<col class="field-body" />
|
||
</colgroup>
|
||
<tbody valign="top">
|
||
<tr class="field">
|
||
<th class="field-name">Returns:</th>
|
||
<td class="field-body">
|
||
<ul class="first simple">
|
||
<li>
|
||
<code><span title="list">list</span></code>
|
||
–
|
||
<div class="doc-md-description">
|
||
<p>Return the list of generators found. The function generators() must be called before to call this function</p>
|
||
</div>
|
||
</li>
|
||
</ul>
|
||
</td>
|
||
</tr>
|
||
</tbody>
|
||
</table>
|
||
|
||
<details class="quote">
|
||
<summary>Source code in <code>Cryptotools/Groups/cyclic.py</code></summary>
|
||
<div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal">70</span>
|
||
<span class="normal">71</span>
|
||
<span class="normal">72</span>
|
||
<span class="normal">73</span>
|
||
<span class="normal">74</span>
|
||
<span class="normal">75</span>
|
||
<span class="normal">76</span>
|
||
<span class="normal">77</span>
|
||
<span class="normal">78</span>
|
||
<span class="normal">79</span>
|
||
<span class="normal">80</span></pre></div></td><td class="code"><div><pre><span></span><code><span class="k">def</span> <span class="nf">getGenerators</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span> <span class="o">-></span> <span class="nb">list</span><span class="p">:</span>
|
||
<span class="w"> </span><span class="sd">"""</span>
|
||
<span class="sd"> This function return all generators of that group</span>
|
||
|
||
<span class="sd"> Returns:</span>
|
||
<span class="sd"> Return the list of generators found. The function generators() must be called before to call this function</span>
|
||
<span class="sd"> """</span>
|
||
<span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">_generatorChecked</span><span class="p">:</span>
|
||
<span class="bp">self</span><span class="o">.</span><span class="n">generator</span><span class="p">()</span>
|
||
<span class="bp">self</span><span class="o">.</span><span class="n">_generatorChecked</span> <span class="o">=</span> <span class="kc">True</span>
|
||
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_generators</span>
|
||
</code></pre></div></td></tr></table></div>
|
||
</details>
|
||
</div>
|
||
|
||
</div>
|
||
|
||
<div class="doc doc-object doc-function">
|
||
|
||
|
||
<h3 id="Cryptotools.Groups.cyclic.Cyclic.getPrimitiveRoot" class="doc doc-heading">
|
||
<code class="highlight language-python"><span class="n">getPrimitiveRoot</span><span class="p">()</span></code>
|
||
|
||
</h3>
|
||
|
||
|
||
<div class="doc doc-contents ">
|
||
|
||
<p>This function return the primitive root modulo of n</p>
|
||
|
||
|
||
<table class="field-list">
|
||
<colgroup>
|
||
<col class="field-name" />
|
||
<col class="field-body" />
|
||
</colgroup>
|
||
<tbody valign="top">
|
||
<tr class="field">
|
||
<th class="field-name">Returns:</th>
|
||
<td class="field-body">
|
||
<ul class="first simple">
|
||
<li>
|
||
–
|
||
<div class="doc-md-description">
|
||
<p>Return the primitive root of the group. None if no primitive has been found</p>
|
||
</div>
|
||
</li>
|
||
</ul>
|
||
</td>
|
||
</tr>
|
||
</tbody>
|
||
</table>
|
||
|
||
<details class="quote">
|
||
<summary>Source code in <code>Cryptotools/Groups/cyclic.py</code></summary>
|
||
<div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal">47</span>
|
||
<span class="normal">48</span>
|
||
<span class="normal">49</span>
|
||
<span class="normal">50</span>
|
||
<span class="normal">51</span>
|
||
<span class="normal">52</span>
|
||
<span class="normal">53</span>
|
||
<span class="normal">54</span>
|
||
<span class="normal">55</span>
|
||
<span class="normal">56</span>
|
||
<span class="normal">57</span>
|
||
<span class="normal">58</span>
|
||
<span class="normal">59</span>
|
||
<span class="normal">60</span>
|
||
<span class="normal">61</span>
|
||
<span class="normal">62</span>
|
||
<span class="normal">63</span>
|
||
<span class="normal">64</span>
|
||
<span class="normal">65</span>
|
||
<span class="normal">66</span>
|
||
<span class="normal">67</span>
|
||
<span class="normal">68</span></pre></div></td><td class="code"><div><pre><span></span><code><span class="k">def</span> <span class="nf">getPrimitiveRoot</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
||
<span class="w"> </span><span class="sd">"""</span>
|
||
<span class="sd"> This function return the primitive root modulo of n</span>
|
||
|
||
<span class="sd"> Returns:</span>
|
||
<span class="sd"> Return the primitive root of the group. None if no primitive has been found</span>
|
||
<span class="sd"> """</span>
|
||
|
||
<span class="n">index</span> <span class="o">=</span> <span class="mi">1</span>
|
||
<span class="n">G</span> <span class="o">=</span> <span class="nb">sorted</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_g</span><span class="p">)</span>
|
||
<span class="k">for</span> <span class="n">g</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">2</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">_n</span><span class="p">):</span>
|
||
<span class="n">z</span> <span class="o">=</span> <span class="nb">list</span><span class="p">()</span>
|
||
<span class="k">for</span> <span class="n">entry</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">_n</span><span class="p">):</span>
|
||
<span class="n">res</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_operation</span><span class="p">(</span><span class="n">g</span><span class="p">,</span> <span class="n">index</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">_n</span><span class="p">)</span>
|
||
<span class="k">if</span> <span class="n">res</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">z</span><span class="p">:</span>
|
||
<span class="n">z</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">res</span><span class="p">)</span>
|
||
<span class="n">index</span> <span class="o">+=</span> <span class="mi">1</span>
|
||
|
||
<span class="c1"># If the group is the same has G, we found a generator</span>
|
||
<span class="k">if</span> <span class="nb">sorted</span><span class="p">(</span><span class="n">z</span><span class="p">)</span> <span class="o">==</span> <span class="n">G</span><span class="p">:</span>
|
||
<span class="k">return</span> <span class="n">g</span>
|
||
<span class="k">return</span> <span class="kc">None</span>
|
||
</code></pre></div></td></tr></table></div>
|
||
</details>
|
||
</div>
|
||
|
||
</div>
|
||
|
||
<div class="doc doc-object doc-function">
|
||
|
||
|
||
<h3 id="Cryptotools.Groups.cyclic.Cyclic.isCyclic" class="doc doc-heading">
|
||
<code class="highlight language-python"><span class="n">isCyclic</span><span class="p">()</span></code>
|
||
|
||
</h3>
|
||
|
||
|
||
<div class="doc doc-contents ">
|
||
|
||
<p>Check if the group is a cyclic group, means we have at least one generator</p>
|
||
|
||
|
||
<table class="field-list">
|
||
<colgroup>
|
||
<col class="field-name" />
|
||
<col class="field-body" />
|
||
</colgroup>
|
||
<tbody valign="top">
|
||
<tr class="field">
|
||
<th class="field-name">Returns:</th>
|
||
<td class="field-body">
|
||
<ul class="first simple">
|
||
<li>
|
||
<code><span title="bool">bool</span></code>
|
||
–
|
||
<div class="doc-md-description">
|
||
<p>REturn a boolean, False if the group is not Cyclic otherwise return True</p>
|
||
</div>
|
||
</li>
|
||
</ul>
|
||
</td>
|
||
</tr>
|
||
</tbody>
|
||
</table>
|
||
|
||
<details class="quote">
|
||
<summary>Source code in <code>Cryptotools/Groups/cyclic.py</code></summary>
|
||
<div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal">82</span>
|
||
<span class="normal">83</span>
|
||
<span class="normal">84</span>
|
||
<span class="normal">85</span>
|
||
<span class="normal">86</span>
|
||
<span class="normal">87</span>
|
||
<span class="normal">88</span>
|
||
<span class="normal">89</span>
|
||
<span class="normal">90</span>
|
||
<span class="normal">91</span></pre></div></td><td class="code"><div><pre><span></span><code><span class="k">def</span> <span class="nf">isCyclic</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span> <span class="o">-></span> <span class="nb">bool</span><span class="p">:</span>
|
||
<span class="w"> </span><span class="sd">"""</span>
|
||
<span class="sd"> Check if the group is a cyclic group, means we have at least one generator</span>
|
||
|
||
<span class="sd"> Returns:</span>
|
||
<span class="sd"> REturn a boolean, False if the group is not Cyclic otherwise return True</span>
|
||
<span class="sd"> """</span>
|
||
<span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">getGenerators</span><span class="p">())</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
|
||
<span class="k">return</span> <span class="kc">False</span>
|
||
<span class="k">return</span> <span class="kc">True</span>
|
||
</code></pre></div></td></tr></table></div>
|
||
</details>
|
||
</div>
|
||
|
||
</div>
|
||
|
||
|
||
|
||
</div>
|
||
|
||
</div>
|
||
|
||
</div>
|
||
|
||
|
||
|
||
|
||
</div>
|
||
|
||
</div>
|
||
|
||
</div><h2 id="galois-field-finite-field">Galois Field (Finite Field)</h2>
|
||
|
||
|
||
<div class="doc doc-object doc-module">
|
||
|
||
|
||
|
||
<a id="Cryptotools.Groups.galois"></a>
|
||
<div class="doc doc-contents first">
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
<div class="doc doc-children">
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
<div class="doc doc-object doc-class">
|
||
|
||
|
||
|
||
<h2 id="Cryptotools.Groups.galois.Galois" class="doc doc-heading">
|
||
<code>Galois</code>
|
||
|
||
|
||
</h2>
|
||
|
||
|
||
<div class="doc doc-contents ">
|
||
|
||
|
||
<p>This class contain the Galois Field (Finite Field)</p>
|
||
|
||
|
||
<table class="field-list">
|
||
<colgroup>
|
||
<col class="field-name" />
|
||
<col class="field-body" />
|
||
</colgroup>
|
||
<tbody valign="top">
|
||
<tr class="field">
|
||
<th class="field-name">Attributes:</th>
|
||
<td class="field-body">
|
||
<ul class="first simple">
|
||
<li>
|
||
<b><code>q</code></b>
|
||
(<code><span title="Integer">Integer</span></code>)
|
||
–
|
||
<div class="doc-md-description">
|
||
<p>it's the number of the GF</p>
|
||
</div>
|
||
</li>
|
||
<li>
|
||
<b><code>operation</code></b>
|
||
(<code><span title="Function">Function</span></code>)
|
||
–
|
||
<div class="doc-md-description">
|
||
<p>Function for generating the group</p>
|
||
</div>
|
||
</li>
|
||
<li>
|
||
<b><code>identityAdd</code></b>
|
||
(<code><span title="Integer">Integer</span></code>)
|
||
–
|
||
<div class="doc-md-description">
|
||
<p>it's the identity element in the GF(n) for the addition operation</p>
|
||
</div>
|
||
</li>
|
||
<li>
|
||
<b><code>identityMul</code></b>
|
||
(<code><span title="Integer">Integer</span></code>)
|
||
–
|
||
<div class="doc-md-description">
|
||
<p>it's the identity element in the GF(n) for the multiplicative operation</p>
|
||
</div>
|
||
</li>
|
||
</ul>
|
||
</td>
|
||
</tr>
|
||
</tbody>
|
||
</table>
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
<details class="quote">
|
||
<summary>Source code in <code>Cryptotools/Groups/galois.py</code></summary>
|
||
<div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"> 6</span>
|
||
<span class="normal"> 7</span>
|
||
<span class="normal"> 8</span>
|
||
<span class="normal"> 9</span>
|
||
<span class="normal"> 10</span>
|
||
<span class="normal"> 11</span>
|
||
<span class="normal"> 12</span>
|
||
<span class="normal"> 13</span>
|
||
<span class="normal"> 14</span>
|
||
<span class="normal"> 15</span>
|
||
<span class="normal"> 16</span>
|
||
<span class="normal"> 17</span>
|
||
<span class="normal"> 18</span>
|
||
<span class="normal"> 19</span>
|
||
<span class="normal"> 20</span>
|
||
<span class="normal"> 21</span>
|
||
<span class="normal"> 22</span>
|
||
<span class="normal"> 23</span>
|
||
<span class="normal"> 24</span>
|
||
<span class="normal"> 25</span>
|
||
<span class="normal"> 26</span>
|
||
<span class="normal"> 27</span>
|
||
<span class="normal"> 28</span>
|
||
<span class="normal"> 29</span>
|
||
<span class="normal"> 30</span>
|
||
<span class="normal"> 31</span>
|
||
<span class="normal"> 32</span>
|
||
<span class="normal"> 33</span>
|
||
<span class="normal"> 34</span>
|
||
<span class="normal"> 35</span>
|
||
<span class="normal"> 36</span>
|
||
<span class="normal"> 37</span>
|
||
<span class="normal"> 38</span>
|
||
<span class="normal"> 39</span>
|
||
<span class="normal"> 40</span>
|
||
<span class="normal"> 41</span>
|
||
<span class="normal"> 42</span>
|
||
<span class="normal"> 43</span>
|
||
<span class="normal"> 44</span>
|
||
<span class="normal"> 45</span>
|
||
<span class="normal"> 46</span>
|
||
<span class="normal"> 47</span>
|
||
<span class="normal"> 48</span>
|
||
<span class="normal"> 49</span>
|
||
<span class="normal"> 50</span>
|
||
<span class="normal"> 51</span>
|
||
<span class="normal"> 52</span>
|
||
<span class="normal"> 53</span>
|
||
<span class="normal"> 54</span>
|
||
<span class="normal"> 55</span>
|
||
<span class="normal"> 56</span>
|
||
<span class="normal"> 57</span>
|
||
<span class="normal"> 58</span>
|
||
<span class="normal"> 59</span>
|
||
<span class="normal"> 60</span>
|
||
<span class="normal"> 61</span>
|
||
<span class="normal"> 62</span>
|
||
<span class="normal"> 63</span>
|
||
<span class="normal"> 64</span>
|
||
<span class="normal"> 65</span>
|
||
<span class="normal"> 66</span>
|
||
<span class="normal"> 67</span>
|
||
<span class="normal"> 68</span>
|
||
<span class="normal"> 69</span>
|
||
<span class="normal"> 70</span>
|
||
<span class="normal"> 71</span>
|
||
<span class="normal"> 72</span>
|
||
<span class="normal"> 73</span>
|
||
<span class="normal"> 74</span>
|
||
<span class="normal"> 75</span>
|
||
<span class="normal"> 76</span>
|
||
<span class="normal"> 77</span>
|
||
<span class="normal"> 78</span>
|
||
<span class="normal"> 79</span>
|
||
<span class="normal"> 80</span>
|
||
<span class="normal"> 81</span>
|
||
<span class="normal"> 82</span>
|
||
<span class="normal"> 83</span>
|
||
<span class="normal"> 84</span>
|
||
<span class="normal"> 85</span>
|
||
<span class="normal"> 86</span>
|
||
<span class="normal"> 87</span>
|
||
<span class="normal"> 88</span>
|
||
<span class="normal"> 89</span>
|
||
<span class="normal"> 90</span>
|
||
<span class="normal"> 91</span>
|
||
<span class="normal"> 92</span>
|
||
<span class="normal"> 93</span>
|
||
<span class="normal"> 94</span>
|
||
<span class="normal"> 95</span>
|
||
<span class="normal"> 96</span>
|
||
<span class="normal"> 97</span>
|
||
<span class="normal"> 98</span>
|
||
<span class="normal"> 99</span>
|
||
<span class="normal">100</span>
|
||
<span class="normal">101</span>
|
||
<span class="normal">102</span>
|
||
<span class="normal">103</span>
|
||
<span class="normal">104</span>
|
||
<span class="normal">105</span>
|
||
<span class="normal">106</span>
|
||
<span class="normal">107</span>
|
||
<span class="normal">108</span>
|
||
<span class="normal">109</span>
|
||
<span class="normal">110</span>
|
||
<span class="normal">111</span>
|
||
<span class="normal">112</span>
|
||
<span class="normal">113</span>
|
||
<span class="normal">114</span>
|
||
<span class="normal">115</span>
|
||
<span class="normal">116</span>
|
||
<span class="normal">117</span>
|
||
<span class="normal">118</span>
|
||
<span class="normal">119</span>
|
||
<span class="normal">120</span>
|
||
<span class="normal">121</span>
|
||
<span class="normal">122</span>
|
||
<span class="normal">123</span>
|
||
<span class="normal">124</span>
|
||
<span class="normal">125</span>
|
||
<span class="normal">126</span>
|
||
<span class="normal">127</span>
|
||
<span class="normal">128</span>
|
||
<span class="normal">129</span>
|
||
<span class="normal">130</span>
|
||
<span class="normal">131</span>
|
||
<span class="normal">132</span>
|
||
<span class="normal">133</span>
|
||
<span class="normal">134</span>
|
||
<span class="normal">135</span>
|
||
<span class="normal">136</span>
|
||
<span class="normal">137</span>
|
||
<span class="normal">138</span>
|
||
<span class="normal">139</span>
|
||
<span class="normal">140</span>
|
||
<span class="normal">141</span>
|
||
<span class="normal">142</span>
|
||
<span class="normal">143</span>
|
||
<span class="normal">144</span>
|
||
<span class="normal">145</span>
|
||
<span class="normal">146</span>
|
||
<span class="normal">147</span>
|
||
<span class="normal">148</span>
|
||
<span class="normal">149</span>
|
||
<span class="normal">150</span>
|
||
<span class="normal">151</span>
|
||
<span class="normal">152</span>
|
||
<span class="normal">153</span>
|
||
<span class="normal">154</span>
|
||
<span class="normal">155</span>
|
||
<span class="normal">156</span>
|
||
<span class="normal">157</span>
|
||
<span class="normal">158</span>
|
||
<span class="normal">159</span>
|
||
<span class="normal">160</span>
|
||
<span class="normal">161</span>
|
||
<span class="normal">162</span>
|
||
<span class="normal">163</span>
|
||
<span class="normal">164</span>
|
||
<span class="normal">165</span>
|
||
<span class="normal">166</span>
|
||
<span class="normal">167</span>
|
||
<span class="normal">168</span>
|
||
<span class="normal">169</span>
|
||
<span class="normal">170</span>
|
||
<span class="normal">171</span>
|
||
<span class="normal">172</span>
|
||
<span class="normal">173</span>
|
||
<span class="normal">174</span>
|
||
<span class="normal">175</span>
|
||
<span class="normal">176</span>
|
||
<span class="normal">177</span>
|
||
<span class="normal">178</span>
|
||
<span class="normal">179</span>
|
||
<span class="normal">180</span>
|
||
<span class="normal">181</span>
|
||
<span class="normal">182</span>
|
||
<span class="normal">183</span>
|
||
<span class="normal">184</span>
|
||
<span class="normal">185</span>
|
||
<span class="normal">186</span>
|
||
<span class="normal">187</span>
|
||
<span class="normal">188</span>
|
||
<span class="normal">189</span>
|
||
<span class="normal">190</span>
|
||
<span class="normal">191</span>
|
||
<span class="normal">192</span>
|
||
<span class="normal">193</span>
|
||
<span class="normal">194</span>
|
||
<span class="normal">195</span>
|
||
<span class="normal">196</span>
|
||
<span class="normal">197</span>
|
||
<span class="normal">198</span>
|
||
<span class="normal">199</span>
|
||
<span class="normal">200</span>
|
||
<span class="normal">201</span>
|
||
<span class="normal">202</span>
|
||
<span class="normal">203</span>
|
||
<span class="normal">204</span>
|
||
<span class="normal">205</span>
|
||
<span class="normal">206</span>
|
||
<span class="normal">207</span>
|
||
<span class="normal">208</span>
|
||
<span class="normal">209</span>
|
||
<span class="normal">210</span>
|
||
<span class="normal">211</span>
|
||
<span class="normal">212</span>
|
||
<span class="normal">213</span>
|
||
<span class="normal">214</span>
|
||
<span class="normal">215</span>
|
||
<span class="normal">216</span>
|
||
<span class="normal">217</span>
|
||
<span class="normal">218</span>
|
||
<span class="normal">219</span>
|
||
<span class="normal">220</span>
|
||
<span class="normal">221</span>
|
||
<span class="normal">222</span>
|
||
<span class="normal">223</span>
|
||
<span class="normal">224</span>
|
||
<span class="normal">225</span>
|
||
<span class="normal">226</span>
|
||
<span class="normal">227</span></pre></div></td><td class="code"><div><pre><span></span><code><span class="k">class</span> <span class="nc">Galois</span><span class="p">:</span>
|
||
<span class="w"> </span><span class="sd">"""</span>
|
||
<span class="sd"> This class contain the Galois Field (Finite Field)</span>
|
||
|
||
|
||
|
||
<span class="sd"> Attributes:</span>
|
||
<span class="sd"> q (Integer): it's the number of the GF</span>
|
||
<span class="sd"> operation (Function): Function for generating the group</span>
|
||
<span class="sd"> identityAdd (Integer): it's the identity element in the GF(n) for the addition operation</span>
|
||
<span class="sd"> identityMul (Integer): it's the identity element in the GF(n) for the multiplicative operation</span>
|
||
<span class="sd"> """</span>
|
||
<span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">q</span><span class="p">,</span> <span class="n">operation</span><span class="p">):</span>
|
||
<span class="bp">self</span><span class="o">.</span><span class="n">_q</span> <span class="o">=</span> <span class="n">q</span>
|
||
<span class="bp">self</span><span class="o">.</span><span class="n">_operation</span> <span class="o">=</span> <span class="n">operation</span>
|
||
<span class="bp">self</span><span class="o">.</span><span class="n">_identityAdd</span> <span class="o">=</span> <span class="mi">0</span>
|
||
<span class="bp">self</span><span class="o">.</span><span class="n">_identityMul</span> <span class="o">=</span> <span class="mi">1</span>
|
||
<span class="bp">self</span><span class="o">.</span><span class="n">_F</span> <span class="o">=</span> <span class="p">[</span><span class="n">x</span> <span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">q</span><span class="p">)]</span>
|
||
<span class="bp">self</span><span class="o">.</span><span class="n">_add</span> <span class="o">=</span> <span class="p">[[</span><span class="mi">0</span> <span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">q</span><span class="p">)]</span> <span class="k">for</span> <span class="n">y</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">q</span><span class="p">)]</span>
|
||
|
||
<span class="c1"># TODO: May do we do a deep copy between all groups ?</span>
|
||
<span class="bp">self</span><span class="o">.</span><span class="n">_div</span> <span class="o">=</span> <span class="p">[[</span><span class="mi">0</span> <span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">q</span><span class="p">)]</span> <span class="k">for</span> <span class="n">y</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">q</span><span class="p">)]</span>
|
||
<span class="bp">self</span><span class="o">.</span><span class="n">_mul</span> <span class="o">=</span> <span class="p">[[</span><span class="mi">0</span> <span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">q</span><span class="p">)]</span> <span class="k">for</span> <span class="n">y</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">q</span><span class="p">)]</span>
|
||
<span class="bp">self</span><span class="o">.</span><span class="n">_sub</span> <span class="o">=</span> <span class="p">[[</span><span class="mi">0</span> <span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">q</span><span class="p">)]</span> <span class="k">for</span> <span class="n">y</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">q</span><span class="p">)]</span>
|
||
<span class="bp">self</span><span class="o">.</span><span class="n">_primitiveRoot</span> <span class="o">=</span> <span class="nb">list</span><span class="p">()</span>
|
||
|
||
<span class="k">def</span> <span class="nf">primitiveRoot</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
||
<span class="w"> </span><span class="sd">"""</span>
|
||
<span class="sd"> In this function, we going to find the primitive root modulo n of the galois field</span>
|
||
|
||
<span class="sd"> Returns:</span>
|
||
<span class="sd"> Return the list of primitive root of the GF(q) </span>
|
||
<span class="sd"> """</span>
|
||
<span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">2</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">_q</span><span class="p">):</span>
|
||
<span class="n">z</span> <span class="o">=</span> <span class="nb">list</span><span class="p">()</span>
|
||
<span class="k">for</span> <span class="n">entry</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">_q</span><span class="p">):</span>
|
||
<span class="n">res</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_operation</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="n">entry</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">_q</span><span class="p">)</span>
|
||
<span class="k">if</span> <span class="n">res</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">z</span><span class="p">:</span>
|
||
<span class="n">z</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">res</span><span class="p">)</span>
|
||
|
||
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">isPrimitiveRoot</span><span class="p">(</span><span class="n">z</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">_q</span> <span class="o">-</span> <span class="mi">1</span><span class="p">):</span>
|
||
<span class="k">if</span> <span class="n">x</span> <span class="ow">not</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">_primitiveRoot</span><span class="p">:</span> <span class="c1"># It's dirty, need to find why we have duplicate entry</span>
|
||
<span class="bp">self</span><span class="o">.</span><span class="n">_primitiveRoot</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">x</span><span class="p">)</span>
|
||
<span class="k">return</span> <span class="n">z</span>
|
||
|
||
<span class="k">def</span> <span class="nf">getPrimitiveRoot</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
||
<span class="w"> </span><span class="sd">"""</span>
|
||
<span class="sd"> Return the list of primitives root</span>
|
||
|
||
<span class="sd"> Returns:</span>
|
||
<span class="sd"> Return the primitive root</span>
|
||
<span class="sd"> """</span>
|
||
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_primitiveRoot</span>
|
||
|
||
<span class="k">def</span> <span class="nf">isPrimitiveRoot</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">z</span><span class="p">,</span> <span class="n">length</span><span class="p">):</span>
|
||
<span class="w"> </span><span class="sd">"""</span>
|
||
<span class="sd"> Check if z is a primitive root </span>
|
||
|
||
<span class="sd"> Args:</span>
|
||
<span class="sd"> z (list): check if z is a primitive root</span>
|
||
<span class="sd"> length (Integer): Length of the GF(q)</span>
|
||
<span class="sd"> """</span>
|
||
<span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">z</span><span class="p">)</span> <span class="o">==</span> <span class="n">length</span><span class="p">:</span>
|
||
<span class="k">return</span> <span class="kc">True</span>
|
||
<span class="k">return</span> <span class="kc">False</span>
|
||
|
||
<span class="k">def</span> <span class="nf">add</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
||
<span class="w"> </span><span class="sd">"""</span>
|
||
<span class="sd"> This function do the operation + on the Galois Field</span>
|
||
|
||
<span class="sd"> Returns:</span>
|
||
<span class="sd"> Return a list of the group with the addition operation</span>
|
||
<span class="sd"> """</span>
|
||
<span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">_q</span><span class="p">):</span>
|
||
<span class="k">for</span> <span class="n">y</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">_q</span><span class="p">):</span>
|
||
<span class="bp">self</span><span class="o">.</span><span class="n">_add</span><span class="p">[</span><span class="n">x</span><span class="p">][</span><span class="n">y</span><span class="p">]</span> <span class="o">=</span> <span class="p">(</span><span class="n">x</span> <span class="o">+</span> <span class="n">y</span><span class="p">)</span> <span class="o">%</span> <span class="bp">self</span><span class="o">.</span><span class="n">_q</span>
|
||
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_add</span>
|
||
|
||
<span class="k">def</span> <span class="nf">_inverseModular</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">a</span><span class="p">,</span> <span class="n">n</span><span class="p">):</span>
|
||
<span class="w"> </span><span class="sd">"""</span>
|
||
<span class="sd"> This function find the reverse modular of a by n</span>
|
||
|
||
<span class="sd"> Returns:</span>
|
||
<span class="sd"> Return the reverse modular</span>
|
||
<span class="sd"> """</span>
|
||
<span class="k">for</span> <span class="n">b</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="n">n</span><span class="p">):</span>
|
||
<span class="k">if</span> <span class="p">(</span><span class="n">a</span> <span class="o">*</span> <span class="n">b</span><span class="p">)</span> <span class="o">%</span> <span class="n">n</span> <span class="o">==</span> <span class="mi">1</span><span class="p">:</span>
|
||
<span class="n">inv</span> <span class="o">=</span> <span class="n">b</span>
|
||
<span class="k">break</span>
|
||
<span class="k">return</span> <span class="n">inv</span>
|
||
|
||
<span class="k">def</span> <span class="nf">div</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
||
<span class="w"> </span><span class="sd">"""</span>
|
||
<span class="sd"> This function do the operation / on the Galois Field</span>
|
||
|
||
<span class="sd"> Returns:</span>
|
||
<span class="sd"> Return a list of the group with the division operation</span>
|
||
<span class="sd"> """</span>
|
||
<span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">_q</span><span class="p">):</span>
|
||
<span class="k">for</span> <span class="n">y</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">_q</span><span class="p">):</span>
|
||
<span class="n">inv</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_inverseModular</span><span class="p">(</span><span class="n">y</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">_q</span><span class="p">)</span>
|
||
|
||
<span class="bp">self</span><span class="o">.</span><span class="n">_div</span><span class="p">[</span><span class="n">x</span><span class="p">][</span><span class="n">y</span><span class="p">]</span> <span class="o">=</span> <span class="p">(</span><span class="n">x</span> <span class="o">*</span> <span class="n">inv</span><span class="p">)</span> <span class="o">%</span> <span class="bp">self</span><span class="o">.</span><span class="n">_q</span>
|
||
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_div</span>
|
||
|
||
<span class="k">def</span> <span class="nf">mul</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
||
<span class="w"> </span><span class="sd">"""</span>
|
||
<span class="sd"> This function do the operation * on the Galois Field</span>
|
||
|
||
<span class="sd"> Returns:</span>
|
||
<span class="sd"> Return a list of the group with the multiplication operation</span>
|
||
<span class="sd"> """</span>
|
||
<span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">_q</span><span class="p">):</span>
|
||
<span class="k">for</span> <span class="n">y</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">_q</span><span class="p">):</span>
|
||
<span class="bp">self</span><span class="o">.</span><span class="n">_mul</span><span class="p">[</span><span class="n">x</span><span class="p">][</span><span class="n">y</span><span class="p">]</span> <span class="o">=</span> <span class="p">(</span><span class="n">x</span> <span class="o">*</span> <span class="n">y</span><span class="p">)</span> <span class="o">%</span> <span class="bp">self</span><span class="o">.</span><span class="n">_q</span>
|
||
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_mul</span>
|
||
|
||
<span class="k">def</span> <span class="nf">sub</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
||
<span class="w"> </span><span class="sd">"""</span>
|
||
<span class="sd"> This function do the operation - on the Galois Field</span>
|
||
|
||
<span class="sd"> Returns:</span>
|
||
<span class="sd"> Return a list of the group with the subtraction operation</span>
|
||
<span class="sd"> """</span>
|
||
<span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">_q</span><span class="p">):</span>
|
||
<span class="k">for</span> <span class="n">y</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">_q</span><span class="p">):</span>
|
||
<span class="bp">self</span><span class="o">.</span><span class="n">_sub</span><span class="p">[</span><span class="n">x</span><span class="p">][</span><span class="n">y</span><span class="p">]</span> <span class="o">=</span> <span class="p">(</span><span class="n">x</span> <span class="o">-</span> <span class="n">y</span><span class="p">)</span> <span class="o">%</span> <span class="bp">self</span><span class="o">.</span><span class="n">_q</span>
|
||
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_sub</span>
|
||
|
||
<span class="k">def</span> <span class="nf">check_closure_law</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">arithmetic</span><span class="p">):</span>
|
||
<span class="w"> </span><span class="sd">"""</span>
|
||
<span class="sd"> This function check the closure law.</span>
|
||
<span class="sd"> By definition, every element in the GF is an abelian group, which respect the closure law: for a and b belongs to G, a + b belongs to G, the operation is a binary operation</span>
|
||
|
||
<span class="sd"> Args:</span>
|
||
<span class="sd"> Arithmetics (str): contain the operation to be made, must be '+', '*', '/' or /-'</span>
|
||
<span class="sd"> """</span>
|
||
<span class="k">if</span> <span class="n">arithmetic</span> <span class="ow">not</span> <span class="ow">in</span> <span class="p">[</span><span class="s1">'+'</span><span class="p">,</span> <span class="s1">'*'</span><span class="p">,</span> <span class="s1">'/'</span><span class="p">,</span> <span class="s1">'-'</span><span class="p">]:</span>
|
||
<span class="k">raise</span> <span class="ne">Exception</span><span class="p">(</span><span class="s2">"The arithmetic need to be '+', '*', '/' or '-'"</span><span class="p">)</span>
|
||
|
||
<span class="k">if</span> <span class="n">arithmetic</span> <span class="o">==</span> <span class="s1">'+'</span><span class="p">:</span>
|
||
<span class="n">G</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_add</span>
|
||
<span class="k">elif</span> <span class="n">arithmetic</span> <span class="o">==</span> <span class="s1">'*'</span><span class="p">:</span>
|
||
<span class="n">G</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_mul</span>
|
||
<span class="k">elif</span> <span class="n">arithmetic</span> <span class="o">==</span> <span class="s1">'/'</span><span class="p">:</span>
|
||
<span class="n">G</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_div</span>
|
||
<span class="k">else</span><span class="p">:</span>
|
||
<span class="n">G</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_sub</span>
|
||
|
||
<span class="n">start</span> <span class="o">=</span> <span class="mi">0</span>
|
||
<span class="w"> </span><span class="sd">"""</span>
|
||
<span class="sd"> In case of multiplicative, we bypass the first line, because all elements are zero, otherwise the test fail</span>
|
||
<span class="sd"> """</span>
|
||
<span class="k">if</span> <span class="n">arithmetic</span> <span class="o">==</span> <span class="s1">'*'</span> <span class="ow">or</span> <span class="n">arithmetic</span> <span class="o">==</span> <span class="s1">'/'</span><span class="p">:</span>
|
||
<span class="n">start</span> <span class="o">=</span> <span class="mi">1</span>
|
||
|
||
<span class="n">isClosure</span> <span class="o">=</span> <span class="kc">True</span>
|
||
<span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">start</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">_q</span><span class="p">):</span>
|
||
<span class="n">gr</span> <span class="o">=</span> <span class="n">Group</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_q</span><span class="p">,</span> <span class="n">G</span><span class="p">[</span><span class="n">x</span><span class="p">],</span> <span class="bp">self</span><span class="o">.</span><span class="n">_operation</span><span class="p">)</span>
|
||
<span class="k">if</span> <span class="ow">not</span> <span class="n">gr</span><span class="o">.</span><span class="n">closure</span><span class="p">():</span>
|
||
<span class="n">isClosure</span> <span class="o">=</span> <span class="kc">False</span>
|
||
<span class="k">del</span> <span class="n">gr</span>
|
||
|
||
<span class="k">if</span> <span class="n">isClosure</span><span class="p">:</span>
|
||
<span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">"The group </span><span class="si">{</span><span class="n">arithmetic</span><span class="si">}</span><span class="s2"> respect closure law"</span><span class="p">)</span>
|
||
<span class="k">else</span><span class="p">:</span>
|
||
<span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">"The group </span><span class="si">{</span><span class="n">arithmetic</span><span class="si">}</span><span class="s2"> does not respect closure law"</span><span class="p">)</span>
|
||
|
||
<span class="k">def</span> <span class="nf">check_identity_add</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
||
<span class="w"> </span><span class="sd">"""</span>
|
||
<span class="sd"> This function check the identity element and must satisfy this condition: $a + 0 = a$ for each element in the GF(n)</span>
|
||
<span class="sd"> In Group Theory, an identity element is an element in the group which do not change the value every element in the group</span>
|
||
|
||
<span class="sd"> Returns:</span>
|
||
|
||
<span class="sd"> """</span>
|
||
<span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">_F</span><span class="p">:</span>
|
||
<span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">_identityAdd</span> <span class="o">+</span> <span class="n">x</span> <span class="o">==</span> <span class="n">x</span><span class="p">:</span>
|
||
<span class="k">raise</span> <span class="ne">Exception</span><span class="p">(</span>
|
||
<span class="sa">f</span><span class="s2">"The identity element </span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">_identityAdd</span><span class="si">}</span><span class="s2"> "</span>\
|
||
<span class="s2">"do not satisfy $a + element = a$"</span>
|
||
<span class="p">)</span>
|
||
|
||
<span class="k">def</span> <span class="nf">check_identity_mul</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
||
<span class="w"> </span><span class="sd">"""</span>
|
||
<span class="sd"> This function check the identity element and must satisfy this condition: $a * 1 = a$ for each element in the GF(n)</span>
|
||
<span class="sd"> In Group Theory, an identity element is an element in the group which do not change the value every element in the group</span>
|
||
|
||
<span class="sd"> Returns:</span>
|
||
|
||
<span class="sd"> """</span>
|
||
<span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">_F</span><span class="p">:</span>
|
||
<span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">_identityMul</span> <span class="o">*</span> <span class="n">x</span> <span class="o">==</span> <span class="n">x</span><span class="p">:</span>
|
||
<span class="k">raise</span> <span class="ne">Exception</span><span class="p">(</span>
|
||
<span class="sa">f</span><span class="s2">"The identity element </span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">_identityAdd</span><span class="si">}</span><span class="s2"> "</span>\
|
||
<span class="s2">"do not satisfy $a * element = a$"</span>
|
||
<span class="p">)</span>
|
||
|
||
<span class="k">def</span> <span class="nf">printMatrice</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">m</span><span class="p">):</span>
|
||
<span class="w"> </span><span class="sd">"""</span>
|
||
<span class="sd"> This function print the GF(m)</span>
|
||
|
||
<span class="sd"> Args:</span>
|
||
<span class="sd"> m (list): Matrix of the GF</span>
|
||
<span class="sd"> """</span>
|
||
<span class="n">header</span> <span class="o">=</span> <span class="nb">str</span><span class="p">()</span>
|
||
<span class="n">header</span> <span class="o">=</span> <span class="s2">" "</span>
|
||
<span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">_q</span><span class="p">):</span>
|
||
<span class="n">header</span> <span class="o">+=</span> <span class="sa">f</span><span class="s2">"</span><span class="si">{</span><span class="n">x</span><span class="si">}</span><span class="s2"> "</span>
|
||
|
||
<span class="n">header</span> <span class="o">+=</span> <span class="s2">"</span><span class="se">\n</span><span class="s2">--|"</span> <span class="o">+</span> <span class="s2">"-"</span> <span class="o">*</span> <span class="p">(</span><span class="nb">len</span><span class="p">(</span><span class="n">header</span><span class="p">)</span><span class="o">-</span> <span class="mi">3</span><span class="p">)</span> <span class="o">+</span><span class="s2">"</span><span class="se">\n</span><span class="s2">"</span>
|
||
|
||
<span class="n">s</span> <span class="o">=</span> <span class="nb">str</span><span class="p">()</span>
|
||
|
||
<span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">_q</span><span class="p">):</span>
|
||
<span class="n">s</span> <span class="o">+=</span> <span class="sa">f</span><span class="s2">"</span><span class="si">{</span><span class="n">x</span><span class="si">}</span><span class="s2"> | "</span>
|
||
<span class="k">for</span> <span class="n">y</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">_q</span><span class="p">):</span>
|
||
<span class="n">s</span> <span class="o">+=</span> <span class="sa">f</span><span class="s2">"</span><span class="si">{</span><span class="n">m</span><span class="p">[</span><span class="n">x</span><span class="p">][</span><span class="n">y</span><span class="p">]</span><span class="si">}</span><span class="s2"> "</span>
|
||
<span class="n">s</span> <span class="o">+=</span> <span class="s2">"</span><span class="se">\n</span><span class="s2">"</span>
|
||
|
||
<span class="n">s</span> <span class="o">=</span> <span class="n">header</span> <span class="o">+</span> <span class="n">s</span>
|
||
<span class="nb">print</span><span class="p">(</span><span class="n">s</span><span class="p">)</span>
|
||
</code></pre></div></td></tr></table></div>
|
||
</details>
|
||
|
||
|
||
|
||
<div class="doc doc-children">
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
<div class="doc doc-object doc-function">
|
||
|
||
|
||
<h3 id="Cryptotools.Groups.galois.Galois.add" class="doc doc-heading">
|
||
<code class="highlight language-python"><span class="n">add</span><span class="p">()</span></code>
|
||
|
||
</h3>
|
||
|
||
|
||
<div class="doc doc-contents ">
|
||
|
||
<p>This function do the operation + on the Galois Field</p>
|
||
|
||
|
||
<table class="field-list">
|
||
<colgroup>
|
||
<col class="field-name" />
|
||
<col class="field-body" />
|
||
</colgroup>
|
||
<tbody valign="top">
|
||
<tr class="field">
|
||
<th class="field-name">Returns:</th>
|
||
<td class="field-body">
|
||
<ul class="first simple">
|
||
<li>
|
||
–
|
||
<div class="doc-md-description">
|
||
<p>Return a list of the group with the addition operation</p>
|
||
</div>
|
||
</li>
|
||
</ul>
|
||
</td>
|
||
</tr>
|
||
</tbody>
|
||
</table>
|
||
|
||
<details class="quote">
|
||
<summary>Source code in <code>Cryptotools/Groups/galois.py</code></summary>
|
||
<div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal">72</span>
|
||
<span class="normal">73</span>
|
||
<span class="normal">74</span>
|
||
<span class="normal">75</span>
|
||
<span class="normal">76</span>
|
||
<span class="normal">77</span>
|
||
<span class="normal">78</span>
|
||
<span class="normal">79</span>
|
||
<span class="normal">80</span>
|
||
<span class="normal">81</span>
|
||
<span class="normal">82</span></pre></div></td><td class="code"><div><pre><span></span><code><span class="k">def</span> <span class="nf">add</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
||
<span class="w"> </span><span class="sd">"""</span>
|
||
<span class="sd"> This function do the operation + on the Galois Field</span>
|
||
|
||
<span class="sd"> Returns:</span>
|
||
<span class="sd"> Return a list of the group with the addition operation</span>
|
||
<span class="sd"> """</span>
|
||
<span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">_q</span><span class="p">):</span>
|
||
<span class="k">for</span> <span class="n">y</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">_q</span><span class="p">):</span>
|
||
<span class="bp">self</span><span class="o">.</span><span class="n">_add</span><span class="p">[</span><span class="n">x</span><span class="p">][</span><span class="n">y</span><span class="p">]</span> <span class="o">=</span> <span class="p">(</span><span class="n">x</span> <span class="o">+</span> <span class="n">y</span><span class="p">)</span> <span class="o">%</span> <span class="bp">self</span><span class="o">.</span><span class="n">_q</span>
|
||
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_add</span>
|
||
</code></pre></div></td></tr></table></div>
|
||
</details>
|
||
</div>
|
||
|
||
</div>
|
||
|
||
<div class="doc doc-object doc-function">
|
||
|
||
|
||
<h3 id="Cryptotools.Groups.galois.Galois.check_closure_law" class="doc doc-heading">
|
||
<code class="highlight language-python"><span class="n">check_closure_law</span><span class="p">(</span><span class="n">arithmetic</span><span class="p">)</span></code>
|
||
|
||
</h3>
|
||
|
||
|
||
<div class="doc doc-contents ">
|
||
|
||
<p>This function check the closure law.
|
||
By definition, every element in the GF is an abelian group, which respect the closure law: for a and b belongs to G, a + b belongs to G, the operation is a binary operation</p>
|
||
|
||
|
||
<table class="field-list">
|
||
<colgroup>
|
||
<col class="field-name" />
|
||
<col class="field-body" />
|
||
</colgroup>
|
||
<tbody valign="top">
|
||
<tr class="field">
|
||
<th class="field-name">Parameters:</th>
|
||
<td class="field-body">
|
||
<ul class="first simple">
|
||
<li>
|
||
<b><code>Arithmetics</code></b>
|
||
(<code><span title="str">str</span></code>)
|
||
–
|
||
<div class="doc-md-description">
|
||
<p>contain the operation to be made, must be '+', '*', '/' or /-'</p>
|
||
</div>
|
||
</li>
|
||
</ul>
|
||
</td>
|
||
</tr>
|
||
</tbody>
|
||
</table>
|
||
|
||
<details class="quote">
|
||
<summary>Source code in <code>Cryptotools/Groups/galois.py</code></summary>
|
||
<div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal">135</span>
|
||
<span class="normal">136</span>
|
||
<span class="normal">137</span>
|
||
<span class="normal">138</span>
|
||
<span class="normal">139</span>
|
||
<span class="normal">140</span>
|
||
<span class="normal">141</span>
|
||
<span class="normal">142</span>
|
||
<span class="normal">143</span>
|
||
<span class="normal">144</span>
|
||
<span class="normal">145</span>
|
||
<span class="normal">146</span>
|
||
<span class="normal">147</span>
|
||
<span class="normal">148</span>
|
||
<span class="normal">149</span>
|
||
<span class="normal">150</span>
|
||
<span class="normal">151</span>
|
||
<span class="normal">152</span>
|
||
<span class="normal">153</span>
|
||
<span class="normal">154</span>
|
||
<span class="normal">155</span>
|
||
<span class="normal">156</span>
|
||
<span class="normal">157</span>
|
||
<span class="normal">158</span>
|
||
<span class="normal">159</span>
|
||
<span class="normal">160</span>
|
||
<span class="normal">161</span>
|
||
<span class="normal">162</span>
|
||
<span class="normal">163</span>
|
||
<span class="normal">164</span>
|
||
<span class="normal">165</span>
|
||
<span class="normal">166</span>
|
||
<span class="normal">167</span>
|
||
<span class="normal">168</span>
|
||
<span class="normal">169</span>
|
||
<span class="normal">170</span>
|
||
<span class="normal">171</span>
|
||
<span class="normal">172</span></pre></div></td><td class="code"><div><pre><span></span><code><span class="k">def</span> <span class="nf">check_closure_law</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">arithmetic</span><span class="p">):</span>
|
||
<span class="w"> </span><span class="sd">"""</span>
|
||
<span class="sd"> This function check the closure law.</span>
|
||
<span class="sd"> By definition, every element in the GF is an abelian group, which respect the closure law: for a and b belongs to G, a + b belongs to G, the operation is a binary operation</span>
|
||
|
||
<span class="sd"> Args:</span>
|
||
<span class="sd"> Arithmetics (str): contain the operation to be made, must be '+', '*', '/' or /-'</span>
|
||
<span class="sd"> """</span>
|
||
<span class="k">if</span> <span class="n">arithmetic</span> <span class="ow">not</span> <span class="ow">in</span> <span class="p">[</span><span class="s1">'+'</span><span class="p">,</span> <span class="s1">'*'</span><span class="p">,</span> <span class="s1">'/'</span><span class="p">,</span> <span class="s1">'-'</span><span class="p">]:</span>
|
||
<span class="k">raise</span> <span class="ne">Exception</span><span class="p">(</span><span class="s2">"The arithmetic need to be '+', '*', '/' or '-'"</span><span class="p">)</span>
|
||
|
||
<span class="k">if</span> <span class="n">arithmetic</span> <span class="o">==</span> <span class="s1">'+'</span><span class="p">:</span>
|
||
<span class="n">G</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_add</span>
|
||
<span class="k">elif</span> <span class="n">arithmetic</span> <span class="o">==</span> <span class="s1">'*'</span><span class="p">:</span>
|
||
<span class="n">G</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_mul</span>
|
||
<span class="k">elif</span> <span class="n">arithmetic</span> <span class="o">==</span> <span class="s1">'/'</span><span class="p">:</span>
|
||
<span class="n">G</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_div</span>
|
||
<span class="k">else</span><span class="p">:</span>
|
||
<span class="n">G</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_sub</span>
|
||
|
||
<span class="n">start</span> <span class="o">=</span> <span class="mi">0</span>
|
||
<span class="w"> </span><span class="sd">"""</span>
|
||
<span class="sd"> In case of multiplicative, we bypass the first line, because all elements are zero, otherwise the test fail</span>
|
||
<span class="sd"> """</span>
|
||
<span class="k">if</span> <span class="n">arithmetic</span> <span class="o">==</span> <span class="s1">'*'</span> <span class="ow">or</span> <span class="n">arithmetic</span> <span class="o">==</span> <span class="s1">'/'</span><span class="p">:</span>
|
||
<span class="n">start</span> <span class="o">=</span> <span class="mi">1</span>
|
||
|
||
<span class="n">isClosure</span> <span class="o">=</span> <span class="kc">True</span>
|
||
<span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">start</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">_q</span><span class="p">):</span>
|
||
<span class="n">gr</span> <span class="o">=</span> <span class="n">Group</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_q</span><span class="p">,</span> <span class="n">G</span><span class="p">[</span><span class="n">x</span><span class="p">],</span> <span class="bp">self</span><span class="o">.</span><span class="n">_operation</span><span class="p">)</span>
|
||
<span class="k">if</span> <span class="ow">not</span> <span class="n">gr</span><span class="o">.</span><span class="n">closure</span><span class="p">():</span>
|
||
<span class="n">isClosure</span> <span class="o">=</span> <span class="kc">False</span>
|
||
<span class="k">del</span> <span class="n">gr</span>
|
||
|
||
<span class="k">if</span> <span class="n">isClosure</span><span class="p">:</span>
|
||
<span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">"The group </span><span class="si">{</span><span class="n">arithmetic</span><span class="si">}</span><span class="s2"> respect closure law"</span><span class="p">)</span>
|
||
<span class="k">else</span><span class="p">:</span>
|
||
<span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">"The group </span><span class="si">{</span><span class="n">arithmetic</span><span class="si">}</span><span class="s2"> does not respect closure law"</span><span class="p">)</span>
|
||
</code></pre></div></td></tr></table></div>
|
||
</details>
|
||
</div>
|
||
|
||
</div>
|
||
|
||
<div class="doc doc-object doc-function">
|
||
|
||
|
||
<h3 id="Cryptotools.Groups.galois.Galois.check_identity_add" class="doc doc-heading">
|
||
<code class="highlight language-python"><span class="n">check_identity_add</span><span class="p">()</span></code>
|
||
|
||
</h3>
|
||
|
||
|
||
<div class="doc doc-contents ">
|
||
|
||
<p>This function check the identity element and must satisfy this condition: $a + 0 = a$ for each element in the GF(n)
|
||
In Group Theory, an identity element is an element in the group which do not change the value every element in the group</p>
|
||
<p>Returns:</p>
|
||
|
||
|
||
<details class="quote">
|
||
<summary>Source code in <code>Cryptotools/Groups/galois.py</code></summary>
|
||
<div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal">174</span>
|
||
<span class="normal">175</span>
|
||
<span class="normal">176</span>
|
||
<span class="normal">177</span>
|
||
<span class="normal">178</span>
|
||
<span class="normal">179</span>
|
||
<span class="normal">180</span>
|
||
<span class="normal">181</span>
|
||
<span class="normal">182</span>
|
||
<span class="normal">183</span>
|
||
<span class="normal">184</span>
|
||
<span class="normal">185</span>
|
||
<span class="normal">186</span>
|
||
<span class="normal">187</span></pre></div></td><td class="code"><div><pre><span></span><code><span class="k">def</span> <span class="nf">check_identity_add</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
||
<span class="w"> </span><span class="sd">"""</span>
|
||
<span class="sd"> This function check the identity element and must satisfy this condition: $a + 0 = a$ for each element in the GF(n)</span>
|
||
<span class="sd"> In Group Theory, an identity element is an element in the group which do not change the value every element in the group</span>
|
||
|
||
<span class="sd"> Returns:</span>
|
||
|
||
<span class="sd"> """</span>
|
||
<span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">_F</span><span class="p">:</span>
|
||
<span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">_identityAdd</span> <span class="o">+</span> <span class="n">x</span> <span class="o">==</span> <span class="n">x</span><span class="p">:</span>
|
||
<span class="k">raise</span> <span class="ne">Exception</span><span class="p">(</span>
|
||
<span class="sa">f</span><span class="s2">"The identity element </span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">_identityAdd</span><span class="si">}</span><span class="s2"> "</span>\
|
||
<span class="s2">"do not satisfy $a + element = a$"</span>
|
||
<span class="p">)</span>
|
||
</code></pre></div></td></tr></table></div>
|
||
</details>
|
||
</div>
|
||
|
||
</div>
|
||
|
||
<div class="doc doc-object doc-function">
|
||
|
||
|
||
<h3 id="Cryptotools.Groups.galois.Galois.check_identity_mul" class="doc doc-heading">
|
||
<code class="highlight language-python"><span class="n">check_identity_mul</span><span class="p">()</span></code>
|
||
|
||
</h3>
|
||
|
||
|
||
<div class="doc doc-contents ">
|
||
|
||
<p>This function check the identity element and must satisfy this condition: $a * 1 = a$ for each element in the GF(n)
|
||
In Group Theory, an identity element is an element in the group which do not change the value every element in the group</p>
|
||
<p>Returns:</p>
|
||
|
||
|
||
<details class="quote">
|
||
<summary>Source code in <code>Cryptotools/Groups/galois.py</code></summary>
|
||
<div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal">189</span>
|
||
<span class="normal">190</span>
|
||
<span class="normal">191</span>
|
||
<span class="normal">192</span>
|
||
<span class="normal">193</span>
|
||
<span class="normal">194</span>
|
||
<span class="normal">195</span>
|
||
<span class="normal">196</span>
|
||
<span class="normal">197</span>
|
||
<span class="normal">198</span>
|
||
<span class="normal">199</span>
|
||
<span class="normal">200</span>
|
||
<span class="normal">201</span>
|
||
<span class="normal">202</span></pre></div></td><td class="code"><div><pre><span></span><code><span class="k">def</span> <span class="nf">check_identity_mul</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
||
<span class="w"> </span><span class="sd">"""</span>
|
||
<span class="sd"> This function check the identity element and must satisfy this condition: $a * 1 = a$ for each element in the GF(n)</span>
|
||
<span class="sd"> In Group Theory, an identity element is an element in the group which do not change the value every element in the group</span>
|
||
|
||
<span class="sd"> Returns:</span>
|
||
|
||
<span class="sd"> """</span>
|
||
<span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">_F</span><span class="p">:</span>
|
||
<span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">_identityMul</span> <span class="o">*</span> <span class="n">x</span> <span class="o">==</span> <span class="n">x</span><span class="p">:</span>
|
||
<span class="k">raise</span> <span class="ne">Exception</span><span class="p">(</span>
|
||
<span class="sa">f</span><span class="s2">"The identity element </span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">_identityAdd</span><span class="si">}</span><span class="s2"> "</span>\
|
||
<span class="s2">"do not satisfy $a * element = a$"</span>
|
||
<span class="p">)</span>
|
||
</code></pre></div></td></tr></table></div>
|
||
</details>
|
||
</div>
|
||
|
||
</div>
|
||
|
||
<div class="doc doc-object doc-function">
|
||
|
||
|
||
<h3 id="Cryptotools.Groups.galois.Galois.div" class="doc doc-heading">
|
||
<code class="highlight language-python"><span class="n">div</span><span class="p">()</span></code>
|
||
|
||
</h3>
|
||
|
||
|
||
<div class="doc doc-contents ">
|
||
|
||
<p>This function do the operation / on the Galois Field</p>
|
||
|
||
|
||
<table class="field-list">
|
||
<colgroup>
|
||
<col class="field-name" />
|
||
<col class="field-body" />
|
||
</colgroup>
|
||
<tbody valign="top">
|
||
<tr class="field">
|
||
<th class="field-name">Returns:</th>
|
||
<td class="field-body">
|
||
<ul class="first simple">
|
||
<li>
|
||
–
|
||
<div class="doc-md-description">
|
||
<p>Return a list of the group with the division operation</p>
|
||
</div>
|
||
</li>
|
||
</ul>
|
||
</td>
|
||
</tr>
|
||
</tbody>
|
||
</table>
|
||
|
||
<details class="quote">
|
||
<summary>Source code in <code>Cryptotools/Groups/galois.py</code></summary>
|
||
<div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"> 97</span>
|
||
<span class="normal"> 98</span>
|
||
<span class="normal"> 99</span>
|
||
<span class="normal">100</span>
|
||
<span class="normal">101</span>
|
||
<span class="normal">102</span>
|
||
<span class="normal">103</span>
|
||
<span class="normal">104</span>
|
||
<span class="normal">105</span>
|
||
<span class="normal">106</span>
|
||
<span class="normal">107</span>
|
||
<span class="normal">108</span>
|
||
<span class="normal">109</span></pre></div></td><td class="code"><div><pre><span></span><code><span class="k">def</span> <span class="nf">div</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
||
<span class="w"> </span><span class="sd">"""</span>
|
||
<span class="sd"> This function do the operation / on the Galois Field</span>
|
||
|
||
<span class="sd"> Returns:</span>
|
||
<span class="sd"> Return a list of the group with the division operation</span>
|
||
<span class="sd"> """</span>
|
||
<span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">_q</span><span class="p">):</span>
|
||
<span class="k">for</span> <span class="n">y</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">_q</span><span class="p">):</span>
|
||
<span class="n">inv</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_inverseModular</span><span class="p">(</span><span class="n">y</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">_q</span><span class="p">)</span>
|
||
|
||
<span class="bp">self</span><span class="o">.</span><span class="n">_div</span><span class="p">[</span><span class="n">x</span><span class="p">][</span><span class="n">y</span><span class="p">]</span> <span class="o">=</span> <span class="p">(</span><span class="n">x</span> <span class="o">*</span> <span class="n">inv</span><span class="p">)</span> <span class="o">%</span> <span class="bp">self</span><span class="o">.</span><span class="n">_q</span>
|
||
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_div</span>
|
||
</code></pre></div></td></tr></table></div>
|
||
</details>
|
||
</div>
|
||
|
||
</div>
|
||
|
||
<div class="doc doc-object doc-function">
|
||
|
||
|
||
<h3 id="Cryptotools.Groups.galois.Galois.getPrimitiveRoot" class="doc doc-heading">
|
||
<code class="highlight language-python"><span class="n">getPrimitiveRoot</span><span class="p">()</span></code>
|
||
|
||
</h3>
|
||
|
||
|
||
<div class="doc doc-contents ">
|
||
|
||
<p>Return the list of primitives root</p>
|
||
|
||
|
||
<table class="field-list">
|
||
<colgroup>
|
||
<col class="field-name" />
|
||
<col class="field-body" />
|
||
</colgroup>
|
||
<tbody valign="top">
|
||
<tr class="field">
|
||
<th class="field-name">Returns:</th>
|
||
<td class="field-body">
|
||
<ul class="first simple">
|
||
<li>
|
||
–
|
||
<div class="doc-md-description">
|
||
<p>Return the primitive root</p>
|
||
</div>
|
||
</li>
|
||
</ul>
|
||
</td>
|
||
</tr>
|
||
</tbody>
|
||
</table>
|
||
|
||
<details class="quote">
|
||
<summary>Source code in <code>Cryptotools/Groups/galois.py</code></summary>
|
||
<div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal">51</span>
|
||
<span class="normal">52</span>
|
||
<span class="normal">53</span>
|
||
<span class="normal">54</span>
|
||
<span class="normal">55</span>
|
||
<span class="normal">56</span>
|
||
<span class="normal">57</span>
|
||
<span class="normal">58</span></pre></div></td><td class="code"><div><pre><span></span><code><span class="k">def</span> <span class="nf">getPrimitiveRoot</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
||
<span class="w"> </span><span class="sd">"""</span>
|
||
<span class="sd"> Return the list of primitives root</span>
|
||
|
||
<span class="sd"> Returns:</span>
|
||
<span class="sd"> Return the primitive root</span>
|
||
<span class="sd"> """</span>
|
||
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_primitiveRoot</span>
|
||
</code></pre></div></td></tr></table></div>
|
||
</details>
|
||
</div>
|
||
|
||
</div>
|
||
|
||
<div class="doc doc-object doc-function">
|
||
|
||
|
||
<h3 id="Cryptotools.Groups.galois.Galois.isPrimitiveRoot" class="doc doc-heading">
|
||
<code class="highlight language-python"><span class="n">isPrimitiveRoot</span><span class="p">(</span><span class="n">z</span><span class="p">,</span> <span class="n">length</span><span class="p">)</span></code>
|
||
|
||
</h3>
|
||
|
||
|
||
<div class="doc doc-contents ">
|
||
|
||
<p>Check if z is a primitive root </p>
|
||
|
||
|
||
<table class="field-list">
|
||
<colgroup>
|
||
<col class="field-name" />
|
||
<col class="field-body" />
|
||
</colgroup>
|
||
<tbody valign="top">
|
||
<tr class="field">
|
||
<th class="field-name">Parameters:</th>
|
||
<td class="field-body">
|
||
<ul class="first simple">
|
||
<li>
|
||
<b><code>z</code></b>
|
||
(<code><span title="list">list</span></code>)
|
||
–
|
||
<div class="doc-md-description">
|
||
<p>check if z is a primitive root</p>
|
||
</div>
|
||
</li>
|
||
<li>
|
||
<b><code>length</code></b>
|
||
(<code><span title="Integer">Integer</span></code>)
|
||
–
|
||
<div class="doc-md-description">
|
||
<p>Length of the GF(q)</p>
|
||
</div>
|
||
</li>
|
||
</ul>
|
||
</td>
|
||
</tr>
|
||
</tbody>
|
||
</table>
|
||
|
||
<details class="quote">
|
||
<summary>Source code in <code>Cryptotools/Groups/galois.py</code></summary>
|
||
<div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal">60</span>
|
||
<span class="normal">61</span>
|
||
<span class="normal">62</span>
|
||
<span class="normal">63</span>
|
||
<span class="normal">64</span>
|
||
<span class="normal">65</span>
|
||
<span class="normal">66</span>
|
||
<span class="normal">67</span>
|
||
<span class="normal">68</span>
|
||
<span class="normal">69</span>
|
||
<span class="normal">70</span></pre></div></td><td class="code"><div><pre><span></span><code><span class="k">def</span> <span class="nf">isPrimitiveRoot</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">z</span><span class="p">,</span> <span class="n">length</span><span class="p">):</span>
|
||
<span class="w"> </span><span class="sd">"""</span>
|
||
<span class="sd"> Check if z is a primitive root </span>
|
||
|
||
<span class="sd"> Args:</span>
|
||
<span class="sd"> z (list): check if z is a primitive root</span>
|
||
<span class="sd"> length (Integer): Length of the GF(q)</span>
|
||
<span class="sd"> """</span>
|
||
<span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">z</span><span class="p">)</span> <span class="o">==</span> <span class="n">length</span><span class="p">:</span>
|
||
<span class="k">return</span> <span class="kc">True</span>
|
||
<span class="k">return</span> <span class="kc">False</span>
|
||
</code></pre></div></td></tr></table></div>
|
||
</details>
|
||
</div>
|
||
|
||
</div>
|
||
|
||
<div class="doc doc-object doc-function">
|
||
|
||
|
||
<h3 id="Cryptotools.Groups.galois.Galois.mul" class="doc doc-heading">
|
||
<code class="highlight language-python"><span class="n">mul</span><span class="p">()</span></code>
|
||
|
||
</h3>
|
||
|
||
|
||
<div class="doc doc-contents ">
|
||
|
||
<p>This function do the operation * on the Galois Field</p>
|
||
|
||
|
||
<table class="field-list">
|
||
<colgroup>
|
||
<col class="field-name" />
|
||
<col class="field-body" />
|
||
</colgroup>
|
||
<tbody valign="top">
|
||
<tr class="field">
|
||
<th class="field-name">Returns:</th>
|
||
<td class="field-body">
|
||
<ul class="first simple">
|
||
<li>
|
||
–
|
||
<div class="doc-md-description">
|
||
<p>Return a list of the group with the multiplication operation</p>
|
||
</div>
|
||
</li>
|
||
</ul>
|
||
</td>
|
||
</tr>
|
||
</tbody>
|
||
</table>
|
||
|
||
<details class="quote">
|
||
<summary>Source code in <code>Cryptotools/Groups/galois.py</code></summary>
|
||
<div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal">111</span>
|
||
<span class="normal">112</span>
|
||
<span class="normal">113</span>
|
||
<span class="normal">114</span>
|
||
<span class="normal">115</span>
|
||
<span class="normal">116</span>
|
||
<span class="normal">117</span>
|
||
<span class="normal">118</span>
|
||
<span class="normal">119</span>
|
||
<span class="normal">120</span>
|
||
<span class="normal">121</span></pre></div></td><td class="code"><div><pre><span></span><code><span class="k">def</span> <span class="nf">mul</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
||
<span class="w"> </span><span class="sd">"""</span>
|
||
<span class="sd"> This function do the operation * on the Galois Field</span>
|
||
|
||
<span class="sd"> Returns:</span>
|
||
<span class="sd"> Return a list of the group with the multiplication operation</span>
|
||
<span class="sd"> """</span>
|
||
<span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">_q</span><span class="p">):</span>
|
||
<span class="k">for</span> <span class="n">y</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">_q</span><span class="p">):</span>
|
||
<span class="bp">self</span><span class="o">.</span><span class="n">_mul</span><span class="p">[</span><span class="n">x</span><span class="p">][</span><span class="n">y</span><span class="p">]</span> <span class="o">=</span> <span class="p">(</span><span class="n">x</span> <span class="o">*</span> <span class="n">y</span><span class="p">)</span> <span class="o">%</span> <span class="bp">self</span><span class="o">.</span><span class="n">_q</span>
|
||
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_mul</span>
|
||
</code></pre></div></td></tr></table></div>
|
||
</details>
|
||
</div>
|
||
|
||
</div>
|
||
|
||
<div class="doc doc-object doc-function">
|
||
|
||
|
||
<h3 id="Cryptotools.Groups.galois.Galois.primitiveRoot" class="doc doc-heading">
|
||
<code class="highlight language-python"><span class="n">primitiveRoot</span><span class="p">()</span></code>
|
||
|
||
</h3>
|
||
|
||
|
||
<div class="doc doc-contents ">
|
||
|
||
<p>In this function, we going to find the primitive root modulo n of the galois field</p>
|
||
|
||
|
||
<table class="field-list">
|
||
<colgroup>
|
||
<col class="field-name" />
|
||
<col class="field-body" />
|
||
</colgroup>
|
||
<tbody valign="top">
|
||
<tr class="field">
|
||
<th class="field-name">Returns:</th>
|
||
<td class="field-body">
|
||
<ul class="first simple">
|
||
<li>
|
||
–
|
||
<div class="doc-md-description">
|
||
<p>Return the list of primitive root of the GF(q)</p>
|
||
</div>
|
||
</li>
|
||
</ul>
|
||
</td>
|
||
</tr>
|
||
</tbody>
|
||
</table>
|
||
|
||
<details class="quote">
|
||
<summary>Source code in <code>Cryptotools/Groups/galois.py</code></summary>
|
||
<div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal">32</span>
|
||
<span class="normal">33</span>
|
||
<span class="normal">34</span>
|
||
<span class="normal">35</span>
|
||
<span class="normal">36</span>
|
||
<span class="normal">37</span>
|
||
<span class="normal">38</span>
|
||
<span class="normal">39</span>
|
||
<span class="normal">40</span>
|
||
<span class="normal">41</span>
|
||
<span class="normal">42</span>
|
||
<span class="normal">43</span>
|
||
<span class="normal">44</span>
|
||
<span class="normal">45</span>
|
||
<span class="normal">46</span>
|
||
<span class="normal">47</span>
|
||
<span class="normal">48</span>
|
||
<span class="normal">49</span></pre></div></td><td class="code"><div><pre><span></span><code><span class="k">def</span> <span class="nf">primitiveRoot</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
||
<span class="w"> </span><span class="sd">"""</span>
|
||
<span class="sd"> In this function, we going to find the primitive root modulo n of the galois field</span>
|
||
|
||
<span class="sd"> Returns:</span>
|
||
<span class="sd"> Return the list of primitive root of the GF(q) </span>
|
||
<span class="sd"> """</span>
|
||
<span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">2</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">_q</span><span class="p">):</span>
|
||
<span class="n">z</span> <span class="o">=</span> <span class="nb">list</span><span class="p">()</span>
|
||
<span class="k">for</span> <span class="n">entry</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">_q</span><span class="p">):</span>
|
||
<span class="n">res</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_operation</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="n">entry</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">_q</span><span class="p">)</span>
|
||
<span class="k">if</span> <span class="n">res</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">z</span><span class="p">:</span>
|
||
<span class="n">z</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">res</span><span class="p">)</span>
|
||
|
||
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">isPrimitiveRoot</span><span class="p">(</span><span class="n">z</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">_q</span> <span class="o">-</span> <span class="mi">1</span><span class="p">):</span>
|
||
<span class="k">if</span> <span class="n">x</span> <span class="ow">not</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">_primitiveRoot</span><span class="p">:</span> <span class="c1"># It's dirty, need to find why we have duplicate entry</span>
|
||
<span class="bp">self</span><span class="o">.</span><span class="n">_primitiveRoot</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">x</span><span class="p">)</span>
|
||
<span class="k">return</span> <span class="n">z</span>
|
||
</code></pre></div></td></tr></table></div>
|
||
</details>
|
||
</div>
|
||
|
||
</div>
|
||
|
||
<div class="doc doc-object doc-function">
|
||
|
||
|
||
<h3 id="Cryptotools.Groups.galois.Galois.printMatrice" class="doc doc-heading">
|
||
<code class="highlight language-python"><span class="n">printMatrice</span><span class="p">(</span><span class="n">m</span><span class="p">)</span></code>
|
||
|
||
</h3>
|
||
|
||
|
||
<div class="doc doc-contents ">
|
||
|
||
<p>This function print the GF(m)</p>
|
||
|
||
|
||
<table class="field-list">
|
||
<colgroup>
|
||
<col class="field-name" />
|
||
<col class="field-body" />
|
||
</colgroup>
|
||
<tbody valign="top">
|
||
<tr class="field">
|
||
<th class="field-name">Parameters:</th>
|
||
<td class="field-body">
|
||
<ul class="first simple">
|
||
<li>
|
||
<b><code>m</code></b>
|
||
(<code><span title="list">list</span></code>)
|
||
–
|
||
<div class="doc-md-description">
|
||
<p>Matrix of the GF</p>
|
||
</div>
|
||
</li>
|
||
</ul>
|
||
</td>
|
||
</tr>
|
||
</tbody>
|
||
</table>
|
||
|
||
<details class="quote">
|
||
<summary>Source code in <code>Cryptotools/Groups/galois.py</code></summary>
|
||
<div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal">204</span>
|
||
<span class="normal">205</span>
|
||
<span class="normal">206</span>
|
||
<span class="normal">207</span>
|
||
<span class="normal">208</span>
|
||
<span class="normal">209</span>
|
||
<span class="normal">210</span>
|
||
<span class="normal">211</span>
|
||
<span class="normal">212</span>
|
||
<span class="normal">213</span>
|
||
<span class="normal">214</span>
|
||
<span class="normal">215</span>
|
||
<span class="normal">216</span>
|
||
<span class="normal">217</span>
|
||
<span class="normal">218</span>
|
||
<span class="normal">219</span>
|
||
<span class="normal">220</span>
|
||
<span class="normal">221</span>
|
||
<span class="normal">222</span>
|
||
<span class="normal">223</span>
|
||
<span class="normal">224</span>
|
||
<span class="normal">225</span>
|
||
<span class="normal">226</span>
|
||
<span class="normal">227</span></pre></div></td><td class="code"><div><pre><span></span><code><span class="k">def</span> <span class="nf">printMatrice</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">m</span><span class="p">):</span>
|
||
<span class="w"> </span><span class="sd">"""</span>
|
||
<span class="sd"> This function print the GF(m)</span>
|
||
|
||
<span class="sd"> Args:</span>
|
||
<span class="sd"> m (list): Matrix of the GF</span>
|
||
<span class="sd"> """</span>
|
||
<span class="n">header</span> <span class="o">=</span> <span class="nb">str</span><span class="p">()</span>
|
||
<span class="n">header</span> <span class="o">=</span> <span class="s2">" "</span>
|
||
<span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">_q</span><span class="p">):</span>
|
||
<span class="n">header</span> <span class="o">+=</span> <span class="sa">f</span><span class="s2">"</span><span class="si">{</span><span class="n">x</span><span class="si">}</span><span class="s2"> "</span>
|
||
|
||
<span class="n">header</span> <span class="o">+=</span> <span class="s2">"</span><span class="se">\n</span><span class="s2">--|"</span> <span class="o">+</span> <span class="s2">"-"</span> <span class="o">*</span> <span class="p">(</span><span class="nb">len</span><span class="p">(</span><span class="n">header</span><span class="p">)</span><span class="o">-</span> <span class="mi">3</span><span class="p">)</span> <span class="o">+</span><span class="s2">"</span><span class="se">\n</span><span class="s2">"</span>
|
||
|
||
<span class="n">s</span> <span class="o">=</span> <span class="nb">str</span><span class="p">()</span>
|
||
|
||
<span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">_q</span><span class="p">):</span>
|
||
<span class="n">s</span> <span class="o">+=</span> <span class="sa">f</span><span class="s2">"</span><span class="si">{</span><span class="n">x</span><span class="si">}</span><span class="s2"> | "</span>
|
||
<span class="k">for</span> <span class="n">y</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">_q</span><span class="p">):</span>
|
||
<span class="n">s</span> <span class="o">+=</span> <span class="sa">f</span><span class="s2">"</span><span class="si">{</span><span class="n">m</span><span class="p">[</span><span class="n">x</span><span class="p">][</span><span class="n">y</span><span class="p">]</span><span class="si">}</span><span class="s2"> "</span>
|
||
<span class="n">s</span> <span class="o">+=</span> <span class="s2">"</span><span class="se">\n</span><span class="s2">"</span>
|
||
|
||
<span class="n">s</span> <span class="o">=</span> <span class="n">header</span> <span class="o">+</span> <span class="n">s</span>
|
||
<span class="nb">print</span><span class="p">(</span><span class="n">s</span><span class="p">)</span>
|
||
</code></pre></div></td></tr></table></div>
|
||
</details>
|
||
</div>
|
||
|
||
</div>
|
||
|
||
<div class="doc doc-object doc-function">
|
||
|
||
|
||
<h3 id="Cryptotools.Groups.galois.Galois.sub" class="doc doc-heading">
|
||
<code class="highlight language-python"><span class="n">sub</span><span class="p">()</span></code>
|
||
|
||
</h3>
|
||
|
||
|
||
<div class="doc doc-contents ">
|
||
|
||
<p>This function do the operation - on the Galois Field</p>
|
||
|
||
|
||
<table class="field-list">
|
||
<colgroup>
|
||
<col class="field-name" />
|
||
<col class="field-body" />
|
||
</colgroup>
|
||
<tbody valign="top">
|
||
<tr class="field">
|
||
<th class="field-name">Returns:</th>
|
||
<td class="field-body">
|
||
<ul class="first simple">
|
||
<li>
|
||
–
|
||
<div class="doc-md-description">
|
||
<p>Return a list of the group with the subtraction operation</p>
|
||
</div>
|
||
</li>
|
||
</ul>
|
||
</td>
|
||
</tr>
|
||
</tbody>
|
||
</table>
|
||
|
||
<details class="quote">
|
||
<summary>Source code in <code>Cryptotools/Groups/galois.py</code></summary>
|
||
<div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal">123</span>
|
||
<span class="normal">124</span>
|
||
<span class="normal">125</span>
|
||
<span class="normal">126</span>
|
||
<span class="normal">127</span>
|
||
<span class="normal">128</span>
|
||
<span class="normal">129</span>
|
||
<span class="normal">130</span>
|
||
<span class="normal">131</span>
|
||
<span class="normal">132</span>
|
||
<span class="normal">133</span></pre></div></td><td class="code"><div><pre><span></span><code><span class="k">def</span> <span class="nf">sub</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
||
<span class="w"> </span><span class="sd">"""</span>
|
||
<span class="sd"> This function do the operation - on the Galois Field</span>
|
||
|
||
<span class="sd"> Returns:</span>
|
||
<span class="sd"> Return a list of the group with the subtraction operation</span>
|
||
<span class="sd"> """</span>
|
||
<span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">_q</span><span class="p">):</span>
|
||
<span class="k">for</span> <span class="n">y</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">_q</span><span class="p">):</span>
|
||
<span class="bp">self</span><span class="o">.</span><span class="n">_sub</span><span class="p">[</span><span class="n">x</span><span class="p">][</span><span class="n">y</span><span class="p">]</span> <span class="o">=</span> <span class="p">(</span><span class="n">x</span> <span class="o">-</span> <span class="n">y</span><span class="p">)</span> <span class="o">%</span> <span class="bp">self</span><span class="o">.</span><span class="n">_q</span>
|
||
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_sub</span>
|
||
</code></pre></div></td></tr></table></div>
|
||
</details>
|
||
</div>
|
||
|
||
</div>
|
||
|
||
|
||
|
||
</div>
|
||
|
||
</div>
|
||
|
||
</div>
|
||
|
||
|
||
|
||
|
||
</div>
|
||
|
||
</div>
|
||
|
||
</div>
|
||
|
||
</div>
|
||
</div><footer>
|
||
<div class="rst-footer-buttons" role="navigation" aria-label="Footer Navigation">
|
||
<a href="../number-theory/" class="btn btn-neutral float-left" title="Number theory"><span class="icon icon-circle-arrow-left"></span> Previous</a>
|
||
<a href="../rsa/" class="btn btn-neutral float-right" title="RSA">Next <span class="icon icon-circle-arrow-right"></span></a>
|
||
</div>
|
||
|
||
<hr/>
|
||
|
||
<div role="contentinfo">
|
||
<!-- Copyright etc -->
|
||
</div>
|
||
|
||
Built with <a href="https://www.mkdocs.org/">MkDocs</a> using a <a href="https://github.com/readthedocs/sphinx_rtd_theme">theme</a> provided by <a href="https://readthedocs.org">Read the Docs</a>.
|
||
</footer>
|
||
|
||
</div>
|
||
</div>
|
||
|
||
</section>
|
||
|
||
</div>
|
||
|
||
<div class="rst-versions" role="note" aria-label="Versions">
|
||
<span class="rst-current-version" data-toggle="rst-current-version">
|
||
|
||
|
||
<span><a href="../number-theory/" style="color: #fcfcfc">« Previous</a></span>
|
||
|
||
|
||
<span><a href="../rsa/" style="color: #fcfcfc">Next »</a></span>
|
||
|
||
</span>
|
||
</div>
|
||
<script src="../js/jquery-3.6.0.min.js"></script>
|
||
<script>var base_url = "..";</script>
|
||
<script src="../js/theme_extra.js"></script>
|
||
<script src="../js/theme.js"></script>
|
||
<script>
|
||
jQuery(function () {
|
||
SphinxRtdTheme.Navigation.enable(true);
|
||
});
|
||
</script>
|
||
|
||
</body>
|
||
</html>
|