inweb-bootstrap/docs/goldbach/S-tsoe.html
2020-04-20 23:26:08 +01:00

129 lines
12 KiB
HTML

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>The Sieve of Eratosthenes</title>
<link href="../docs-assets/Breadcrumbs.css" rel="stylesheet" rev="stylesheet" type="text/css">
<meta name="viewport" content="width=device-width initial-scale=1">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta http-equiv="Content-Language" content="en-gb">
<link href="../docs-assets/Base.css" rel="stylesheet" rev="stylesheet" type="text/css">
<link href="../docs-assets/Colours.css" rel="stylesheet" rev="stylesheet" type="text/css">
<meta name="viewport" content="width=device-width initial-scale=1">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta http-equiv="Content-Language" content="en-gb">
<link href="../docs-assets/Base.css" rel="stylesheet" rev="stylesheet" type="text/css">
<link href="../docs-assets/Colours.css" rel="stylesheet" rev="stylesheet" type="text/css">
<link href="../docs-assets/Breadcrumbs.css" rel="stylesheet" rev="stylesheet" type="text/css">
<script>
function togglePopup(material_id) {
var popup = document.getElementById(material_id);
popup.classList.toggle("show");
}
</script>
<link href="../docs-assets/Popups.css" rel="stylesheet" rev="stylesheet" type="text/css">
</head>
<body>
<nav role="navigation">
<h1><a href="../index.html">
<img src="../docs-assets/Octagram.png" width=72 height=72">
</a></h1>
<ul><li><a href="../inweb/index.html">inweb</a></li>
</ul><h2>Foundation Module</h2><ul>
<li><a href="../foundation-module/index.html">foundation</a></li>
<li><a href="../foundation-test/index.html">foundation-test</a></li>
</ul><h2>Example Webs</h2><ul>
<li><a href="index.html"><span class="selectedlink">goldbach</span></a></li>
<li><a href="../twinprimes/twinprimes.html">twinprimes</a></li>
<li><a href="../eastertide/index.html">eastertide</a></li>
</ul><h2>Repository</h2><ul>
<li><a href="https://github.com/ganelson/inweb"><img src="../github.png" height=18> github</a></li>
</ul><h2>Related Projects</h2><ul>
<li><a href="../../../inform/docs/index.html">inform</a></li>
<li><a href="../../../intest/docs/index.html">intest</a></li>
</ul>
</nav>
<main role="main">
<!--Weave of 'The Sieve of Eratosthenes' generated by Inweb-->
<ul class="crumbs"><li><a href="../index.html">Home</a></li><li><a href="index.html">The Goldbach Conjecture</a></li><li><b>The Sieve of Eratosthenes</b></li></ul><p class="purpose">A fairly fast way to determine if small numbers are prime, given storage.</p>
<ul class="toc"><li><a href="S-tsoe.html#SP1">&#167;1. Storage</a></li><li><a href="S-tsoe.html#SP2">&#167;2. Primality</a></li></ul><hr class="tocbar">
<p class="inwebparagraph"><a id="SP1"></a><b>&#167;1. Storage. </b>This technique, still essentially the best sieve for finding prime
numbers, is attributed to Eratosthenes of Cyrene and dates from the 200s BC.
Since composite numbers are exactly those numbers which are multiples of
something, the idea is to remove everything which is a multiple: whatever
is left, must be prime.
</p>
<p class="inwebparagraph">This is very fast (and can be done more quickly than the implementation
below), but (a) uses storage to hold the sieve, and (b) has to start right
back at 2 - so it can't efficiently test just, say, the eight-digit numbers
for primality.
</p>
<pre class="display">
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">still_in_sieve</span><span class="plain-syntax">[</span><span class="constant-syntax">RANGE</span><span class="plain-syntax"> + </span><span class="constant-syntax">1</span><span class="plain-syntax">];</span>
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">sieve_performed</span><span class="plain-syntax"> = </span><span class="constant-syntax">FALSE</span><span class="plain-syntax">;</span>
</pre>
<p class="inwebparagraph"><a id="SP2"></a><b>&#167;2. Primality. </b>We provide this as a function which determines whether a number is prime:
</p>
<pre class="definitions">
<span class="definition-keyword">define</span> <span class="constant-syntax">TRUE</span><span class="plain-syntax"> </span><span class="constant-syntax">1</span>
<span class="definition-keyword">define</span> <span class="constant-syntax">FALSE</span><span class="plain-syntax"> </span><span class="constant-syntax">0</span>
</pre>
<pre class="display">
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="function-syntax">isprime</span><button class="popup" onclick="togglePopup('usagePopup1')">...<span class="popuptext" id="usagePopup1">Usage of <b>isprime</b>:<br>Summing Two Primes - <a href="S-sp.html#SP2_1">&#167;2.1</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">n</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">n</span><span class="plain-syntax"> &lt;= </span><span class="constant-syntax">1</span><span class="plain-syntax">) </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="constant-syntax">FALSE</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">n</span><span class="plain-syntax"> &gt; </span><span class="constant-syntax">RANGE</span><span class="plain-syntax">) { </span><span class="identifier-syntax">printf</span><span class="plain-syntax">(</span><span class="string-syntax">"Out of range!\n"</span><span class="plain-syntax">); </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="constant-syntax">FALSE</span><span class="plain-syntax">; }</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (!</span><span class="identifier-syntax">sieve_performed</span><span class="plain-syntax">) </span>&lt;<span class="named-paragraph">Perform the sieve</span> <span class="named-paragraph-number">2.1</span>&gt;<span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">still_in_sieve</span><span class="plain-syntax">[</span><span class="identifier-syntax">n</span><span class="plain-syntax">];</span>
<span class="plain-syntax">}</span>
</pre>
<p class="inwebparagraph"><a id="SP2_1"></a><b>&#167;2.1. </b>We save a little time by noting that if a number up to <code class="display"><span class="extract-syntax">RANGE</span></code> is composite
then one of its factors must be smaller than the square root of <code class="display"><span class="extract-syntax">RANGE</span></code>. Thus,
in a sieve of size 10000, one only needs to remove multiples of 2 up to 100,
for example.
</p>
<p class="macrodefinition"><code class="display">
&lt;<span class="named-paragraph-defn">Perform the sieve</span> <span class="named-paragraph-number">2.1</span>&gt; =
</code></p>
<pre class="display">
<span class="plain-syntax"> </span>&lt;<span class="named-paragraph">Start with all numbers from 2 upwards in the sieve</span> <span class="named-paragraph-number">2.1.1</span>&gt;<span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">for</span><span class="plain-syntax"> (</span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">n</span><span class="plain-syntax">=2; </span><span class="identifier-syntax">n</span><span class="plain-syntax">*</span><span class="identifier-syntax">n</span><span class="plain-syntax"> &lt;= </span><span class="constant-syntax">RANGE</span><span class="plain-syntax">; </span><span class="identifier-syntax">n</span><span class="plain-syntax">++)</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">still_in_sieve</span><span class="plain-syntax">[</span><span class="identifier-syntax">n</span><span class="plain-syntax">])</span>
<span class="plain-syntax"> </span>&lt;<span class="named-paragraph">Shake out multiples of n</span> <span class="named-paragraph-number">2.1.2</span>&gt;<span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">sieve_performed</span><span class="plain-syntax"> = </span><span class="constant-syntax">TRUE</span><span class="plain-syntax">;</span>
</pre>
<ul class="endnotetexts"><li>This code is used in <a href="S-tsoe.html#SP2">&#167;2</a>.</li></ul><p class="inwebparagraph"><a id="SP2_1_1"></a><b>&#167;2.1.1. </b><code class="display">
&lt;<span class="named-paragraph-defn">Start with all numbers from 2 upwards in the sieve</span> <span class="named-paragraph-number">2.1.1</span>&gt; =
</code></p>
<pre class="display">
<span class="plain-syntax"> </span><span class="identifier-syntax">still_in_sieve</span><span class="plain-syntax">[1] = </span><span class="constant-syntax">FALSE</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">for</span><span class="plain-syntax"> (</span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">n</span><span class="plain-syntax">=2; </span><span class="identifier-syntax">n</span><span class="plain-syntax"> &lt;= </span><span class="constant-syntax">RANGE</span><span class="plain-syntax">; </span><span class="identifier-syntax">n</span><span class="plain-syntax">++) </span><span class="identifier-syntax">still_in_sieve</span><span class="plain-syntax">[</span><span class="identifier-syntax">n</span><span class="plain-syntax">] = </span><span class="constant-syntax">TRUE</span><span class="plain-syntax">;</span>
</pre>
<ul class="endnotetexts"><li>This code is used in <a href="S-tsoe.html#SP2_1">&#167;2.1</a>.</li></ul><p class="inwebparagraph"><a id="SP2_1_2"></a><b>&#167;2.1.2. </b><code class="display">
&lt;<span class="named-paragraph-defn">Shake out multiples of n</span> <span class="named-paragraph-number">2.1.2</span>&gt; =
</code></p>
<pre class="display">
<span class="plain-syntax"> </span><span class="reserved-syntax">for</span><span class="plain-syntax"> (</span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">m</span><span class="plain-syntax">= </span><span class="identifier-syntax">n</span><span class="plain-syntax">+</span><span class="identifier-syntax">n</span><span class="plain-syntax">; </span><span class="identifier-syntax">m</span><span class="plain-syntax"> &lt;= </span><span class="constant-syntax">RANGE</span><span class="plain-syntax">; </span><span class="identifier-syntax">m</span><span class="plain-syntax"> += </span><span class="identifier-syntax">n</span><span class="plain-syntax">) </span><span class="identifier-syntax">still_in_sieve</span><span class="plain-syntax">[</span><span class="identifier-syntax">m</span><span class="plain-syntax">] = </span><span class="constant-syntax">FALSE</span><span class="plain-syntax">;</span>
</pre>
<ul class="endnotetexts"><li>This code is used in <a href="S-tsoe.html#SP2_1">&#167;2.1</a>.</li></ul><hr class="tocbar">
<ul class="toc"><li><a href="S-sp.html">Back to 'Summing Two Primes'</a></li><li><i>(This section ends Sections.)</i></li></ul><hr class="tocbar">
<!--End of weave-->
</main>
</body>
</html>