<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Sieb des Eratosthenes (Visualisierung)]]></title><description><![CDATA[<p>Mir geht es um eine Visualisierung des Siebs des Eratosthenes, also das Aufzeigen des Streichens von Zahlen.<br />
<a href="http://www.primzahlen.de/primzahltests/sieb_des_eratosthenes.htm" rel="nofollow">http://www.primzahlen.de/primzahltests/sieb_des_eratosthenes.htm</a></p>
<p>Ich habe mir folgende farbliche Darstellung in der Konsole überlegt:</p>
<pre><code>#define NOMINMAX     // due to conflict with max()
#include &lt;windows.h&gt; // warning: no C++ standard!
#include&lt;iostream&gt;
#include&lt;chrono&gt;
#include &lt;cstdint&gt;
#include &lt;cstdlib&gt;
#include &lt;vector&gt;
#include &lt;algorithm&gt;

using namespace std;

void wait()
{
	cout &lt;&lt; &quot;wait: Press any key to continue.&quot; &lt;&lt; endl;
	cin.clear();
	cin.ignore(numeric_limits&lt;streamsize&gt;::max(), '\n');
	cin.get();
}

void setConsole() // windows.h
{
	_CONSOLE_SCREEN_BUFFER_INFO info;
	HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);
	GetConsoleScreenBufferInfo(handle, &amp;info);
	COORD c;
	c.X = max&lt;SHORT&gt;(info.dwSize.X, 150);
	c.Y = max&lt;SHORT&gt;(info.dwSize.Y, 1000);
	SetConsoleScreenBufferSize(handle, c);

	SMALL_RECT RECT;
	RECT.Left = 0;
	RECT.Top = 0;
	RECT.Bottom = max(info.srWindow.Bottom - info.srWindow.Top, 40 - 1);
	RECT.Right = max(c.X - 1, 100 - 1);
	SetConsoleWindowInfo(handle, TRUE, &amp;RECT);
}

void textcolor(unsigned short color = 15)  // windows.h
{
	SetConsoleTextAttribute(::GetStdHandle(STD_OUTPUT_HANDLE), color);
}

int main()
{
	setConsole();
	uint32_t primeLimit = 900;
	vector&lt;bool&gt; primes(primeLimit+1);
	uint32_t global_count = 0; // total number of primes

	chrono::time_point&lt;chrono::system_clock&gt; start, last; // for measuring execution time
	start = chrono::system_clock::now(); 

	// initialize the number array
	primes[0] = false;
	primes[1] = false;

	for (uint32_t i=2; i&lt;=primeLimit; ++i)
	{
		primes[i] = true;
	}

	uint32_t iMax = (uint32_t)sqrt((double)primeLimit) + 1;

	// sieving loop
	for (uint32_t i=2; i&lt;iMax; ++i)
	{
		if (primes[i])
		{
			textcolor(10);
			cout &lt;&lt; endl &lt;&lt; i &lt;&lt; &quot;: &quot;;
			textcolor(15);

			for (uint32_t j=2*i; j&lt;=primeLimit; j+=i)
			{
				if (j &lt; iMax)
					textcolor(12);
				else
					textcolor(15);
				cout &lt;&lt; j &lt;&lt; &quot; &quot;;

				primes[j] = false;
			}
		}
	}

	uint64_t elapsedTime = chrono::duration_cast&lt;chrono::milliseconds&gt;(chrono::system_clock::now() - start).count();

	textcolor(14);
	cout &lt;&lt; endl &lt;&lt; endl &lt;&lt; &quot;Primes: &quot;;
	for (uint32_t i=0; i&lt;=primeLimit; ++i)
	{		
		if (primes[i])
		{
			global_count++; // count the number of primes
			cout &lt;&lt; i &lt;&lt; &quot; &quot;;
		}			
	}

	textcolor(15);
	cout &lt;&lt; endl &lt;&lt; endl &lt;&lt; &quot;In &quot; &lt;&lt; elapsedTime &lt;&lt; &quot; ms we found &quot; &lt;&lt; global_count &lt;&lt; &quot; prime numbers (2 to &quot; &lt;&lt; primeLimit &lt;&lt; &quot; ).&quot; &lt;&lt; endl;
	wait();
}
</code></pre>
<p><a href="http://henkessoft.de/Sonstiges/SiebEratosthenes.png" rel="nofollow">http://henkessoft.de/Sonstiges/SiebEratosthenes.png</a></p>
<p>Die grünen Zahlen sind die beim Streichkonzert bis Wurzel aus n (hier: 900 ==&gt; 30) verbleibenden Primzahlen. Die roten Zahlen sind die bis Wurzel aus n in einer Multiplikationsreihe (2,3,5,...) gestrichenen Zahlen. Die weißen zahlen sind die über Wurzel aus n gestrichenen Zahlen. Die resultierenden Primzahlen sind in gelb dargestellt.</p>
<p>Man erkennt hier gut, dass viele Zahlen in den Multiplikationsreihen mehrfach gestrichen werden (Optimierungsmöglichkeit).</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/333951/sieb-des-eratosthenes-visualisierung</link><generator>RSS for Node</generator><lastBuildDate>Sun, 26 Apr 2026 06:31:49 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/333951.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 12 Aug 2015 23:15:01 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Sieb des Eratosthenes (Visualisierung) on Wed, 12 Aug 2015 23:15:01 GMT]]></title><description><![CDATA[<p>Mir geht es um eine Visualisierung des Siebs des Eratosthenes, also das Aufzeigen des Streichens von Zahlen.<br />
<a href="http://www.primzahlen.de/primzahltests/sieb_des_eratosthenes.htm" rel="nofollow">http://www.primzahlen.de/primzahltests/sieb_des_eratosthenes.htm</a></p>
<p>Ich habe mir folgende farbliche Darstellung in der Konsole überlegt:</p>
<pre><code>#define NOMINMAX     // due to conflict with max()
#include &lt;windows.h&gt; // warning: no C++ standard!
#include&lt;iostream&gt;
#include&lt;chrono&gt;
#include &lt;cstdint&gt;
#include &lt;cstdlib&gt;
#include &lt;vector&gt;
#include &lt;algorithm&gt;

using namespace std;

void wait()
{
	cout &lt;&lt; &quot;wait: Press any key to continue.&quot; &lt;&lt; endl;
	cin.clear();
	cin.ignore(numeric_limits&lt;streamsize&gt;::max(), '\n');
	cin.get();
}

void setConsole() // windows.h
{
	_CONSOLE_SCREEN_BUFFER_INFO info;
	HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);
	GetConsoleScreenBufferInfo(handle, &amp;info);
	COORD c;
	c.X = max&lt;SHORT&gt;(info.dwSize.X, 150);
	c.Y = max&lt;SHORT&gt;(info.dwSize.Y, 1000);
	SetConsoleScreenBufferSize(handle, c);

	SMALL_RECT RECT;
	RECT.Left = 0;
	RECT.Top = 0;
	RECT.Bottom = max(info.srWindow.Bottom - info.srWindow.Top, 40 - 1);
	RECT.Right = max(c.X - 1, 100 - 1);
	SetConsoleWindowInfo(handle, TRUE, &amp;RECT);
}

void textcolor(unsigned short color = 15)  // windows.h
{
	SetConsoleTextAttribute(::GetStdHandle(STD_OUTPUT_HANDLE), color);
}

int main()
{
	setConsole();
	uint32_t primeLimit = 900;
	vector&lt;bool&gt; primes(primeLimit+1);
	uint32_t global_count = 0; // total number of primes

	chrono::time_point&lt;chrono::system_clock&gt; start, last; // for measuring execution time
	start = chrono::system_clock::now(); 

	// initialize the number array
	primes[0] = false;
	primes[1] = false;

	for (uint32_t i=2; i&lt;=primeLimit; ++i)
	{
		primes[i] = true;
	}

	uint32_t iMax = (uint32_t)sqrt((double)primeLimit) + 1;

	// sieving loop
	for (uint32_t i=2; i&lt;iMax; ++i)
	{
		if (primes[i])
		{
			textcolor(10);
			cout &lt;&lt; endl &lt;&lt; i &lt;&lt; &quot;: &quot;;
			textcolor(15);

			for (uint32_t j=2*i; j&lt;=primeLimit; j+=i)
			{
				if (j &lt; iMax)
					textcolor(12);
				else
					textcolor(15);
				cout &lt;&lt; j &lt;&lt; &quot; &quot;;

				primes[j] = false;
			}
		}
	}

	uint64_t elapsedTime = chrono::duration_cast&lt;chrono::milliseconds&gt;(chrono::system_clock::now() - start).count();

	textcolor(14);
	cout &lt;&lt; endl &lt;&lt; endl &lt;&lt; &quot;Primes: &quot;;
	for (uint32_t i=0; i&lt;=primeLimit; ++i)
	{		
		if (primes[i])
		{
			global_count++; // count the number of primes
			cout &lt;&lt; i &lt;&lt; &quot; &quot;;
		}			
	}

	textcolor(15);
	cout &lt;&lt; endl &lt;&lt; endl &lt;&lt; &quot;In &quot; &lt;&lt; elapsedTime &lt;&lt; &quot; ms we found &quot; &lt;&lt; global_count &lt;&lt; &quot; prime numbers (2 to &quot; &lt;&lt; primeLimit &lt;&lt; &quot; ).&quot; &lt;&lt; endl;
	wait();
}
</code></pre>
<p><a href="http://henkessoft.de/Sonstiges/SiebEratosthenes.png" rel="nofollow">http://henkessoft.de/Sonstiges/SiebEratosthenes.png</a></p>
<p>Die grünen Zahlen sind die beim Streichkonzert bis Wurzel aus n (hier: 900 ==&gt; 30) verbleibenden Primzahlen. Die roten Zahlen sind die bis Wurzel aus n in einer Multiplikationsreihe (2,3,5,...) gestrichenen Zahlen. Die weißen zahlen sind die über Wurzel aus n gestrichenen Zahlen. Die resultierenden Primzahlen sind in gelb dargestellt.</p>
<p>Man erkennt hier gut, dass viele Zahlen in den Multiplikationsreihen mehrfach gestrichen werden (Optimierungsmöglichkeit).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2463632</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2463632</guid><dc:creator><![CDATA[Erhard Henkes]]></dc:creator><pubDate>Wed, 12 Aug 2015 23:15:01 GMT</pubDate></item><item><title><![CDATA[Reply to Sieb des Eratosthenes (Visualisierung) on Wed, 12 Aug 2015 23:50:04 GMT]]></title><description><![CDATA[<p>Erhard Henkes schrieb:</p>
<blockquote>
<p>Man erkennt hier gut, dass viele Zahlen in den Multiplikationsreihen mehrfach gestrichen werden (Optimierungsmöglichkeit).</p>
</blockquote>
<p>Also fangen wir beim Streichen doch einfach mal ganz dreist mit dem Quadrat einer Zahl als Anfangswert an. Alle kleineren Vielfachen sind ja logischerweise schon gestrichen worden. Und für N&gt;2 gehen wir in Doppelschritten weiter, denn jedes zweite vielfache ist ein Vielfaches von 2. Für 3 wird's schon trickreicher, denn wir wissen zwar, dass der direkte Nachfolger des Quadrats einer Primzahl eine gerade Zahl ist, aber wir wissen nicht, ob dieser Wert durch 3 teilbar ist. Überhaupt werden die Regeln, wie viele Vielfach man dann überspringen darf, dann so langsam kompliziert, aber es gibt gleichzeitig immer weniger Vielfache, so dass sich komplizierte Regeln immer weniger lohnen. Für 2 bringt es sicherlich was, für 3 und größere Primzahlen müsste man es mal vergleichen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2463638</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2463638</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Wed, 12 Aug 2015 23:50:04 GMT</pubDate></item><item><title><![CDATA[Reply to Sieb des Eratosthenes (Visualisierung) on Thu, 13 Aug 2015 05:14:08 GMT]]></title><description><![CDATA[<p>SeppJ schrieb:</p>
<blockquote>
<p>dann so langsam kompliziert, aber es gibt gleichzeitig immer weniger Vielfache, so dass sich komplizierte Regeln immer weniger lohnen. Für 2 bringt es sicherlich was, für 3 und größere Primzahlen müsste man es mal vergleichen.</p>
</blockquote>
<p>Man könnte im kleinen Bereich nachschauen, was im großen Bereich zu streichen ist.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2463643</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2463643</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Thu, 13 Aug 2015 05:14:08 GMT</pubDate></item><item><title><![CDATA[Reply to Sieb des Eratosthenes (Visualisierung) on Thu, 13 Aug 2015 10:26:14 GMT]]></title><description><![CDATA[<p>Was ist da jetzt das konkrete Problem?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2463672</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2463672</guid><dc:creator><![CDATA[TGGC]]></dc:creator><pubDate>Thu, 13 Aug 2015 10:26:14 GMT</pubDate></item><item><title><![CDATA[Reply to Sieb des Eratosthenes (Visualisierung) on Thu, 13 Aug 2015 13:06:47 GMT]]></title><description><![CDATA[<p>Bisher hatte ich noch keines, wollte lediglich den antiken Streichvorgang aber auch die weiteren Optimierungsmöglichkeiten des Original-Siebes aufzeigen. Dafür habe ich diese Konsolenanwendung mit verschiedenen Farben fabriziert. SeppJ und volkard kennen/suchen bereits weitere Geschwindigkeitssteigerungen. Mir geht es hier vor allem um die Didaktik bez. Original-Sieb.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2463706</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2463706</guid><dc:creator><![CDATA[Erhard Henkes]]></dc:creator><pubDate>Thu, 13 Aug 2015 13:06:47 GMT</pubDate></item><item><title><![CDATA[Reply to Sieb des Eratosthenes (Visualisierung) on Thu, 13 Aug 2015 15:41:18 GMT]]></title><description><![CDATA[<p>Also wenn es rein um Optimierung geht, dann sollte man doch erstmal Messungen auf dem konkreten System und dem angestrebten Primelimit machen. Ich wuerde vermuten das die Geschwindigkeit sobald das Array gross genug ist allein von der Schreibgeschwindigkeit im Speicher abhaengt. Dann waere es z.b. egal ob ich in 3er oder 6er Schritten iteriere und ob ich jetzt ein paar Werte spaeter anfange. Das Bitgefummel koennte auch genug Overhead haben, so das sich ab einer gewissen Laenge vorgefertigte Masken lohnen, wo man auf modernen Systemen dann ja 64 Werte auf einmal updaten kann. Evtl. lohnt sich sogar noch eine weitere Indirektion zwischenzuschalten um insgesamt weniger Werte in seinem Array ablegen zu müssen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2463717</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2463717</guid><dc:creator><![CDATA[TGGC]]></dc:creator><pubDate>Thu, 13 Aug 2015 15:41:18 GMT</pubDate></item></channel></rss>