<?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[Mein Primzahlprogramm]]></title><description><![CDATA[<p>Könnt ihr mal kurz ein Blick auf mein Programm werfen und schauen ob man am Vorgehen noch etwas verbessern könnte?<br />
Mir gehts um algorithmische Optimierungen und nicht darum mit Asm noch das letzte bischen rauszukitzeln.</p>
<pre><code class="language-cpp">template&lt; typename Listener &gt;
void findPrimes( unsigned to, Listener listener )
{
	if( !to ) return;

	const size_t size = size_t( to / 2.0 + 0.5 );

	vector&lt; unsigned &gt; primes;
	primes.resize( size );

	vector&lt; bool &gt; isPrime;
	isPrime.resize( size );

	primes[ 0 ] = 2;
	isPrime[ 0 ] = true;

	for( size_t i = 1, j = 3; i &lt; size; ++i, j += 2 )
	{
		primes[ i ] = j;
		isPrime[ i ] = true;
	}

	for( size_t i = 0; i &lt; size; ++i )
	{
		for( size_t j = i + 1; j &lt; size; ++j )
		{
			if( !isPrime[ j ] )
				continue;
			if( primes[ j ] % primes[ i ] == 0 )
				isPrime[ j ] = false;
		}
	}

	for( size_t i = 0; i &lt; size; ++i )
		if( isPrime[ i ] )
			listener( primes[ i ] );
}

void printPrime( unsigned prime )
{
	cout &lt;&lt; prime &lt;&lt; &quot; is a prime.\n&quot;;
}

int main()
{
	unsigned to;

	while( ( cout &lt;&lt; &quot;Gebe das Limit ein: &quot; ) &amp;&amp; !( cin &gt;&gt; to ) )
	{
		cout &lt;&lt; &quot;\nSo nicht versuchs nochmal!&quot; &lt;&lt; endl;
	}

	findPrimes( to, printPrime );
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/topic/170093/mein-primzahlprogramm</link><generator>RSS for Node</generator><lastBuildDate>Thu, 17 Sep 2026 00:05:25 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/170093.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 11 Jan 2007 17:25:48 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Mein Primzahlprogramm on Thu, 11 Jan 2007 17:25:48 GMT]]></title><description><![CDATA[<p>Könnt ihr mal kurz ein Blick auf mein Programm werfen und schauen ob man am Vorgehen noch etwas verbessern könnte?<br />
Mir gehts um algorithmische Optimierungen und nicht darum mit Asm noch das letzte bischen rauszukitzeln.</p>
<pre><code class="language-cpp">template&lt; typename Listener &gt;
void findPrimes( unsigned to, Listener listener )
{
	if( !to ) return;

	const size_t size = size_t( to / 2.0 + 0.5 );

	vector&lt; unsigned &gt; primes;
	primes.resize( size );

	vector&lt; bool &gt; isPrime;
	isPrime.resize( size );

	primes[ 0 ] = 2;
	isPrime[ 0 ] = true;

	for( size_t i = 1, j = 3; i &lt; size; ++i, j += 2 )
	{
		primes[ i ] = j;
		isPrime[ i ] = true;
	}

	for( size_t i = 0; i &lt; size; ++i )
	{
		for( size_t j = i + 1; j &lt; size; ++j )
		{
			if( !isPrime[ j ] )
				continue;
			if( primes[ j ] % primes[ i ] == 0 )
				isPrime[ j ] = false;
		}
	}

	for( size_t i = 0; i &lt; size; ++i )
		if( isPrime[ i ] )
			listener( primes[ i ] );
}

void printPrime( unsigned prime )
{
	cout &lt;&lt; prime &lt;&lt; &quot; is a prime.\n&quot;;
}

int main()
{
	unsigned to;

	while( ( cout &lt;&lt; &quot;Gebe das Limit ein: &quot; ) &amp;&amp; !( cin &gt;&gt; to ) )
	{
		cout &lt;&lt; &quot;\nSo nicht versuchs nochmal!&quot; &lt;&lt; endl;
	}

	findPrimes( to, printPrime );
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1208141</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1208141</guid><dc:creator><![CDATA[C++ Lernender]]></dc:creator><pubDate>Thu, 11 Jan 2007 17:25:48 GMT</pubDate></item><item><title><![CDATA[Reply to Mein Primzahlprogramm on Thu, 11 Jan 2007 17:53:56 GMT]]></title><description><![CDATA[<p>Naja, wenn du alle bisherigen Primzahlen kennst, reicht es, die Teilbarkeit der Zahl durch diese zu überprüfen.</p>
<pre><code class="language-cpp">primes.push_back (2);

for (unsigned j = 3; j &lt;= to; j += 2)
{
    std::vector&lt;unsigned&gt;::const_iterator i = primes.begin () + 1;
    for (; i != primes.end () &amp;&amp; ((j % *i) != 0) ; ++i)
        ;
    if (i == primes.end ())
        primes.push_back (j);
}
</code></pre>
<p>Code ungetestet. Das bekommt man sicherlich auch noch irgendwie schöner mit der STL hin.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1208157</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1208157</guid><dc:creator><![CDATA[.filmor]]></dc:creator><pubDate>Thu, 11 Jan 2007 17:53:56 GMT</pubDate></item><item><title><![CDATA[Reply to Mein Primzahlprogramm on Thu, 11 Jan 2007 18:46:51 GMT]]></title><description><![CDATA[<p>Die Idee ist gut, hab selber schon überlegt wie ich den Speicherverbrauch reduzieren kann und so vermeide ich gleich noch unnötige Tests.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1208179</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1208179</guid><dc:creator><![CDATA[C++ Lernender]]></dc:creator><pubDate>Thu, 11 Jan 2007 18:46:51 GMT</pubDate></item><item><title><![CDATA[Reply to Mein Primzahlprogramm on Thu, 11 Jan 2007 18:53:28 GMT]]></title><description><![CDATA[<p>Hab sie gleich mal umgesetzt:</p>
<pre><code class="language-cpp">template&lt; typename Listener &gt;
void findPrimes( unsigned to, Listener listener )
{
	if( to &lt; 2 ) return;

	vector&lt; unsigned &gt; primes;

	primes.push_back( 2 );

	for( size_t i = 3; i &lt;= to; i += 2 )
	{
		vector&lt; unsigned &gt;::const_iterator it = primes.begin(), end = primes.end();

		while( i % *it != 0 )
		{
			++it;
			if( it == end )
			{
				primes.push_back( i );
				break;
			}
		}
	}

	for_each( primes.begin(), primes.end(), listener );
}

void printPrime( unsigned prime )
{
	cout &lt;&lt; prime &lt;&lt; &quot; is a prime.\n&quot;;
}

int main()
{
	unsigned to;

	while( ( cout &lt;&lt; &quot;Gebe das Limit ein: &quot; ) &amp;&amp; !( cin &gt;&gt; to ) )
	{
		cout &lt;&lt; &quot;\nSo nicht versuchs nochmal!&quot; &lt;&lt; endl;
	}

	findPrimes( to, printPrime );
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1208180</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1208180</guid><dc:creator><![CDATA[C++ Lernender]]></dc:creator><pubDate>Thu, 11 Jan 2007 18:53:28 GMT</pubDate></item><item><title><![CDATA[Reply to Mein Primzahlprogramm on Thu, 11 Jan 2007 18:57:33 GMT]]></title><description><![CDATA[<p>Mir fällt gerade ein, dass ich den listener in dem if bereits benachrichtigen kann.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1208185</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1208185</guid><dc:creator><![CDATA[C++ Lernender]]></dc:creator><pubDate>Thu, 11 Jan 2007 18:57:33 GMT</pubDate></item><item><title><![CDATA[Reply to Mein Primzahlprogramm on Thu, 11 Jan 2007 19:25:13 GMT]]></title><description><![CDATA[<p>hab den code nur überflogen. Aber weist du dass eine zahl niemals einen Teiler haben kann der größer als sqrt(zahl) ist ? Ich konnte damit meinen Primzahl algorithmus um paar 100% beschleunigen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1208207</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1208207</guid><dc:creator><![CDATA[walljumper]]></dc:creator><pubDate>Thu, 11 Jan 2007 19:25:13 GMT</pubDate></item><item><title><![CDATA[Reply to Mein Primzahlprogramm on Thu, 11 Jan 2007 19:29:23 GMT]]></title><description><![CDATA[<p>walljumper schrieb:</p>
<blockquote>
<p>hab den code nur überflogen. Aber weist du dass eine zahl niemals einen Teiler haben kann der größer als sqrt(zahl) ist ? Ich konnte damit meinen Primzahl algorithmus um paar 100% beschleunigen.</p>
</blockquote>
<p>Weiß ich habs vorhin auch mal implementiert, nur ging es dann nicht, allerdings hab ich ganz vergessen, dass ich mein Programm geändert hatte es gibt gar nicht mehr die Primzahlen aus sondern wieviele es sind. Gut dass du mich nochmal dran erinnert hast <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1208211</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1208211</guid><dc:creator><![CDATA[C++ Lernender]]></dc:creator><pubDate>Thu, 11 Jan 2007 19:29:23 GMT</pubDate></item><item><title><![CDATA[Reply to Mein Primzahlprogramm on Thu, 11 Jan 2007 19:49:43 GMT]]></title><description><![CDATA[<p>Jetzt ist es richtig schnell, er braucht für die Primzahlen bis 1mio nur noch ~10Sekunden.<br />
Mit der zweiten Version oben brauchte er ungefähr so lange für die Primzahlen bis 100.000 (welcher er jetzt quasi sofort hat).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1208241</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1208241</guid><dc:creator><![CDATA[C++ Lernender]]></dc:creator><pubDate>Thu, 11 Jan 2007 19:49:43 GMT</pubDate></item><item><title><![CDATA[Reply to Mein Primzahlprogramm on Thu, 11 Jan 2007 19:56:33 GMT]]></title><description><![CDATA[<p>hmm muss an dem vielen stl liegen oder den templates weil mein code macht eigentlich das selbe nur das ich bis 1mio nur ~0,4 sec brauch.</p>
<pre><code>#include &lt;iostream&gt;
#include &lt;math&gt;
#include &lt;time&gt;
#pragma hdrstop
using namespace std;
//---------------------------------------------------------------------------

#pragma argsused
int main()
{
 int Primes[78499];
 int Zahl=1;
 int stop;
 int Prim=0;
 bool isPrime=true;
 double time1,time2;

 time1= -clock();
 Primes[0]=2;
 while(Zahl&lt;=1000000)
	{
	Zahl++;
	isPrime=true;
	stop = sqrt(Zahl);
	 for(int i=0;Primes[i]&lt;=stop;i++)
     	{
			if(Zahl%Primes[i]==0)
            	{
				isPrime=false;
				break;
                }
        }
	 if(isPrime)
     	{
		Prim++;
		Primes[Prim]=Zahl;

        }
	}
	time2=clock();
	cout&lt;&lt;Prim+1&lt;&lt;endl&lt;&lt;(time1+time2)/CLOCKS_PER_SEC;
	getchar();

	return 0;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1208249</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1208249</guid><dc:creator><![CDATA[walljumper]]></dc:creator><pubDate>Thu, 11 Jan 2007 19:56:33 GMT</pubDate></item><item><title><![CDATA[Reply to Mein Primzahlprogramm on Thu, 11 Jan 2007 20:02:42 GMT]]></title><description><![CDATA[<p>Jetzt wo du es sagst, ich hab ja noch das Debug-Build aktiviert <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f644.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_rolling_eyes"
      title=":rolling_eyes:"
      alt="🙄"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1208254</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1208254</guid><dc:creator><![CDATA[C++ Lernender]]></dc:creator><pubDate>Thu, 11 Jan 2007 20:02:42 GMT</pubDate></item><item><title><![CDATA[Reply to Mein Primzahlprogramm on Thu, 11 Jan 2007 20:06:59 GMT]]></title><description><![CDATA[<p>Gibts eine Möglichkeit abzuschätzen wieviele Primzahlen bis zur Obergrenze vorhanden sind?</p>
<p>Mir geht es nicht darum es genau abzuschätzen, ich weiß, dass das nicht möglich ist, aber gibt es einen groben Richtwert, der in etwa hinkommt, so dass ich bereits am Anfang das Array näherungsweise auf die tatsächliche Größe bringen kann?</p>
<p>Ich glaub so kann ich auch nochmal etwas Zeit gewinnen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1208258</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1208258</guid><dc:creator><![CDATA[C++ Lernender]]></dc:creator><pubDate>Thu, 11 Jan 2007 20:06:59 GMT</pubDate></item><item><title><![CDATA[Reply to Mein Primzahlprogramm on Thu, 11 Jan 2007 20:09:27 GMT]]></title><description><![CDATA[<p>Für die Primzahlen bis 100mio brauchte mein Programm jetzt ~3Minuten 45Sekunden.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1208262</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1208262</guid><dc:creator><![CDATA[C++ Lernender]]></dc:creator><pubDate>Thu, 11 Jan 2007 20:09:27 GMT</pubDate></item><item><title><![CDATA[Reply to Mein Primzahlprogramm on Thu, 11 Jan 2007 20:43:54 GMT]]></title><description><![CDATA[<p>Anzahl von Primzahlen für bestimmte Grenzen:<br />
<a href="http://www.michael-holzapfel.de/themen/primzahlen/pz-anzahl.htm" rel="nofollow">http://www.michael-holzapfel.de/themen/primzahlen/pz-anzahl.htm</a></p>
<p>Hatte da auch mal was gemacht,w erde gleich mal gucken, wo ichs hab.</p>
<p>Edit:<br />
Habs gefunden. Das braucht bis 10 Mio 470 ms. Basiert auf dem Sieb des Eratosthenes.</p>
<pre><code class="language-cpp">#include &lt;sstream&gt;
using std::istringstream;
#include &lt;iostream&gt;
using std::cout;
using std::endl;
#include &lt;cmath&gt;
#include &lt;ctime&gt;
using std::clock;
//using std::CLOCKS_PER_SEC;

long long countPrime(long long);

int main(int argc, char *argv[])
{
    if(argc &lt; 2)
        return 2;
    istringstream isst;
    long long border, res;
    isst.str(argv[1]);
    isst &gt;&gt; border;
    long start = clock();
    res = countPrime(border);
    long end = clock();
    cout &lt;&lt; res &lt;&lt; &quot; Primzahlen bis &quot; &lt;&lt; border &lt;&lt; &quot; in &quot; &lt;&lt; ((end-start)/static_cast&lt;double&gt;(CLOCKS_PER_SEC))*1000 &lt;&lt; &quot; ms bei &quot; &lt;&lt; (sizeof(char)*border+1)/(1024.0f*1024.0f) &lt;&lt; &quot; MB &quot;;

	return 0;
}

long long countPrime(long long border)
{
    char *mat = new char[border+1];
    mat[0] = mat[1] = 0;
    for(long long i=2;i&lt;border+1;i++)
    {
        mat[i] = 0;
        mat[++i] = 1;
    }

    long long s = static_cast&lt;long long&gt; (std::sqrt(border));
    long long p = 3;
    long long primeCount = border/2;
    bool foundNewP = false;

    while(p &lt;= s)
    {
        for(long long i=p*3;i&lt;=border;i+=p*2)
        {
            if(mat[i] != 0)
            {
                primeCount--;
                mat[i] = 0;
            }
        }

        foundNewP = false;
        for(long long i=p+1;i&lt;=s;i++)
        {
            if(mat[i] != 0)
            {
                p = i;
                foundNewP = true;
                break;
            }
        }

        if(!foundNewP)
            break;
    }

    delete[] mat;

    return primeCount;
}
</code></pre>
<p>Fehlen nur leider jegliche Kommentare, weil ich da einige Versuche gemacht hab und keine Lust immer alle zu kommentieren :&gt;</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1208264</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1208264</guid><dc:creator><![CDATA[viande]]></dc:creator><pubDate>Thu, 11 Jan 2007 20:43:54 GMT</pubDate></item><item><title><![CDATA[Reply to Mein Primzahlprogramm on Thu, 11 Jan 2007 21:42:07 GMT]]></title><description><![CDATA[<p>hab den alg noch bissel verbessert die Änderungen sind markiert brauche jetzt nur noch ~0,18 sec</p>
<pre><code class="language-cpp">//---------------------------------------------------------------------------
#include &lt;iostream&gt;
#include &lt;math&gt;
#include &lt;time&gt;
#pragma hdrstop
using namespace std;
//---------------------------------------------------------------------------
const int lim=1000000;
#pragma argsused
int main()
{
 double time1,time2;
 time1= -clock();
 unsigned int *Primes= new unsigned int[lim];
 bool *x= new bool[lim];   //   Änderung
 for(int i=0;i&lt;lim;i++)    //   Änderung
	x[i]=false;            //   Änderung

 unsigned int end=0;  //   Änderung
 unsigned int Zahl=1;
 unsigned int stop;
 unsigned int Prim=0;
 bool isPrime=true;

 Primes[0]=2;
 while(Zahl&lt;=lim)
	{
	Zahl+=2;
	if(x[Zahl]) continue;
	isPrime=true;
	stop = sqrt(Zahl);
	 for(int i=0;Primes[i]&lt;=stop;i++)
		{
			if(Zahl%Primes[i]==0)
				{
				isPrime=false;
				break;
				}
		}
	 if(isPrime)
		{
		Prim++;
		Primes[Prim]=Zahl;
		end=lim/Zahl;           	 	//   Änderung
		for(unsigned int i=2;i&lt;end;i++) //   Änderung
			x[i*Zahl]=true;      		//   Änderung

		}
	}
	time2=clock();
	cout&lt;&lt;Prim+1&lt;&lt;endl&lt;&lt;(time1+time2)/CLOCKS_PER_SEC;
	getchar();

	return 0;
}
</code></pre>
<p>bis 100 mio brauch ich 126 sec<br />
bis 10 mio 4,5 sec</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1208307</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1208307</guid><dc:creator><![CDATA[walljumper]]></dc:creator><pubDate>Thu, 11 Jan 2007 21:42:07 GMT</pubDate></item><item><title><![CDATA[Reply to Mein Primzahlprogramm on Thu, 11 Jan 2007 21:46:54 GMT]]></title><description><![CDATA[<p>Ich frag mich warum eure beiden so viel schneller sind wie meiner.<br />
Testet meinen mal bitte bei euch und sagt mal wie lang er da braucht.</p>
<pre><code class="language-cpp">unsigned calcNext( unsigned n, unsigned i )
{
	return ( n + i / n ) &gt;&gt; 1;
}

unsigned int isqrt( unsigned number ) 
{
	unsigned int n  = 1;
	unsigned int n1 = calcNext( n, number );

	while( abs( int( n1 - n ) ) &gt; 1 ) 
	{
		n  = n1;
		n1 = calcNext( n, number );
	}
	while( ( n1 * n1 ) &gt; number )
	{
		n1 -= 1;
	}
	return n1;
}

template&lt; typename Listener &gt;
void findPrimes( unsigned to, Listener listener )
{
	if( to &lt; 2 ) return;

	vector&lt; unsigned &gt; primes;
	primes.reserve( to / 2 );

	primes.push_back( 2 );
	listener( 2 );

	for( unsigned i = 3; i &lt;= to; i += 2 )
	{
		vector&lt; unsigned &gt;::const_iterator it = primes.begin(), end = primes.end();

		const unsigned sqr = unsigned( isqrt( double( i ) ) );

		while( i % *it != 0 )
		{
			++it;
			if( *it &gt; sqr || it == end )
			{
				primes.push_back( i );
				listener( i );
				break;
			}
		}
	}
}

unsigned printPrime( unsigned prime )
{
	static unsigned size = 0;

	return ++size;
}

__int64 GetPerformanceFrequency()
{
	__int64 frequ = 0;
	QueryPerformanceFrequency( reinterpret_cast&lt; LARGE_INTEGER* &gt;( &amp;frequ ) );
	return frequ;

	}

	__int64 GetTimeMS()
	{
		static __int64 frequ = GetPerformanceFrequency() / 1000;
		__int64 perfcount;
		QueryPerformanceCounter( reinterpret_cast&lt; LARGE_INTEGER* &gt;( &amp;perfcount ) );
		return perfcount / frequ;
	}

int main()
{
	unsigned to;

	while( ( cout &lt;&lt; &quot;Gebe das Limit ein: &quot; ) &amp;&amp; !( cin &gt;&gt; to ) )
	{
		cout &lt;&lt; &quot;\nSo nicht versuchs nochmal!&quot; &lt;&lt; endl;
	}

	__int64 start = GetTimeMS();

	findPrimes( to, printPrime );

	__int64 end = GetTimeMS();

	cout &lt;&lt; printPrime( 1 ) - 1 &lt;&lt; endl &lt;&lt; &quot;Duration: &quot; &lt;&lt; end - start &lt;&lt; &quot;ms&quot;;

}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1208312</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1208312</guid><dc:creator><![CDATA[C++ Lernender]]></dc:creator><pubDate>Thu, 11 Jan 2007 21:46:54 GMT</pubDate></item><item><title><![CDATA[Reply to Mein Primzahlprogramm on Thu, 11 Jan 2007 21:49:07 GMT]]></title><description><![CDATA[<p>Sehe gerade, ich hab noch nen alten Überrest im Code gehabt:</p>
<pre><code class="language-cpp">wurzel sollte so aussehen:

const unsigned sqr = isqrt( i );
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1208316</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1208316</guid><dc:creator><![CDATA[C++ Lernender]]></dc:creator><pubDate>Thu, 11 Jan 2007 21:49:07 GMT</pubDate></item><item><title><![CDATA[Reply to Mein Primzahlprogramm on Thu, 11 Jan 2007 22:00:54 GMT]]></title><description><![CDATA[<p>dein code braucht bei mir bis 100mio 4 minuten und 24 sec</p>
<p>dein code ist langsamer weil du die stl verwendest.Wenn ich vectoren verwenden würde wäre mein code auch langsamer.</p>
<p>viande hat den bis jetzt wohl besten algorithmus wobei ich da noch etwas optimierungspotential in der implemetierung sehe.<br />
z.B. im Schleifen kopf so wenig wie möglich rechnen die abbruch bedingung vorher ausrechnen da sie sonst bei jedem durchlauf erneut berechnet wird.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1208324</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1208324</guid><dc:creator><![CDATA[walljumper]]></dc:creator><pubDate>Thu, 11 Jan 2007 22:00:54 GMT</pubDate></item><item><title><![CDATA[Reply to Mein Primzahlprogramm on Fri, 12 Jan 2007 06:59:51 GMT]]></title><description><![CDATA[<p>Mh nagut, kann mir aber vorstellen, dass der Compiler sowas selber macht. Hatte das irgendwie übersehen <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /><br />
Achso, bis 100 Mio brauch das Ding 5 Sek und 1 Milliarde passt leider nicht in meinen Ram (hab nur 768 MB :(). Wollte das Ding auch mal so umbauen, dass man eine Zahl pro Bit hat und nicht pro byte, aber war irgendwie nicht dazu gekommen. Vielleicht setz ich mich da nochmal ran <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1208419</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1208419</guid><dc:creator><![CDATA[viande@work]]></dc:creator><pubDate>Fri, 12 Jan 2007 06:59:51 GMT</pubDate></item><item><title><![CDATA[Reply to Mein Primzahlprogramm on Fri, 12 Jan 2007 08:45:27 GMT]]></title><description><![CDATA[<p>Der erste Ansatz, funktioniert zwar und verbraucht wesentlich weniger Speicher, aber ist auch ziemlich lahm und hässlich <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--disappointed_face"
      title=":("
      alt="😞"
    /> Braucht etwa 20 Sek. auf meinem gammel Rechner hier auf der Arbeit bis 10 Mio.<br />
Zum Vergleich: der andere braucht 1,6 Sek.</p>
<p>PS: Wer Angst vor Augenkrebs hat, sollte sich das nicht angucken <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /><br />
PPS: RDTSC holt CPU-Ticks. Ist eigentlich von INTEL, aber AMD hat das inzwischen auch. Ist aber für den Algo irrelevant.</p>
<pre><code class="language-cpp">#include &lt;sstream&gt;
using std::istringstream;
#include &lt;iostream&gt;
using std::cout;
using std::endl;
#include &lt;cmath&gt;
#include &lt;ctime&gt;
using std::clock;

#define RDTSC(llptr) { \
__asm__ __volatile__ ( \
&quot;rdtsc&quot; \
: &quot;=A&quot; (llptr) \
); }

long long countPrime(long long);

namespace bit
{
    char const bit[] = {
    0x80, //10000000
    0x40, //01000000
    0x20, //00100000
    0x10, //00010000
    0x8,  //00001000
    0x4,  //00000100
    0x2,  //00000010
    0x1   //00000001
    };
    const char all = 0xFF;//11111111
    const char odd = 0x55; //01010101 -&gt; for example the second byte:
                             //8, 9, 10, 11, 12, 13, 14, 15 we set only the odd numbers
}

namespace revBit
{
    char const bit[] = {
    0x7F, //01111111
    0xBF, //10111111
    0xDF, //11011111
    0xEF, //11101111
    0xF7, //11110111
    0xFB, //11111011
    0xFD, //11111101
    0xFE  //11111110
    };
    const char all = 0x0; //00000000
}

int main(int argc, char *argv[])
{
    if(argc &lt; 2)
        return 1;
    istringstream isst;
    long long border, res;
    isst.str(argv[1]);
    isst &gt;&gt; border;

    long start = clock();
    res = countPrime(border);
    long end = clock();
    cout &lt;&lt; res &lt;&lt; &quot; Primzahlen bis &quot; &lt;&lt; border &lt;&lt; &quot; in &quot; &lt;&lt; ((end-start)/static_cast&lt;double&gt;(CLOCKS_PER_SEC))*1000 &lt;&lt; &quot; ms at &quot; &lt;&lt; (sizeof(char)*std::floor(border/8.0f))/(1024.0f*1024.0f) &lt;&lt; &quot; MB &quot;;

	return 0;
}

long long countPrime(long long border)
{
    //unsigned long long start, end;
    //RDTSC(start);

    long long size = static_cast&lt;long long&gt;(std::ceil(border/8.0f));
    char *mat = new char[size];
    for(long long i=0;i&lt;size;i++)
        mat[i] = bit::odd;
    mat[0] &amp;= revBit::bit[1]; //unset 1
    for(int i=8-(size*8-border)+1;i&lt;8;i++)//unset the unused bits at the end
        mat[size-1] &amp;= revBit::bit[i];

    long double s = std::sqrt(border);
    long long sSize = static_cast&lt;long long&gt;(std::ceil(s/8));
    long long p = 3;
    long long sVal = p * 3;
    long long addVal = p * 2;
    long long primes = border/2; //we exclude the even numbers
    bool foundNewP = false;
    long long posArr = 0, posBit = 4; //position of 3 + 1 (next element)

    //RDTSC(end);
    //cout &lt;&lt; &quot;clock cycles (init): &quot; &lt;&lt; end - start &lt;&lt; endl;

    while(p &lt; s)
    {
        for(long long i=0;i&lt;size;i++)
        {
            //RDTSC(start);
            if(sVal &gt; 7)
            {
                sVal = sVal - 8;
                continue;
            }
            //RDTSC(end);
            //cout &lt;&lt; &quot;clock cycles (eleminate): &quot; &lt;&lt; end - start &lt;&lt; endl;
            for(;sVal&lt;8;sVal+=addVal)
            {
                if(mat[i] &amp; bit::bit[sVal])
                {
                    mat[i] &amp;= revBit::bit[sVal];
                    primes--;
                }
            }
            if(sVal &gt; 7)
                sVal = sVal - 8;
        }

        //RDTSC(start);
        foundNewP = false;
        for(;posArr&lt;sSize;posArr++)
        {
            for(;posBit&lt;8;posBit++)
            {
                if(mat[posArr] &amp; bit::bit[posBit])
                {
                    p = posArr * 8 + posBit;
                    sVal = p * 3;
                    addVal = p * 2;
                    foundNewP = true;

                    if(posBit &gt;= 7)
                    {
                        posArr++;
                        posBit = 0;
                    }
                    else
                        posBit++;
                    break;
                }
            }
            if(foundNewP)
                break;
            if(posBit &gt;= 7)
                posBit = 0;
        }
        //RDTSC(end);
        //cout &lt;&lt; &quot;clock cycles (search): &quot; &lt;&lt; end - start &lt;&lt; endl;
        if(!foundNewP)
            break;
    }

    delete[] mat;

    return primes;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1208462</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1208462</guid><dc:creator><![CDATA[viande@work]]></dc:creator><pubDate>Fri, 12 Jan 2007 08:45:27 GMT</pubDate></item><item><title><![CDATA[Reply to Mein Primzahlprogramm on Fri, 12 Jan 2007 10:25:03 GMT]]></title><description><![CDATA[<p>Ich weiß, dass Doppelposting nervt, aber deswegen habe ich jetzt mal eingeloggt :p<br />
Langsam fängt das an Spaß zu machen. Also, ich habe das mit den einzelnen Bits nochmal vernünftig gemacht. Das läuft etwa doppelt so schnell wie mein Ausgangsversuch und verbraucht dabei auch noch viel weniger Speicher. Ich habe auch mal ein paar Kommentare reingeworfen.</p>
<pre><code class="language-cpp">#include &lt;climits&gt;
#include &lt;cmath&gt;
#include &lt;ctime&gt;

#include &lt;sstream&gt;
#include &lt;iostream&gt;

using std::istringstream;
using std::cout;
using std::endl;
using std::clock;

//Bits pro Wort
#define BITS_PER_WORD (CHAR_BIT*sizeof(unsigned long))
//Anzahl der benötigten Wörter, um die Bits aufzunehmen
#define WORDS(n) \
 ((n) &lt; 1 ? 1 : ((n) + BITS_PER_WORD - 1)/BITS_PER_WORD)

typedef unsigned long word;
typedef unsigned long long ull;

static const word WORD_MAX = ULONG_MAX;

ull countPrime(ull);

namespace bit
{
    word bit[BITS_PER_WORD]; //Bits an einer bestimmten Position
    word revBit[BITS_PER_WORD]; //alle Bits, bis auf das einer bestimmten Position
                                //(Umkehrung von bit::bit)
    const word odd = 0xAAAAAAAA; //setzt alle ungeraden Bits für ein 32 Bit Int

    void init() //initialisierung der Bits(keine Lust die ganzen Matrizen von Handzu machen :p)
                //ich hoffe einfach mal, dass der Compiler sieht, dass das alles Konstanten sind :o
    {
        for(unsigned int i=0;i&lt;BITS_PER_WORD;i++)
            bit[i] = static_cast&lt;word&gt;(1) &lt;&lt; (i % BITS_PER_WORD);
        for(unsigned int i=0;i&lt;BITS_PER_WORD;i++)
            revBit[i] = ~(static_cast&lt;word&gt;(1) &lt;&lt; (i % BITS_PER_WORD));
    }

    bool test_bit(word* mat, ull _pos) //Bit in _pos testen
    {
        return mat[_pos/BITS_PER_WORD] &amp; bit[_pos % BITS_PER_WORD];
    }

    void unset_bit(word* mat, ull _pos) //Bit in _pos auf 0 setzen
    {
        mat[_pos/BITS_PER_WORD] &amp;= revBit[_pos % BITS_PER_WORD];
    }

    void set_odd_bits(word* mat, ull _size) //alle ungeraden Bits setzen
    {
        for(unsigned long long i=0;i&lt;_size;i++)
        {
            mat[i] = odd;
        }
    }
}

int main(int argc, char *argv[])
{
    if(argc &lt; 2)
        return 1;
    istringstream isst;
    ull border, res;
    isst.str(argv[1]);
    isst &gt;&gt; border;

    bit::init();

    long start = clock();
    res = countPrime(border);
    long end = clock();

    cout &lt;&lt; res &lt;&lt; &quot; Primzahlen bis &quot; &lt;&lt; border
    &lt;&lt; &quot; in &quot; &lt;&lt; ((end-start)/static_cast&lt;double&gt;(CLOCKS_PER_SEC))*1000
    &lt;&lt; &quot; ms bei &quot; &lt;&lt; (sizeof(word)*WORDS(border))/(1024.0f*1024.0f) &lt;&lt; &quot; MB &quot;;

    return 0;
}

ull countPrime(ull border)
{
    size_t size = WORDS(border+1);
    word *mat = new word[size];

    bit::set_odd_bits(mat, size);

    //0 und 1 sind keine Primzahlen :)
    bit::unset_bit(mat, 0);
    bit::unset_bit(mat, 1);

    ull s = static_cast&lt;unsigned long long&gt; (std::sqrt(border)); //obere Schranke

    ull p = 3, t; //da die 2 bereits ausgeschlossen ist, fangen wir bei 3 an

    ull primeCount = border/2; //die 2 ist weg, also auch die Hälfte der möglichen Primzahlen

    bool foundNewP = false; //wird gesetzt, wenn eine neue Primzahl gefunden wird

    while(p &lt;= s) //es wird nur bis zur oberen Schranke iteriert
    {
        t = p * 2; //die Addition von 2 ungeraden Zahlen ergibt wiederum eine gerade
                    //die brauchen wir aber nicht testen

        //@i = p * 3 : p selber ist ist prim, wird daher nicht ausgeschlossen
        //P * 2 ist gerade, somit fangen wir erst bei p * 3 an
        for(ull i=p*3;i&lt;=border;i+=t)
        {
            if(bit::test_bit(mat, i))
            {
                primeCount--;
                bit::unset_bit(mat, i);
            }
        }

        foundNewP = false;
        for(unsigned long long i=p+1;i&lt;=s;i++)
        {
            if(bit::test_bit(mat, i))
            {
                p = i;
                foundNewP = true;
                break;
            }
        }

        if(!foundNewP)
            break;
    }

    delete[] mat;

    return primeCount;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1208550</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1208550</guid><dc:creator><![CDATA[viande]]></dc:creator><pubDate>Fri, 12 Jan 2007 10:25:03 GMT</pubDate></item><item><title><![CDATA[Reply to Mein Primzahlprogramm on Fri, 12 Jan 2007 10:46:35 GMT]]></title><description><![CDATA[<p>Ich hab im Netz mal einen Prime-Sieve basierenden Code gefunden:</p>
<p>Zeiten auf meinem Arbeitsrechner, AMD Athlon XP 3200+ (ist noch ein alter 32bitter), 1 GB RAM:<br />
1 - 1.000.000: 0,219 Sek<br />
1 - 10.000.000: 0,296 Sek<br />
1 - 100.000.000: 1,156 Sek<br />
1 - 1.000.000.000: 9,875 Sek</p>
<p>Der Code ist von Kim Walisch, ich finde im Moment den Link aber nicht mehr. Was schnelleres habe ich damals nicht gefunden...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1208570</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1208570</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Fri, 12 Jan 2007 10:46:35 GMT</pubDate></item><item><title><![CDATA[Reply to Mein Primzahlprogramm on Fri, 12 Jan 2007 10:49:33 GMT]]></title><description><![CDATA[<p>Auf planet3dnow hat einer bis 4mrd in 1,5sec geschafft</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1208575</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1208575</guid><dc:creator><![CDATA[walljumper@schule]]></dc:creator><pubDate>Fri, 12 Jan 2007 10:49:33 GMT</pubDate></item><item><title><![CDATA[Reply to Mein Primzahlprogramm on Fri, 12 Jan 2007 10:59:27 GMT]]></title><description><![CDATA[<p>Aber bestimmt nicht auf so einer lahmen Kröte wie meiner...</p>
<p>Ich hab den Link wiedergefunden: <a href="http://www.primzahlen.de/files/referent/kw/index.htm" rel="nofollow">http://www.primzahlen.de/files/referent/kw/index.htm</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1208586</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1208586</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Fri, 12 Jan 2007 10:59:27 GMT</pubDate></item><item><title><![CDATA[Reply to Mein Primzahlprogramm on Fri, 12 Jan 2007 22:18:18 GMT]]></title><description><![CDATA[<p>ne war ein Core2duo <a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/5290">@3</a>,2ghz trotzdem ist sein alg um einiges besser</p>
<p>Was ich erstaunlich find ist das mein code bis 1mio wesentlich schneller ist als deiner aber bei 10mio ist meiner viel langsamer.</p>
<p>hab jetzt bis 1mio 0,032sec<br />
bis 10 mio ~2,2 sec</p>
<p>mein code wird nur langsam etwas unübersichtlich ^^ sollte da vieleicht mal aufräumen.</p>
<pre><code class="language-cpp">//---------------------------------------------------------------------------
#include&lt;iostream&gt;
#include&lt;time.h&gt;
#include&lt;fastmath.h&gt;
#pragma hdrstop
using namespace std;
//---------------------------------------------------------------------------
typedef unsigned int Int;
const Int lim=1000000;

int main()
{
double time1,time2,time3,time4;
time1=-clock();
// TEST ALGORITHMUS BEGIN
{
 bool *test = new bool[lim];
 for(Int i=0;i&lt;lim;++i)
	test[i]=false;
 Int *Primes = new Int[lim];	

 Int firstborder = sqrt(lim);
 Int end;
 Int Zahl=1;
 Int stop;
 Int Prim=0;
 Int P2;
 Int tmp;
 Int start;
 bool isPrime;

 Primes[0]=2;

 while(Zahl&lt;=firstborder)
	{
	Zahl+=2;
	if(test[Zahl]) continue;
	isPrime=true;
	stop = sqrt((float)Zahl);
	 for(Int i=0;Primes[i]&lt;=stop;++i)
		{
			if(Zahl%Primes[i]==0)
				{
				isPrime=false;

				break;	
				}
		}
	 if(isPrime)
		{
		++Prim;
		Primes[Prim]=Zahl;
		end=lim/Zahl;
		for(Int i=2;i&lt;end;++i)
			test[i*Zahl]=true;

		}
	}
	for(Int i=firstborder;i&lt;lim;++i)
		{
			test[i]=true;
		}
 P2=Prim;
 time3=-clock();
 for(Int i=0;i&lt;Prim;++i)
	{
		end=lim/Primes[i];
		start=firstborder/Primes[i];
		for(Int n=start;n&lt;=end;++n)
			{
			tmp=n*Primes[i];
			test[tmp]=false;
			}
	}
	time4=clock();
 for(Int i=firstborder;i&lt;lim;++i)
		{
			if(test[i]) ++P2;
		}
cout&lt;&lt;P2;
}
// TEST ALGORITHMUS END
time2 = clock();
cout&lt;&lt;endl&lt;&lt;(time1+time2)/CLOCKS_PER_SEC&lt;&lt;endl&lt;&lt;(time3+time4)/CLOCKS_PER_SEC;
getchar();
	return 0;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1209080</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1209080</guid><dc:creator><![CDATA[walljumper]]></dc:creator><pubDate>Fri, 12 Jan 2007 22:18:18 GMT</pubDate></item><item><title><![CDATA[Reply to Mein Primzahlprogramm on Fri, 12 Jan 2007 22:54:35 GMT]]></title><description><![CDATA[<p>Hmmm... in einem Primzahlenthread darf mein altes Primzahlzählprogramm nicht fehlen. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /> ...in Java:</p>
<pre><code class="language-java">public class TestPrime
{
   public TestPrime ()
   {
   }

   public static void main (String[] args)
   {
      int end = 1000000000;
      long time = System.currentTimeMillis ();
      int [] sieve = new int [(end &gt;&gt; 5) + 1];
      int x, y, i;
      int primes = 1;
      int sqrt = (int)Math.sqrt((double)end);
      x = 3;
      while (x &lt;= sqrt)
      {
         if ((sieve[x &gt;&gt; 5] &amp; (0x1 &lt;&lt; (x &amp; 0x1f))) == 0)
         {
            y = x * x;
            i = x &lt;&lt; 1;
            ++primes;
            while (end &gt; y)
            {
               sieve[y &gt;&gt; 5] |= (0x1 &lt;&lt; (y &amp; 0x1f));
               y += i;
            }
         }
         x += 2;
      }
      while (x &lt;= end)
      {
         if ((sieve[x &gt;&gt; 5] &amp; (0x1 &lt;&lt; (x &amp; 0x1f))) == 0) ++primes;
         x += 2;
      }
      System.out.println (&quot;Zwischen 0 und &quot; + end +
                          &quot; liegen &quot; + primes + &quot; Primzahlen.&quot;);
      System.out.println (&quot;GesamtZeit : &quot; +
                          (System.currentTimeMillis () - time) +
                           &quot; Millisekunden&quot;);
   }
}
</code></pre>
<pre><code>gregor@linux:~/JavaProjects/Test/TestPrime&gt; /opt/jdk1.6.0/bin/java -Xmx192m TestPrime
Zwischen 0 und 1000000000 liegen 50847534 Primzahlen.
GesamtZeit : 41291 Millisekunden
</code></pre>
<p>Auf einem Pentium M mit 1,86GHz, 512MB RAM.</p>
<p>BTW: Bei den neuen Mehrkernprozessoren könnte man sich ja mal überlegen, ob man da irgendwie einen parallel arbeitenden Algorithmus schreiben kann.</p>
<p>EDIT: volkard hatte damals noch etwas deutlich schnelleres anzubieten. Vielleicht postet er seinen Code ja auch nochmal. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1209092</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1209092</guid><dc:creator><![CDATA[Gregor]]></dc:creator><pubDate>Fri, 12 Jan 2007 22:54:35 GMT</pubDate></item></channel></rss>