129 lines
12 KiB
HTML
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">§1. Storage</a></li><li><a href="S-tsoe.html#SP2">§2. Primality</a></li></ul><hr class="tocbar">
|
|
|
|
<p class="inwebparagraph"><a id="SP1"></a><b>§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>§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">§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"> <= </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"> > </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><<span class="named-paragraph">Perform the sieve</span> <span class="named-paragraph-number">2.1</span>><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>§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">
|
|
<<span class="named-paragraph-defn">Perform the sieve</span> <span class="named-paragraph-number">2.1</span>> =
|
|
</code></p>
|
|
|
|
<pre class="display">
|
|
<span class="plain-syntax"> </span><<span class="named-paragraph">Start with all numbers from 2 upwards in the sieve</span> <span class="named-paragraph-number">2.1.1</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">*</span><span class="identifier-syntax">n</span><span class="plain-syntax"> <= </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><<span class="named-paragraph">Shake out multiples of n</span> <span class="named-paragraph-number">2.1.2</span>><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">§2</a>.</li></ul><p class="inwebparagraph"><a id="SP2_1_1"></a><b>§2.1.1. </b><code class="display">
|
|
<<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>> =
|
|
</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"> <= </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">§2.1</a>.</li></ul><p class="inwebparagraph"><a id="SP2_1_2"></a><b>§2.1.2. </b><code class="display">
|
|
<<span class="named-paragraph-defn">Shake out multiples of n</span> <span class="named-paragraph-number">2.1.2</span>> =
|
|
</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"> <= </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">§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>
|
|
|