<?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[Goldbach Vermutung]]></title><description><![CDATA[<p>Kann man dieses Programm deutlich beschleunigen?<br />
<a href="http://henkessoft.de/C++/C++/cpp_konsole.htm#mozTocId167626" rel="nofollow">http://henkessoft.de/C++/C++/cpp_konsole.htm#mozTocId167626</a></p>
]]></description><link>https://www.c-plusplus.net/forum/topic/333757/goldbach-vermutung</link><generator>RSS for Node</generator><lastBuildDate>Wed, 07 Oct 2026 16:40:00 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/333757.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 29 Jul 2015 15:07:56 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Goldbach Vermutung on Wed, 29 Jul 2015 15:07:56 GMT]]></title><description><![CDATA[<p>Kann man dieses Programm deutlich beschleunigen?<br />
<a href="http://henkessoft.de/C++/C++/cpp_konsole.htm#mozTocId167626" rel="nofollow">http://henkessoft.de/C++/C++/cpp_konsole.htm#mozTocId167626</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2461477</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2461477</guid><dc:creator><![CDATA[Erhard Henkes]]></dc:creator><pubDate>Wed, 29 Jul 2015 15:07:56 GMT</pubDate></item><item><title><![CDATA[Reply to Goldbach Vermutung on Wed, 29 Jul 2015 15:11:55 GMT]]></title><description><![CDATA[<p>Aber Hallo! isPrime() ist echt lahm. Google hilft!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2461479</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2461479</guid><dc:creator><![CDATA[Primzahlezauber]]></dc:creator><pubDate>Wed, 29 Jul 2015 15:11:55 GMT</pubDate></item><item><title><![CDATA[Reply to Goldbach Vermutung on Wed, 29 Jul 2015 15:34:27 GMT]]></title><description><![CDATA[<p>Ja, klar, ist als Tutorial-Aufgabe gedacht.</p>
<p>vorher: 500000 time: 247545 ms<br />
number/2 ==&gt; 122772 ms<br />
sqrt(number) ==&gt; 5375 ms</p>
<p>Solange kein Gegenbeweis auftaucht, wird zumindest ein Paar Primzahlen gefunden.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2461481</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2461481</guid><dc:creator><![CDATA[Erhard Henkes]]></dc:creator><pubDate>Wed, 29 Jul 2015 15:34:27 GMT</pubDate></item><item><title><![CDATA[Reply to Goldbach Vermutung on Wed, 29 Jul 2015 15:33:41 GMT]]></title><description><![CDATA[<p>Dein Programm ist O(n<sup>2</sup>). Mit gescheitem Primzahltest (=2 Zeichen hinzufügen) kommt man auf O(n<sup>1.5</sup>). Mit einem Sieb erhält man O(n log log n).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2461482</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2461482</guid><dc:creator><![CDATA[siebert]]></dc:creator><pubDate>Wed, 29 Jul 2015 15:33:41 GMT</pubDate></item><item><title><![CDATA[Reply to Goldbach Vermutung on Wed, 29 Jul 2015 15:47:16 GMT]]></title><description><![CDATA[<p>Erhard Henkes schrieb:</p>
<blockquote>
<p>Ja, klar, ist als Tutorial-Aufgabe gedacht.</p>
<p>vorher: 500000 time: 247545 ms<br />
number/2 ==&gt; 122772 ms<br />
sqrt(number) ==&gt; 5375 ms</p>
</blockquote>
<p>Das würde ich nicht als Optimierung im programmiertechnischen Sinn sehen.<br />
Das ist einfach eine mathematische Überlegung, dass es nichts bringt weiter als bis sqrt(number) zu testen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2461484</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2461484</guid><dc:creator><![CDATA[scrontch]]></dc:creator><pubDate>Wed, 29 Jul 2015 15:47:16 GMT</pubDate></item><item><title><![CDATA[Reply to Goldbach Vermutung on Wed, 29 Jul 2015 16:12:37 GMT]]></title><description><![CDATA[<p>Ist aber eine gute Lektion, dass Verbesserung der Algorithmen i.d.R. mehr bringt als Mikrooptimierungen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2461490</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2461490</guid><dc:creator><![CDATA[Mr X]]></dc:creator><pubDate>Wed, 29 Jul 2015 16:12:37 GMT</pubDate></item><item><title><![CDATA[Reply to Goldbach Vermutung on Wed, 29 Jul 2015 17:40:07 GMT]]></title><description><![CDATA[<p>Original:<br />
500000 time: 306070 ms</p>
<pre><code class="language-cpp">for (unsigned int i=2; i&lt;number/2; i++)
</code></pre>
<p>500000 time: 276635 ms</p>
<pre><code class="language-cpp">for (unsigned int i=2; i&lt;=sqrt(number); i++)
</code></pre>
<p>500000 time: 1624 ms</p>
<p>irgendwie fühlt sich sqrt komisch an.<br />
i&lt;=sqrt(number) |()²<br />
würde ich als Hausfrau schreiben als<br />
i²&lt;=number<br />
//eigentlich Basiswissen. Man *sollte* es ausprobieren.<br />
//ok, ja, ich weiß, man ist Betriebsblind. Schulmathe UND Proggern geht nicht gleichzeitig.<br />
//Das müssen die neuen Leute aber mal verinnerlichen, daß gerade die Schulmathe undglaublich<br />
//hilfreich ist.</p>
<pre><code class="language-cpp">for (unsigned int i=2; i*i&lt;=number; i++)
</code></pre>
<p>500000 time: 1422 ms</p>
<p>Warum auch gerade Teiler testen, macht man per Hand ja auch nicht.<br />
//GAANZ WICHTIG: Immer schauen, wie man es per Hand macht, da hat man gute<br />
//Intuition oder sowas.</p>
<pre><code class="language-cpp">if(number&lt;2) return false;
if(number==2) return true;
if(number%2==0) return false;
for (unsigned int i=3; i*i&lt;=number; i+=2)
</code></pre>
<p>500000 time: 347 ms</p>
<p>Nebenbei:<br />
// if(i%25000 == 0)<br />
// {<br />
// zeit2 = clock();<br />
// cout &lt;&lt; i &lt;&lt; &quot;\ttime: &quot; &lt;&lt; 1000 * (zeit2-zeit1) / CLOCKS_PER_SEC &lt;&lt; &quot; ms&quot; &lt;&lt; endl;<br />
// }<br />
...<br />
zeit2 = clock();<br />
cout &lt;&lt; 500000 &lt;&lt; &quot;\ttime: &quot; &lt;&lt; 1000 * (zeit2-zeit1) / CLOCKS_PER_SEC &lt;&lt; &quot; ms&quot; &lt;&lt; endl;<br />
War nicht ok, die Zeitmessung so in den Algo zu vermengern.</p>
<p>No was Wichtiges:<br />
gegenbeweis ist eine &quot;künstliche Variable&quot;!<br />
So eine, die das Exit-Pfeilchen im Struktogramm vermeidet.<br />
Die schickt man immer(!) nach Hause durch Auslagern ein eine Funktion.</p>
<p>Hab auch den Namespace weggemacht, weil man den bringen sollte, wenn er was bringt, hier ist er Ballast.<br />
Und die {}, wenn nur ein Befwehl folgt, weil optimalerweise folgt so verdammt oft nur ein Befehl, daß man<br />
kaum {} braucht.<br />
Das führt dann dummerweise dazu, daß die Einrückung viel viel mehr Gewicht hat als die Klammern, dann<br />
zieht man vielleicht die { nach oben. Habs als Exempel mal gemacht. Also ich denke dahingehend in Python<br />
und NUR die Einrückung bestimmt die Verschachtelung. Die { sind halt aus Tradition gefordert.</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;ctime&gt;
using namespace std;

//Goldbachsche Vermutung:
//Jede gerade Zahl größer als 2 kann als Summe
//zweier Primzahlen geschrieben werden.

bool IsPrime(unsigned int number){
	if(number&lt;2) return false;
	if(number==2) return true;
	if(number%2==0) return false;
	for(unsigned int i=3; i*i&lt;=number; i+=2)
		if(number%i == 0)
			return false;
	return true;
}

bool IstGoldig(unsigned int i){
	for(unsigned int a=2; a&lt;i; a++)
		if(IsPrime(a) &amp;&amp; IsPrime(i-a))
			return true;
	return false;
}

int main(){
	clock_t zeit1 , zeit2;
	unsigned int a;
	zeit1 = clock();
	for(unsigned int i=6; i&lt;=500000; i+=2)
		if(not IstGoldig(i))
			cout &lt;&lt; &quot;Gegenbeweis gefunden für folgende Zahl: &quot; &lt;&lt; i &lt;&lt; endl;
	zeit2 = clock();
	cout &lt;&lt; 500000 &lt;&lt; &quot;\ttime: &quot; &lt;&lt; 1000 * (zeit2-zeit1) / CLOCKS_PER_SEC &lt;&lt; &quot; ms&quot; &lt;&lt; endl;
}
</code></pre>
<p>Zur Erinnerung, das Klammensparen ist nicht wichtig, das Auslagern um die pascaloide Variable zu<br />
sparen war der Trick. Und dieser Trick geht meiner Erfahung nach immer. Immer hat die ausgelagerte<br />
Funktion eine sinnvolle Bedeutung uns sollte schon allein deshalb ausgelagert sein.</p>
<p>Ok, wir haben eine Basis, auf der man aufbauen kann.</p>
<p>Und Mathetricks sind erstmal ausgeschöpft.</p>
<p>Programmiertricks müssen her. Primzahltest ist teuer. Könnte man die nicht zwischenspeichern?<br />
Nee, kann man nicht. Es sind ja immer andere gefragt und 500000 Zahlen will keiner speichern.<br />
Oder naja, so viel RAM habe ich zwar, aber kaum geht es mit 500000 will ich ja 5Mio oder 5Bio testen.</p>
<p>Könnte man fensterweise vorgehen?<br />
Also sagen wie mal die Fenstergröße ist 1Mio.<br />
Ich will alle Kandidaten i zwischen 17Mio und 18Mio-1 auf einmal testen.<br />
Dann baue ich ein Primzahlenfenster 0Mio bis 1Mio-1 und eins 17Mio bis 18Mio-1. Dazu brauche ich nur 2Mio Primzahlentests.<br />
Und ich streiche alle blöden Kandidaten raus.<br />
Dann baue ich ein Primzahlenfenster 1Mio bis 2Mio-1 und eins 16Mio bis 17Mio-1. Dazu brauche ich nur 2Mio Primzahlentests.<br />
Und ich streiche alle blöden Kandidaten raus.<br />
Und so weiter bis sich die Primzahlenfenster überschneiden, also 9 mal 2Mio Primzahlentests.<br />
Und hab damit das Kandidatenfenster von 17Mio bis 18Mio geklärt.<br />
Macht zusammen 1Mio untersuchte Kandidaten zu Kosten von 18Mio Primzahlentests. (18Mio)</p>
<p>Vorher waren es für diesen Bereich 1Mio Kandidaten mit ca 17.5Mio mal 2 Primzahlentests. (35MioMio)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2461507</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2461507</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Wed, 29 Jul 2015 17:40:07 GMT</pubDate></item><item><title><![CDATA[Reply to Goldbach Vermutung on Wed, 29 Jul 2015 17:46:02 GMT]]></title><description><![CDATA[<pre><code>for(unsigned int a=2; a&lt;i; a++)
</code></pre>
<p>Hier gibts noch nen Faktor 2 zu holen, weil es reicht bis einschließlich i/2 zu testen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2461510</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2461510</guid><dc:creator><![CDATA[sebi707]]></dc:creator><pubDate>Wed, 29 Jul 2015 17:46:02 GMT</pubDate></item><item><title><![CDATA[Reply to Goldbach Vermutung on Wed, 29 Jul 2015 17:49:32 GMT]]></title><description><![CDATA[<p>volkard schrieb:</p>
<blockquote>
<pre><code class="language-cpp">for (unsigned int i=2; i*i&lt;=number; i++)
</code></pre>
<p>500000 time: 1422 ms</p>
</blockquote>
<p>Obacht mit dem Wertebereich. 500000^2 passt schon nicht mehr in eine 32 Bit Variable!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2461512</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2461512</guid><dc:creator><![CDATA[sebi707]]></dc:creator><pubDate>Wed, 29 Jul 2015 17:49:32 GMT</pubDate></item><item><title><![CDATA[Reply to Goldbach Vermutung on Wed, 29 Jul 2015 17:51:29 GMT]]></title><description><![CDATA[<p>i*i&lt;=number ist eine intelligente Idee, die Fließkommaoperation sqrt() loszuwerden, schöner Hinweis (wenn man die 32-bit-Grenze dabei nicht vergisst. Problem ist halt, dass die Zahlen explodieren...).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2461513</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2461513</guid><dc:creator><![CDATA[Mr X]]></dc:creator><pubDate>Wed, 29 Jul 2015 17:51:29 GMT</pubDate></item><item><title><![CDATA[Reply to Goldbach Vermutung on Wed, 29 Jul 2015 17:54:46 GMT]]></title><description><![CDATA[<p>Mr X schrieb:</p>
<blockquote>
<p>i*i&lt;=number ist eine intelligente Idee, die Fließkommaoperation sqrt() loszuwerden, schöner Hinweis</p>
</blockquote>
<p>Vermutlich will man eher eine effiziente Version davon: <a href="https://en.wikipedia.org/wiki/Integer_square_root" rel="nofollow">https://en.wikipedia.org/wiki/Integer_square_root</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2461514</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2461514</guid><dc:creator><![CDATA[sebi707]]></dc:creator><pubDate>Wed, 29 Jul 2015 17:54:46 GMT</pubDate></item><item><title><![CDATA[Reply to Goldbach Vermutung on Thu, 30 Jul 2015 00:52:13 GMT]]></title><description><![CDATA[<p>sebi707 schrieb:</p>
<blockquote>
<p>volkard schrieb:</p>
<blockquote>
<pre><code class="language-cpp">for (unsigned int i=2; i*i&lt;=number; i++)
</code></pre>
<p>500000 time: 1422 ms</p>
</blockquote>
<p>Obacht mit dem Wertebereich. 500000^2 passt schon nicht mehr in eine 32 Bit Variable!</p>
</blockquote>
<p>Richtig. Man muss aufpassen wie ein Luchs.</p>
<p>Aber kann i denn in die Gegend von number kommen? Nöö, gell? Hab den Luchs erschossen! *freu* *hüpf*</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2461527</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2461527</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Thu, 30 Jul 2015 00:52:13 GMT</pubDate></item><item><title><![CDATA[Reply to Goldbach Vermutung on Wed, 29 Jul 2015 19:29:19 GMT]]></title><description><![CDATA[<p>Für Zahlen kleiner als 341550071728321 ist sicher, dass es reicht zu prüfen ob die starke Pseudoprimzahlen sind zur Basis 2,3,6,7,9,11,13,17. Ich denke das geht recht schnell und kann dein Programm enorm beschleunigen.</p>
<p>Nachtrag: Für kleiner als 25326001, reichen 2,3,5.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2461535</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2461535</guid><dc:creator><![CDATA[Bengo]]></dc:creator><pubDate>Wed, 29 Jul 2015 19:29:19 GMT</pubDate></item><item><title><![CDATA[Reply to Goldbach Vermutung on Wed, 29 Jul 2015 19:26:02 GMT]]></title><description><![CDATA[<p>volkard schrieb:</p>
<blockquote>
<p>Aber kann i denn in die Gegend von number kommen? Nöö, gell? Hab den Luchs erschossen! *freu* *hüpf*</p>
</blockquote>
<p>Ich merks gerade. Hätte mir auch eher auffallen können...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2461537</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2461537</guid><dc:creator><![CDATA[sebi707]]></dc:creator><pubDate>Wed, 29 Jul 2015 19:26:02 GMT</pubDate></item><item><title><![CDATA[Reply to Goldbach Vermutung on Wed, 29 Jul 2015 20:41:14 GMT]]></title><description><![CDATA[<pre><code>#include &lt;iostream&gt;
#include &lt;limits&gt;
#include &lt;ctime&gt;
#include &lt;cstdint&gt;

using namespace std;

void wait()
{
    cin.clear();
    cin.ignore(numeric_limits&lt;streamsize&gt;::max(), '\n');
    cin.get();
}

bool IsPrime(uint64_t number)
{
    if(number&lt;2)    return false;
    if(number==2)   return true;
    if(number%2==0) return false;

    for(uint64_t i=3; i*i&lt;=number; i+=2)
    {
        if(number%i == 0) return false;
    }
    return true;
}

bool ZweiPrimzahlenGefunden(uint64_t i)
{
    for(uint64_t a=2; a&lt;i; a++)
    {
        if(IsPrime(a) &amp;&amp; IsPrime(i-a))
            return true;
    }
    return false;
}

int main()
{
    clock_t zeit1 , zeit2;
    zeit1 = clock();

    for(uint64_t i=6; i&lt;=5000000; i+=2)
    {
        if(!ZweiPrimzahlenGefunden(i))
            cout &lt;&lt; &quot;Gegenbeweis gefunden für folgende Zahl: &quot; &lt;&lt; i &lt;&lt; endl;

        if (i%100000 == 0)
        {
                zeit2 = clock();
                cout &lt;&lt; i &lt;&lt; &quot;\ttime: &quot; &lt;&lt; 1000 * (zeit2-zeit1) / CLOCKS_PER_SEC &lt;&lt; &quot; ms&quot; &lt;&lt; endl;
        }
    }

    wait();
 }
</code></pre>
<p>mit -O3 und 64 bit: 5000000 time: 18652 ms</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2461566</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2461566</guid><dc:creator><![CDATA[Erhard Henkes]]></dc:creator><pubDate>Wed, 29 Jul 2015 20:41:14 GMT</pubDate></item><item><title><![CDATA[Reply to Goldbach Vermutung on Wed, 29 Jul 2015 20:45:49 GMT]]></title><description><![CDATA[<p>Ich denke du kannst noch richtig Speed raushohlen, wenn du dir die Primzahlen vorher erstellst.</p>
<p>Das hier könnte ein Construtor für eine Klasse Primes werden, die einen public std::vector mit den Primzahlen hält, über den kannst du dann immer iterieren.</p>
<pre><code>Primes::Primes(int up_to) {
    this-&gt;primes.push_back(2);
    bool abbruch = false;
    for(int i = 3; i &lt;= up_to; ++i) {
        for ( auto &amp;p : this-&gt;primes ) {
            if (i%p == 0) {
                abbruch = true;
                break;
            }
        }
        if (abbruch == true) {
            abbruch = false;
        } else {
            this-&gt;primes.push_back(i);
        }
    }
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2461568</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2461568</guid><dc:creator><![CDATA[Bengo]]></dc:creator><pubDate>Wed, 29 Jul 2015 20:45:49 GMT</pubDate></item><item><title><![CDATA[Reply to Goldbach Vermutung on Wed, 29 Jul 2015 21:18:39 GMT]]></title><description><![CDATA[<p>ja, das müsste man aber dann schon bis 18.446.744.073.709.551.616 machen für uint64_t. Gewaltiges Array.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2461573</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2461573</guid><dc:creator><![CDATA[Erhard Henkes]]></dc:creator><pubDate>Wed, 29 Jul 2015 21:18:39 GMT</pubDate></item><item><title><![CDATA[Reply to Goldbach Vermutung on Wed, 29 Jul 2015 21:23:43 GMT]]></title><description><![CDATA[<p>Erhard Henkes schrieb:</p>
<blockquote>
<p>ja, das müsste man aber dann schon bis 18.446.744.073.709.551.616 machen für uint64_t. Gewaltiges Array.</p>
</blockquote>
<p>Naja, zum Glück sind nur eine Minderheit der Zahlen bis dahin Primzahlen, sodass der Speicherbedarf doch ein erhebliches Stück geringer ist.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2461577</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2461577</guid><dc:creator><![CDATA[Mr X]]></dc:creator><pubDate>Wed, 29 Jul 2015 21:23:43 GMT</pubDate></item><item><title><![CDATA[Reply to Goldbach Vermutung on Wed, 29 Jul 2015 21:29:02 GMT]]></title><description><![CDATA[<p>Mr X schrieb:</p>
<blockquote>
<p>Erhard Henkes schrieb:</p>
<blockquote>
<p>ja, das müsste man aber dann schon bis 18.446.744.073.709.551.616 machen für uint64_t. Gewaltiges Array.</p>
</blockquote>
<p>Naja, zum Glück sind nur eine Minderheit der Zahlen bis dahin Primzahlen, sodass der Speicherbedarf doch ein erhebliches Stück geringer ist.</p>
</blockquote>
<p>mmh, ich würde sagen immernoch mehr als mein Computer verkraftet.<br />
Es sind etwa 18.446.744.073.709.551.616/log(18.446.744.073.709.551.616)<br />
(Ich meine den natürlichen log)<br />
Und das sind immernoch verdammt viele.</p>
<p>Ok also bei so großen Zahlen würd ich trotzdem den Test mit den Pseudoprimzahlen machen, der ist einfach und schnell. Wird glaube auch bei vielen RSA implementierungen verwendet.</p>
<p>Und du kannst in der Schleife von ZweiPrimzahlenGefunden, wenigstens mit a = a + 2 interieren</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2461578</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2461578</guid><dc:creator><![CDATA[Bengo]]></dc:creator><pubDate>Wed, 29 Jul 2015 21:29:02 GMT</pubDate></item><item><title><![CDATA[Reply to Goldbach Vermutung on Wed, 29 Jul 2015 22:06:02 GMT]]></title><description><![CDATA[<p>Die Idee hinter den Pseudoprimzahlen ist folgende:</p>
<p>Es gilt a^{p-1} \equiv 1 \mod p (kleiner Fermat) ggT(a,p)=1;(Beweis: betrachte die Gruppe der Restklassen modulo p ohne 0 mit der Multiplikation als verknüpfung, diese Gruppe hat die Ordung p-1, daher gilt für jedes a: a^(p-1)=1)</p>
<p>Umgekehrt kann man aber auch schließen, wenn für diese Kongruenz für eine Zahl n erfüllt ist, ist sie auch prim. Das stimmt leider nicht ganz, aber wenn es für die Zahlen a=2,3,5,7,11,13,17 gilt dann ist sie sehr wahrscheinnlich prim, und wenn kleiner als die Grenze die ich schon mal angegeben habe auch zu 100%. Kann man beweisen wenn man einfach mal überprüft, welche Zahlen bei 2 Pseudoprimzahlen sind, dann bei 3 und so weiter. Die kleinste gemeinsame Zahl ist dann schon verdammt groß.<br />
Da sich <span class="katex"><span class="katex-mathml"><math><semantics><mrow><msup><mi>a</mi><mrow><mi>p</mi><mo>−</mo><mn>1</mn></mrow></msup></mrow><annotation encoding="application/x-tex">a^{p-1}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="strut" style="height:0.8141079999999999em;"></span><span class="strut bottom" style="height:0.8141079999999999em;vertical-align:0em;"></span><span class="base textstyle uncramped"><span class="mord"><span class="mord mathit">a</span><span class="vlist"><span style="top:-0.363em;margin-right:0.05em;"><span class="fontsize-ensurer reset-size5 size5"><span style="font-size:0em;">​</span></span><span class="reset-textstyle scriptstyle uncramped"><span class="mord scriptstyle uncramped"><span class="mord mathit">p</span><span class="mbin">−</span><span class="mord mathrm">1</span></span></span></span><span class="baseline-fix"><span class="fontsize-ensurer reset-size5 size5"><span style="font-size:0em;">​</span></span>​</span></span></span></span></span></span> eher nicht ausrechnen lässt, muss man das iterativ machen und immer mal wieder mod p rechnen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2461581</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2461581</guid><dc:creator><![CDATA[Bengo]]></dc:creator><pubDate>Wed, 29 Jul 2015 22:06:02 GMT</pubDate></item><item><title><![CDATA[Reply to Goldbach Vermutung on Thu, 30 Jul 2015 00:33:20 GMT]]></title><description><![CDATA[<p>Bengo schrieb:</p>
<blockquote>
<p>Ich denke du kannst noch richtig Speed raushohlen, wenn du dir die Primzahlen vorher erstellst.</p>
<p>Das hier könnte ein Construtor für eine Klasse Primes werden, die einen public std::vector mit den Primzahlen hält, über den kannst du dann immer iterieren.</p>
<pre><code>Primes::Primes(int up_to) {
    this-&gt;primes.push_back(2);
    bool abbruch = false;
    for(int i = 3; i &lt;= up_to; ++i) {
        for ( auto &amp;p : this-&gt;primes ) {
            if (i%p == 0) {
                abbruch = true;
                break;
            }
        }
        if (abbruch == true) {
            abbruch = false;
        } else {
            this-&gt;primes.push_back(i);
        }
    }
}
</code></pre>
</blockquote>
<p>abbruch ist eine &quot;künstliche variable&quot;, die nur dazu da ist, das exit-pfeilchen aus dem struktogramnm wegzumachen. was hatte onkel volkard vorhin darüber geschrieben?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2461587</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2461587</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Thu, 30 Jul 2015 00:33:20 GMT</pubDate></item><item><title><![CDATA[Reply to Goldbach Vermutung on Thu, 30 Jul 2015 00:49:04 GMT]]></title><description><![CDATA[<p>Mr X schrieb:</p>
<blockquote>
<p>Erhard Henkes schrieb:</p>
<blockquote>
<p>ja, das müsste man aber dann schon bis 18.446.744.073.709.551.616 machen für uint64_t. Gewaltiges Array.</p>
</blockquote>
<p>Naja, zum Glück sind nur eine Minderheit der Zahlen bis dahin Primzahlen, sodass der Speicherbedarf doch ein erhebliches Stück geringer ist.</p>
</blockquote>
<p>Ein <strong>Trug</strong>schluss!</p>
<p>Sagen wir mal, man will eine Primzahlenliste bis 2^n speichern und hat als Alternativen<br />
A einen vector&lt;n-bittiger-int&gt;(wo man nur die primzahlen speichert) oder<br />
B einen vector&lt;bool&gt;(wo man 2^n bits drin hat und nur die primzahlen sind 1).</p>
<p>Was ist teuerer? Und vor allem, wie verhält es sich, wenn n immer größer wird?</p>
<p>Primzahlensatz: Zwischen 0 und x gibt es ungefähr x/ln(x) Primzahlen.</p>
<p>B braucht 2^n Bits.<br />
A braucht n*(2<sup>n)/ln(2</sup>n) = n*(2^n)/(ln(2)*n) = 2^n/ln(2) Bits.<br />
B braucht 69% von A.</p>
<p>Überraschung, der Verbrauch von B wird nie &quot;erhebliches Stück geringer&quot; sein.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2461588</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2461588</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Thu, 30 Jul 2015 00:49:04 GMT</pubDate></item><item><title><![CDATA[Reply to Goldbach Vermutung on Thu, 30 Jul 2015 01:01:23 GMT]]></title><description><![CDATA[<p>Bengo schrieb:</p>
<blockquote>
<p>Für Zahlen kleiner als 341550071728321 ist sicher, dass es reicht zu prüfen ob die starke Pseudoprimzahlen sind zur Basis 2,3,6,7,9,11,13,17. Ich denke das geht recht schnell und kann dein Programm enorm beschleunigen.</p>
<p>Nachtrag: Für kleiner als 25326001, reichen 2,3,5.</p>
</blockquote>
<p>evtl haste Spaß daran: <a href="https://www.c-plusplus.net/forum/67513-full">https://www.c-plusplus.net/forum/67513-full</a><br />
Das führt aber zu weit für die Zielgruppe von Ehrhard fürchte ich.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2461589</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2461589</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Thu, 30 Jul 2015 01:01:23 GMT</pubDate></item><item><title><![CDATA[Reply to Goldbach Vermutung on Thu, 30 Jul 2015 07:20:19 GMT]]></title><description><![CDATA[<blockquote>
<p>du kannst in der Schleife von ZweiPrimzahlenGefunden, wenigstens mit a = a + 2 iterieren</p>
</blockquote>
<pre><code>bool ZweiPrimzahlenGefunden(uint64_t i)
{
    uint64_t a=2;

    if(IsPrime(a) &amp;&amp; IsPrime(i-a))
        return true;

    for(a=3; a&lt;i; a+=2)
    {
        if(IsPrime(a) &amp;&amp; IsPrime(i-a))
            return true;
    }
    return false;
}
</code></pre>
<p>Gemessene Zeitersparnis (6 bis 5.000.000): 1,93% DANKE!</p>
<p>Wie wichtig Reihenfolgen sind, sieht man daran, wenn man die Anordnung</p>
<p><em>IsPrime(i-a) &amp;&amp; IsPrime(a)</em></p>
<p>ausprobiert. Dann braucht es etwa 65% mehr Zeit. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/26a0.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--warning"
      title=":warning:"
      alt="⚠"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2461620</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2461620</guid><dc:creator><![CDATA[Erhard Henkes]]></dc:creator><pubDate>Thu, 30 Jul 2015 07:20:19 GMT</pubDate></item><item><title><![CDATA[Reply to Goldbach Vermutung on Thu, 30 Jul 2015 07:40:06 GMT]]></title><description><![CDATA[<p>Den Test mit a=2 kann man auch sein lassen; 2 + irgendeine andere Primzahl ergibt eine ungerade Zahl, aber die Goldbachsche Vermutung betrifft nur gerade Zahlen. Für 4 ergäbe es zwar dann einen angeblichen Gegenbeweis, allerdings startet dein Test ja eh erst bei 6.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2461628</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2461628</guid><dc:creator><![CDATA[Mr X]]></dc:creator><pubDate>Thu, 30 Jul 2015 07:40:06 GMT</pubDate></item><item><title><![CDATA[Reply to Goldbach Vermutung on Thu, 30 Jul 2015 09:53:18 GMT]]></title><description><![CDATA[<pre><code>bool ZweiPrimzahlenGefunden(uint64_t i)
{
    for(uint64_t a=3; a&lt;i; a+=2)
    {
        if(IsPrime(a) &amp;&amp; IsPrime(i-a))
            return true;
    }
    return false;
}
</code></pre>
<p>Gute Idee. Das bringt 7% Zeitersparnis.</p>
<p>Interessant wird es aber erst bei hohen Zahlen (mit -O3):<br />
Intel i5-2520M 2,5 GHz, 8 GB RAM, 64 bit</p>
<p>1000000000000000000 time: 4836 ms<br />
1000000000000000100 time: 249455 ms<br />
1000000000000000200 time: 560991 ms</p>
<p>Zur Sicherheit der aktuelle Code:</p>
<pre><code>#include &lt;iostream&gt;
#include &lt;limits&gt;
#include &lt;ctime&gt;
#include &lt;cstdint&gt;

using namespace std;

void wait()
{
    cin.clear();
    cin.ignore(numeric_limits&lt;streamsize&gt;::max(), '\n');
    cin.get();
}

bool IsPrime(uint64_t number)
{
    if(number&lt;2)    return false;
    if(number==2)   return true;
    if(number%2==0) return false;

    for(uint64_t i=3; i*i&lt;=number; i+=2)
    {
        if(number%i == 0) return false;
    }
    return true;
}

bool ZweiPrimzahlenGefunden(uint64_t i)
{
    for(uint64_t a=3; a&lt;i; a+=2)
    {
        if(IsPrime(a) &amp;&amp; IsPrime(i-a))
            return true;
    }
    return false;
}

int main()
{
    clock_t zeit1 , zeit2;
    zeit1 = clock();

    for(uint64_t i=1000000000000000000; i&lt;=2000000000000000000; i+=2)
    {
        if(!ZweiPrimzahlenGefunden(i))
            cout &lt;&lt; &quot;Gegenbeweis gefunden für folgende Zahl: &quot; &lt;&lt; i &lt;&lt; endl;

        if (i%100 == 0)
        {
                zeit2 = clock();
                cout &lt;&lt; i &lt;&lt; &quot;\ttime: &quot; &lt;&lt; 1000 * (zeit2-zeit1) / CLOCKS_PER_SEC &lt;&lt; &quot; ms&quot; &lt;&lt; endl;
        }
    }

    wait();
}
</code></pre>
<p>oder:</p>
<p>18400000000000000000 time: 27753 ms<br />
18400000000000000010 time: 168974 ms<br />
18400000000000000020 time: 308288 ms<br />
18400000000000000030 time: 446579 ms<br />
18400000000000000040 time: 587249 ms<br />
18400000000000000050 time: 741313 ms</p>
<pre><code>int main()
{
    clock_t zeit1 , zeit2;
    zeit1 = clock();

    for(uint64_t i=18400000000000000000; i&lt;=18446744073709551615; i+=2)
    {
        if(!ZweiPrimzahlenGefunden(i))
            cout &lt;&lt; &quot;Gegenbeweis gefunden für folgende Zahl: &quot; &lt;&lt; i &lt;&lt; endl;

        if (i%10 == 0)
        {
                zeit2 = clock();
                cout &lt;&lt; i &lt;&lt; &quot;\ttime: &quot; &lt;&lt; 1000 * (zeit2-zeit1) / CLOCKS_PER_SEC &lt;&lt; &quot; ms&quot; &lt;&lt; endl;
        }
    }

    wait();
}
</code></pre>
<p>Welche Bibliothek sollte man für Zahlen größer 2^64 - 1 einsetzen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2461635</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2461635</guid><dc:creator><![CDATA[Erhard Henkes]]></dc:creator><pubDate>Thu, 30 Jul 2015 09:53:18 GMT</pubDate></item></channel></rss>