<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>muvik-multigrid &#187; Primzahlen</title>
	<atom:link href="http://www.muvik.de/tag/primzahlen/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.muvik.de</link>
	<description>open source - engineering - programming</description>
	<lastBuildDate>Wed, 28 Jul 2010 07:56:30 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>Projecteuler: Lösung zu Problem 10</title>
		<link>http://www.muvik.de/2010/07/27/projecteuler-loesung-zu-problem-10/</link>
		<comments>http://www.muvik.de/2010/07/27/projecteuler-loesung-zu-problem-10/#comments</comments>
		<pubDate>Tue, 27 Jul 2010 07:42:12 +0000</pubDate>
		<dc:creator>Viktor Müller</dc:creator>
				<category><![CDATA[Projekte]]></category>
		<category><![CDATA[Eratosthenes]]></category>
		<category><![CDATA[Primzahlen]]></category>
		<category><![CDATA[Projecteuler]]></category>
		<category><![CDATA[Python]]></category>

		<guid isPermaLink="false">http://www.muvik.de/?p=1384</guid>
		<description><![CDATA[Primzahlen sind das Thema des Projecteuler-Problems Nummer 10. Nach dem 3. und 7. Problem befasst sich nun auch das 10. Problem mit den beliebten Zahlen, die durch beinahe nichts teilbar sind. In diesem Artikel wird, wie gewohnt, das Problem eingegrenzt und mit Python gelöst. Problemvorstellung Wer die Probleme 3 und 7 bereits gelöst hat, wird [...]]]></description>
			<content:encoded><![CDATA[<img class="cat-img-wide" alt="Projecteuler: Lösungen mit Python und C++" src="http://muvik.de/categorie_images/projecteuler_serie_start.gif" title="Projecteuler: Lösungen mit Python und C++" width="443" height="98" />
<p class="preview">Primzahlen sind das Thema des Projecteuler-Problems Nummer 10. Nach dem 3. und 7. Problem befasst sich nun auch das 10. Problem mit den beliebten Zahlen, die durch beinahe nichts teilbar sind. In diesem Artikel wird, wie gewohnt, das Problem eingegrenzt und mit Python gelöst.</p>
<p><span id="more-1384"></span></p>
<h3>Problemvorstellung</h3>
<p>Wer die Probleme <a href="http://www.muvik.de/2010/04/03/projecteuler-loesung-zu-problem-3/">3</a> und <a href="http://http://www.muvik.de/2010/07/06/projecteuler-loesung-zu-problem-7/">7</a> bereits gelöst hat, wird mit dem <a href="http://projecteuler.net/index.php?section=problems&#038;id=10">10. Projecteuler-Problem</a> keine Mühe haben. Wieder geht es um Primzahlen und wieder kann der Sieb des Eratosthenes verwendet werden, um die Lösung zu finden.</p>
<p>Ins Deutsche übersetzt lautet die Aufgabenstellung: </p>
<p><strong>Finde die Summe aller Primzahlen, die kleiner als zwei Millionen sind.</strong></p>
<p>Mit dem Hintergrundwissen aus den bereits gelösten Problemen, bräuchte ich eigentlich keinen zusätzlichen Artikel mehr zu verfassen. Es sind bereits alle Mittel, die hierzu benötigt werden, bereits vorgestellt und mit Erfolg verwendet worden.</p>
<p>Aus diesem Grund lässt es sich nicht wirklich nachvollziehen, warum zum heutigen Zeitpunkt lediglich 47699 der insgesamt 114874 Projecteuler-Teilnehmer eine richtige Lösung zu diesem Problem einreichen konnten. Wahrscheinlich sind sie zeitlich verhindert gewesen <img src='http://www.muvik.de/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> !</p>
<h3>Problemeingrenzung</h3>
<p>Obwohl alle Tipps und Tricks zur vollständigen und erfolgreichen Lösung des Problems bereits im Rahmen dieser Artikelserie genannt und beschrieben wurden, möchte ich einige Tatsachen dennoch der Vollständigkeit wegen wiederholen.</p>
<p>In erster Linie ist das wichtiges Werkzeug, welches bei bisher allen Problemen mit Primzahlen bei mir zum Einsatz kam und es auch diesmal tut <a href="http://de.wikipedia.org/wiki/Sieb_des_Eratosthenes">das Siebes von Eratosthenes</a>. Hierbei handelt es sich um eine Methode, mit welcher man alle Primzahlen bis zu einer gegebenen Zahl <code>N</code> relativ effizient finden kann.</p>
<h4>Das Sieb des Eratosthenes</h4>
<p>Die Vorgehensweise beim <em>Sieben</em> ist recht simpel und schnell erklärt, dabei geht man am besten grafisch vor: Um alle Zahlen bis <code>N</code> mit dem Sieb zu finden, schreibt man die Zahlen, bildlich gesprochen, alle auf. Dann fängt man mit der ersten bekannten Primzahl, also der 2, an und streicht alle Vielfachen dieser Zahl wieder aus der Liste. Hat man das erledigt, so geht es mit der nächsten <strong>nicht</strong> gestrichenen Zahl weiter, die nun eine Primzahl sein sollte. </p>
<p>Wenn nichts schief gegangen ist, so bleiben am Ende alle Primzahlen bis <code>N</code> übrig.</p>
<p>Um einige Rechenoperationen, Vergleiche und Abfragen zu sparen, kann die Methode etwas verfeinert werden. Zum einen ist es bekannt, dass es keine geraden Primzahlen gibt. Also können diese sofort aus der Betrachtung ausgeschlossen werden. Zum anderen ist während des Siebens ebenfalls bekannt, dass alle Vielfachen der Primzahl 5 bereits gestrichen sind, wenn die Primzahl 11 an der Reihe ist. Das gilt auch für alle Primzahlen zwischen 5 und 11. Somit kann die nächste zu streichende Vielfache frühstens 11*11 sein.</p>
<p>Aus der zuletzt angestellten Betrachtung folgt sogleich, dass die größte zu prüfende Primzahl maximal die Wurzel aus N sein kann.<br />
<code class="bash"> x*x <= N</code></p>
<p>Werden die Verfeinerungen im Code angewendet, erhält man einen relativ effizienten Sieb, der mit den vorgegebenen zwei Millionen mühelos fertig werden sollte.</p>
<h3>Problemlösung</h3>
<p>Wie versprochen, brauchen wir zur Lösung des zehnten Projecteuler-Problem nur den Sieb des Eratosthenes und eine Summe aller gefundenen Primzahlen, das war es schon!<br />
Im folgenden die kompakte Lösung:</p>
<pre class="brush:python">import time as t
import numpy as np

def eratosthenes_vect(N):
    primes = np.arange(3,N+1,2)  # only uneven figures
    primes = np.insert(primes,0,2,0) # ... and two

    nUneven = np.size(primes) - 1.0

    for i in np.arange(3,np.ceil(np.sqrt(N))+2,2):
        primes[(i*i+1)/2-1:nUneven+1.0:i] = 0;

    return np.trim_zeros(np.sort(primes))

def solver(N):
    Primes = eratosthenes_vect(N)

    erg = 0;

    for i in Primes:
        erg = erg + i

    return erg

N = 2000000

t0 = t.clock()
Prim = solver(N)
tn = t.clock() - t0

print("Benoetigte Zeit: %15.6f" %tn)
print("Gefundene Summe: %i" %Prim)</pre>
<p>Die Ausgabe des Codes zeigt die benötigt Zeit und die gesuchte Summe:<br />
<code class="bash">Benoetigte Zeit:        5.940000<br />
Gefundene Summe: 142913828922<br />
</code></p>
<p>Sechs Sekunden Rechenzeit für alle Primzahlen, die kleiner als zwei Millionen sind, und die Summe daraus ist, denke ich, annehmbar.</p>
<h3>Schlusswort</h3>
<p>Nach einer etwas langwierigen Zeit, während der nur wenige Artikel in der Serie "Lösungen zu Projecteuler-Problemen mit Python" erschienen sind, gleich zwei Lösungen nach einander. Das ist schon ein Wort und sollte eigentlich mit einem dritten Artikel zum 11. Problem gefeiert werden. Vielleicht lasse ich mich dazu hinreißen <img src='http://www.muvik.de/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> !</p>
<p><a href="http://partners.webmasterplan.com/click.asp?ref=515746&site=6989&type=text&tnb=1" target="_blank">
Deine Stadt - Dein Preis</a><br />Mit CityDeal und vielen Anderen
den Preis drücken!<br /><img src="http://banners.webmasterplan.com/view.asp?ref=515746&site=6989&type=text&tnb=1&js=1" BORDER="0" WIDTH="1" HEIGHT="1" /></p>
<hr />
<p><small>© Muvik for <a href="http://www.muvik.de">muvik-multigrid</a>, 2010. |
<a href="http://www.muvik.de/2010/07/27/projecteuler-loesung-zu-problem-10/">Permalink</a> |
<a href="http://www.muvik.de/2010/07/27/projecteuler-loesung-zu-problem-10/#comments">keine Kommentare</a> |
Teile es mit deinen Freunden:
<a href="http://del.icio.us/post?url=http://www.muvik.de/2010/07/27/projecteuler-loesung-zu-problem-10/&title=Projecteuler: Lösung zu Problem 10">del.icio.us</a>
<a href="http://www.mister-wong.de/addurl/?bm_url=http://www.muvik.de/2010/07/27/projecteuler-loesung-zu-problem-10/&title=Projecteuler: Lösung zu Problem 10">MisterWong</a>
<a href="http://twitter.com/home?status=http://www.muvik.de/2010/07/27/projecteuler-loesung-zu-problem-10/&title=Projecteuler: Lösung zu Problem 10">Twitter</a>
<br/>
Tags: <a href="http://www.muvik.de/tag/eratosthenes/" rel="tag">Eratosthenes</a>, <a href="http://www.muvik.de/tag/primzahlen/" rel="tag">Primzahlen</a>, <a href="http://www.muvik.de/tag/projecteuler/" rel="tag">Projecteuler</a>, <a href="http://www.muvik.de/tag/python/" rel="tag">Python</a><br/>
</small></p>]]></content:encoded>
			<wfw:commentRss>http://www.muvik.de/2010/07/27/projecteuler-loesung-zu-problem-10/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Projecteuler: Lösung zu Problem 7</title>
		<link>http://www.muvik.de/2010/07/06/projecteuler-loesung-zu-problem-7/</link>
		<comments>http://www.muvik.de/2010/07/06/projecteuler-loesung-zu-problem-7/#comments</comments>
		<pubDate>Tue, 06 Jul 2010 09:12:21 +0000</pubDate>
		<dc:creator>Viktor Müller</dc:creator>
				<category><![CDATA[Projekte]]></category>
		<category><![CDATA[Eratosthenes]]></category>
		<category><![CDATA[Primzahlen]]></category>
		<category><![CDATA[Projecteuler]]></category>
		<category><![CDATA[Python]]></category>

		<guid isPermaLink="false">http://www.muvik.de/?p=1050</guid>
		<description><![CDATA[Diese Woche geht es gleich weiter mit der Lösung des siebten Projecteuler-Problems mit Python. Die guten Vorsätze von letzter Woche scheinen noch nicht abgelegt zu sein, deswegen beschäftigen wir uns in diesem Artikel wieder etwas mit Primzahlen und dem Sieb des Eratosthenes. Natürlich wird das Problem mit der Programmiersprache Python angegangen und gelöst! Problemvorstellung Das [...]]]></description>
			<content:encoded><![CDATA[<img class="cat-img-wide" alt="Projecteuler: Lösungen mit Python und C++" src="http://muvik.de/categorie_images/projecteuler_serie_start.gif" title="Projecteuler: Lösungen mit Python und C++" width="443" height="98" />
<p class="preview">Diese Woche geht es gleich weiter mit der Lösung des siebten Projecteuler-Problems mit Python. Die guten Vorsätze von letzter Woche scheinen noch nicht abgelegt zu sein, deswegen beschäftigen wir uns in diesem Artikel wieder etwas mit Primzahlen und dem Sieb des Eratosthenes. Natürlich wird das Problem mit der Programmiersprache Python angegangen und gelöst!</p>
<p><span id="more-1050"></span></p>
<h3>Problemvorstellung</h3>
<p>Das <a href="http://projecteuler.net/index.php?section=problems&#038;id=7">siebte Projecteuler-Problem</a> ist ein sehr kurzes Problem! Zumindest was die textliche Beschreibung angeht. Laut dem Motto &#8220;In der Kürze liegt die Würze&#8221; lautet die Aufgabenstellung folgendermaßen:</p>
<p>
<strong>Finde die 10001.Primzahl!</strong>
</p>
<p>Also kann mit drei Worten, einer Zahl und zwei Satzzeichen etwas formuliert werden, was jedes Grüblerherz höher schlagen lässt.</p>
<p>Diejenigen Leser, die meine Serie &#8220;Projecteuler: Lösungen mit Python und C++&#8221; bisher mitverfolgt haben, auch ohne aktives Eingreifen in Form von Kommentaren im Blog oder auch ohne die Probleme selber gelöst zu haben, werden wissen, dass es bereits eine Aufgabe gab, die Primzahlen zum Thema hatte.</p>
<p>Im Rahmen der <a href="http://www.muvik.de/2010/04/03/projecteuler-loesung-zu-problem-3/">Lösung zum dritten Problem</a>, wo es um eine Primfaktorenzerlegung ging, finden wir wichtige Werkzeuge auch zur Lösung des siebten Problems. Doch dazu später mehr, zuvor etwas Statistik:</p>
<p>Ganz aktuell gemessen, haben von insgesamt 112279 registrierten Projecteuler-Nutzern genau 57841 das Problem mit Bravour gelöst. Das entspricht ziemlich genau der Hälfte der Nutzer. Und wir sind dabei <img src='http://www.muvik.de/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> !</p>
<h3>Problemeingrenzung</h3>
<p>Die Schwierigkeiten bei dieser Fragestellung liegen auf der Hand: </p>
<ol>
<li>Zunächst ist es nett zu wissen, welche Zahlen denn nun überhaupt Primzahlen sind. Denn nur dann können sie auch gezählt werden. Also ist die erste Herausforderung das Filtern von Primzahlen.</li>
<li>Da nicht alle Primzahlen bis zu einer bestimmten ganzen Zahl gesucht sind, sondern eine bestimmte <em>Anzahl an Primzahlen</em>, sind die gängigsten Werkzeuge erst mal nicht zu gebrauchen, oder besser: sind zu überdenken. Es müssen weiterhin alle Primzahlen gesucht und gezählt werden, ein Limit ist jedoch nicht gegeben.</li>
</ol>
<p>Wie eingangs bereits angedeutet, können wir uns aus der Lösung zu Problem 3 eines ganz nützlichen Werkzeugs bedienen: dem <a href="http://de.wikipedia.org/wiki/Sieb_des_Eratosthenes">Sieb des Eratosthenes</a>.</p>
<p>Mit diesem Sieb lassen sich alle Primzahlen bis zu einer gegebenen ganzen Zahl N bestimmen. Wie im verlinkten Wikipedia-Artikel erläutert, müssen hierbei einfach alle Zahlen bis N &#8220;aufgeschrieben&#8221; werden. Dann werden mit der 2 beginnend alle Vielfachen wieder gestrichen. Hat man das für die 2 erledigt, so geht es in der Reihenfolge mit der nächsthöheren Zahl weiter, also der 3, dann 5, 7, 11, &#8230;</p>
<p>Das Sieb des Eratosthenes liefert uns also alle Primzahlen, die kleiner oder gleich N sind. Gesucht ist jedoch die 10001.Primzahl. Somit kommen wir mit dem Sieb des Eratosthenes nicht direkt zum Ziel.</p>
<p>Sollen nun im Zahlenbereich bis N noch keine 10001 Primzahlen identifiziert sein, so muss der Bereich erweitert und die Suche fortgesetzt werden. Wie das realisiert werden kann, steht unter der Überschrift:</p>
<h3>Problemlösung</h3>
<p>Der erste Teil der Lösung ist klar und bereits aus der <a href="http://www.muvik.de/2010/04/03/projecteuler-loesung-zu-problem-3/">Lösung zum Problem 3</a> bekannt: </p>
<pre class="brush:python">def eratosthenes_vect(N):
    primes = np.arange(3,N+1,2)  # only uneven figures
    primes = np.insert(primes,0,2,0) # ... and two

    nUneven = np.size(primes) - 1.0

    for i in np.arange(3,np.ceil(np.sqrt(N))+2,2):
        primes[(i*i+1)/2-1:nUneven+1.0:i] = 0;

    return np.trim_zeros(np.sort(primes))</pre>
</p>
<p>Damit erhalten wir alle Primzahlen bis zur Zahl N.</p>
<p>Die einfachste Lösung wäre nun, einfach einen großes N vorzugeben und zu hoffen, dass es mindestens 10001 Primzahlen im Sieb hängen bleiben. Ist man in der Lage, ein gut passendes N abzuschätzen, so hat man mit dem Sieb des Eratosthenes eine sehr effiziente Lösungsmethode gefunden.</p>
<p>Diese Tatsache möchten wir im Folgenden ausnutzen und durch eine Erweiterung etwas absichern:</p>
<pre class="brush:python">def eratosthenes_limits(StartN, EndN, Primes):
    """
    Rechnet alle Primzahlen im Zahlenraum StartN, EndN.
    Primes: alle Primzahlen bis StartN.
    """
    if (StartN%2 == 0):
        SearchField = np.arange(StartN+1,EndN+1,2)
        limitleft = StartN+1
        limitright = EndN
    else:
        SearchField = np.arange(StartN,EndN+1,2)
        limitleft = StartN
        limitright = EndN

    for item in Primes:
        itemQ = item*item
        if itemQ <= limitright:
            for i in range(0,SearchField.size,1):
                if (SearchField[i]%item == 0):
                    SearchField[i] = 0

            SearchField = np.trim_zeros(np.sort(SearchField))
            limitleft   = SearchField[0]
            limitright  = SearchField[-1]

    return np.append(Primes,SearchField)

def solver(N,NEra):
    Primes = eratosthenes_vect(NEra)

    while (Primes.size < N):
        Primes = eratosthenes_limits(NEra+1, NEra*2, Primes)
        NEra = NEra*2

    print("Suchbereich bis N=%i" %NEra)
    return Primes[N-1]</pre>
</p>
<p>Der gegebene Vorschlag ist wahrscheinlich nicht die eleganteste Methode, aber er funktioniert für das Problem recht ordentlich.</p>
<p>Die Funktion <code>eratosthenes_limits</code> kommt zum Einsatz, wenn der Zahlenbereich, den wir geschätzt haben, zu klein ist. Sie geht im Grunde genau nach dem Prinzip des Siebes von Eratosthenes vor. Es werden alle Zahlen in einem Bereich zwischen <code>StartN</code> und <code>EndN</code> auf Teilbarkeit durch die Primzahlen bis zur Zahl <code>StartN</code> untersucht. Da wir davon ausgehen, dass der zu Beginn geschätzte Zahlenbereich nicht sehr stark vergrößert werden muss, steigern wir in der <code>solver</code>-Funktion den Suchbereich um das doppelte, wenn nicht genug Primzahlen gefunden wurden.<br /> Auf diese Weise kann es nicht vorkommen, dass die Funktion <code>eratosthenes_limits</code> ins Stocken gerät, weil Primzahlen aus dem aktuellen neuen Suchbereich benötigt werden, um alle Vielfachen zu streichen. Dafür müsste der Suchbereich schon quadratisch vergrößert werden: <code>StartN = N, EndN=N*N</code>.</p>
<p><p><script type="text/javascript"><!--
google_ad_client = "pub-1356270213107195";
/* 468x60_incontent_text */
google_ad_slot = "2104479285";
google_ad_width = 468;
google_ad_height = 60;
//-->
</script>
<script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script></p></p>
<h4>Schätzen des Suchbereichs zu Beginn</h4>
<p>Das Schätzen des richtigen Suchbereichs ist das A und O bei der vorgeschlagenen Lösung. Dazu lohnt sich ein Blick auf die Statistik. Betrachtet man bereits die Häufigkeit von Primzahlen im Bereich von 1-10 und von 20-30, so stellt man fest, dass die Anzahl abnimmt. Diese Tatsache lässt sich mathematisch beweisen, was wir hier aber nicht machen wollen.</p>
<p>In dem Zahlenbereich, der für das siebte Projecteuler-Problem interessant ist, treten laut der <a href="http://www.maerku69.ch/Primzahlen-auflisten.html">Analyse auf maerku69.ch</a> Primzahlen mit einer Häufigkeit von etwas unter 10% auf.</p>
<p>Daraus schließen wir, dass eine Schätzung des Suchbereichs mit etwas mehr als dem zehnfachen von 10001 ganz ordentlich sein sollte.</p>
<h3>Lösungsanalyse</h3>
<p>Genug der trockenen Theorie, nun kommt die Analyse:</p>
<pre class="brush:python">import time as t
import numpy as np

def eratosthenes_vect(N):
    ...

def eratosthenes_limits(StartN, EndN, Primes):
    ...

def solver(N,NEra):
    ...

N = 10001

N1 = 11*N

t0 = t.clock()
Prim = solver(N,N1)
tn = t.clock() - t0

print("Benoetigte Zeit: %15.6f" %tn)
print("Gefundene Primzahl: %i" %Prim)</pre>
</p>
<p>Mit einem derart optimierten Suchbereich (<code>11*10001</code>) ist eine Erweiterung nicht nötig, die Lösung wird allein durch das Sieb des Eratosthenes gefunden (Ausgabe):<br />
<code class="bash">Suchbereich bis N=110011<br />
Benoetigte Zeit:        0.320000<br />
Gefundene Primzahl: 104743</code></p>
<p>Unterschätzt man den Suchbereich etwas (10*10001), dann dauert die Suche schon etwas länger:<br />
<code class="bash">Suchbereich bis N=200020<br />
Benoetigte Zeit:        2.810000<br />
Gefundene Primzahl: 104743</code></p>
<p>Hierbei wurde der Suchbereich ein mal vergrößert.</p>
<p>Wird dagegen der Suchbereich überschätzt (12*10001), dann dauert die Suche nur unwesentlich länger:<br />
<code class="bash">Suchbereich bis N=120012<br />
Benoetigte Zeit:        0.350000<br />
Gefundene Primzahl: 104743<br />
</code></p>
<h3>Schlusswort</h3>
<p>Primzahlen sind immer wieder gut für Knobel-Spielchen geeignet, so auch diesmal.</p>
<p>Das Lösen des siebte Problem hat mir persönlich viel Spass bereitet. Ich hoffe, dass es meinen Lesern nicht anders ging oder noch gehen wird und freue mich auf andere Lösungsvorschläge in den Kommentaren oder vielleicht als Reaktion im eigenen Blog.</p>
<p>Meinungen, Anregungen, Verbesserungen sind immer willkommen.</p>
<p><a href="http://partners.webmasterplan.com/click.asp?ref=515746&site=6989&type=text&tnb=1" target="_blank">
Deine Stadt - Dein Preis</a><br />Mit CityDeal und vielen Anderen
den Preis drücken!<br /><img src="http://banners.webmasterplan.com/view.asp?ref=515746&site=6989&type=text&tnb=1&js=1" BORDER="0" WIDTH="1" HEIGHT="1" /></p>
<hr />
<p><small>© Muvik for <a href="http://www.muvik.de">muvik-multigrid</a>, 2010. |
<a href="http://www.muvik.de/2010/07/06/projecteuler-loesung-zu-problem-7/">Permalink</a> |
<a href="http://www.muvik.de/2010/07/06/projecteuler-loesung-zu-problem-7/#comments">keine Kommentare</a> |
Teile es mit deinen Freunden:
<a href="http://del.icio.us/post?url=http://www.muvik.de/2010/07/06/projecteuler-loesung-zu-problem-7/&title=Projecteuler: Lösung zu Problem 7">del.icio.us</a>
<a href="http://www.mister-wong.de/addurl/?bm_url=http://www.muvik.de/2010/07/06/projecteuler-loesung-zu-problem-7/&title=Projecteuler: Lösung zu Problem 7">MisterWong</a>
<a href="http://twitter.com/home?status=http://www.muvik.de/2010/07/06/projecteuler-loesung-zu-problem-7/&title=Projecteuler: Lösung zu Problem 7">Twitter</a>
<br/>
Tags: <a href="http://www.muvik.de/tag/eratosthenes/" rel="tag">Eratosthenes</a>, <a href="http://www.muvik.de/tag/primzahlen/" rel="tag">Primzahlen</a>, <a href="http://www.muvik.de/tag/projecteuler/" rel="tag">Projecteuler</a>, <a href="http://www.muvik.de/tag/python/" rel="tag">Python</a><br/>
</small></p>]]></content:encoded>
			<wfw:commentRss>http://www.muvik.de/2010/07/06/projecteuler-loesung-zu-problem-7/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Projecteuler: Lösung zu Problem 5</title>
		<link>http://www.muvik.de/2010/05/17/projecteuler-loesung-zu-problem-5/</link>
		<comments>http://www.muvik.de/2010/05/17/projecteuler-loesung-zu-problem-5/#comments</comments>
		<pubDate>Mon, 17 May 2010 11:46:47 +0000</pubDate>
		<dc:creator>Viktor Müller</dc:creator>
				<category><![CDATA[Projekte]]></category>
		<category><![CDATA[Primzahlen]]></category>
		<category><![CDATA[Projecteuler]]></category>
		<category><![CDATA[Python]]></category>

		<guid isPermaLink="false">http://www.muvik.de/?p=617</guid>
		<description><![CDATA[In langsamen Schritten mehren sich die Lösungsvorschläge zu den projecteuler.net Problemen in dieser Serie. Nun sind es fünf an der Zahl. Zur Feier des Tages werden heute eine ganz simple, handschriftliche Lösung vorgestellt und die dazu äquivalente Implementierung in Python gezeigt. Problemvorstellung Die Probleme von projecteuler.net sind aufgrund des meist recht hohen Rechenaufwands nicht nur [...]]]></description>
			<content:encoded><![CDATA[<p><img class="cat-img-wide" title="Projecteuler: Lösungen mit Python und C++" src="http://muvik.de/categorie_images/projecteuler_serie_start.gif" alt="Projecteuler: Lösungen mit Python und C++" width="443" height="98" /></p>
<p class="preview">In langsamen Schritten mehren sich die Lösungsvorschläge zu den projecteuler.net Problemen in dieser Serie. Nun sind es fünf an der Zahl. Zur Feier des Tages werden heute eine ganz simple, handschriftliche Lösung vorgestellt und die dazu äquivalente Implementierung in Python gezeigt.</p>
<p><span id="more-617"></span></p>
<h3>Problemvorstellung</h3>
<p>Die Probleme von <a href="http://projecteuler.net" target="_blank">projecteuler.net</a> sind aufgrund des meist recht hohen Rechenaufwands nicht nur durch Überlegen mit Bleistift und Papier zu lösen. Zumindest nicht in einem vertretbaren zeitlichen Rahmen. Ebenso häufig, wie die Probleme nicht ohne weiteres mit Bleistift und Papier lösbar sind, helfen diese Mittel das Problem besser zu verstehen und eine elegante Lösung zu erarbeiten.</p>
<p>Wie bereits bei der <a href="http://www.muvik.de/2010/04/30/projecteuler-loesung-zu-problem-4/">Lösung des vierten Problems</a>, lassen sich auch hier einige Gedanken machen, die schnell zur Lösung führen. Diesmal geht es sogar soweit, dass eine rein schriftliche Lösung ohne großen Aufwand eingereicht werden kann.</p>
<p>Obwohl das Problem an sich keine Herausforderung mehr darstellt, wenn die Probleme 1 bis 4 gelöst sind, habe von derzeit 1802789 Projecteuler-Mitgliedern nur 64072 es auch gelöst.</p>
<p>Doch worum handelt das Problem, welches spätestens auf den zweiten Blick einfach erscheint?</p>
<p><strong>Finde die kleinste Zahl, welche durch alle Zahlen von 1 bis 20 gerade teilbar ist!</strong></p>
<p>Als Beispiel zu dieser Fragestellung haben die Macher hinter Projecteuler.net das gleiche Problem mit den Zahlen von 1 bis 10  gelöst. Hiernach ergibt sich als Lösung: 2520.</p>
<h3>Problemeingrenzung</h3>
<p>Spätestens seit der <a href="http://www.muvik.de/2010/04/03/projecteuler-loesung-zu-problem-3/">Lösung des dritten Projecteuler-Problems</a> wissen wir, dass alle Zahlen eine eindeutige Primfaktorenzerlegung besitzen. Ebenfalls aus dem dritten Problem ist bekannt, wie wir eine Primfaktorenzerlegung durchführen können, dieses Wissen hilft uns an dieser Stelle weiter.</p>
<p>Wie können wir das bereits erworbene Wissen auf dieses Problem übertragen?</p>
<p>Gesucht ist eine Zahl, die durch alle Zahlen von 1 bis 20 ohne Rest teilbar ist. Gleichwertig kann auch eine Zahl gefunden werden, welche durch alle Primfaktoren der Zahlen 1 bis 20 ohne Rest teilbar ist. Also suchen wir erst einmal eine Menge an Primzahlen, welche die Zahlen 1 bis 20 abbilden kann. Dabei ist es nicht wichtig, dass alle 21 Zahlen gleichzeitig aus der Menge heraus gebildet werden können.</p>
<p>In Kürze ergibt sich aus den Überlegungen und dem bereits vorhandenen Wissen folgendes Vorgehen:</p>
<ol>
<li>Suchen aller Primzahlen bis 20 entweder im Kopf oder mit dem Sieb des Eratosthenes.</li>
<li>Suchen der Primfaktorenzerlegung aller Zahlen von 1 bis 20 und zusammenfassen aller Primfaktoren mit ihren Häufigkeiten in einer Menge.</li>
<li>Reduzieren der Häufigkeiten, damit jede Zahl mindestens ein Mal aus den Primfaktoren gebildet werden kann.</li>
</ol>
<p>Also beschränkt sich die Herausforderung der Aufgabe lediglich auf eine Primfaktorenzerlegung und etwas Abzählen der Häufigkeiten. Gehen wir es an!
</p>
<h3>Problemlösung</h3>
<p>Wie bereits in der Einleitung angedroht, versuche ich mich zum ersten Mal in dieser Serie mit einer einfachen, handschriftlichen Rechnung. Dazu gehe ich zielführenden nach den Punkten 1-3 aus dem vorangegangenen Abschnitt vor:</p>
<ol>
<li>Die Primzahlen bis 20 inkl. der 1:<code class="bash">1 2 3 5 7 11 13 17 19</code></li>
<li>Primfaktoren aller Zahlen außer der Primzahlen von 1 bis 20:<br />
<code class="bash">4: 2 2<br />
6: 2 3<br />
8: 2 2 2<br />
9: 3 3<br />
10: 2 5<br />
12: 2 2 3<br />
14: 2 7<br />
15: 3 5<br />
16: 2 2 2 2<br />
18: 2 3 3<br />
20: 2 2 2 5</code><br />
Daraus ergibt sich die folgende Gesamtverteilung:<br />
<div id="attachment_634" class="wp-caption alignnone" style="width: 410px"><img src="http://www.muvik.de/wp-content/uploads/2010/05/primefactors-e1274094265862.png" alt="Häufigkeitsverteilung der Primfaktoren" title="Primfaktoren" width="400" height="299" class="size-full wp-image-634" /><p class="wp-caption-text">Häufigkeitsverteilung der Primfaktoren</p></div><br />
Zur Lösung des Problems ist eine solche Darstellung nicht nötig. Um jedoch zu verdeutlichen, wie viel kleiner die gesuchte Zahl ist, wenn alle Faktoren, die zu viel sind, gestrichen werden, eignet sie sich hervorragend.
</li>
<li>Jetzt bleibt nur noch die einzelnen Primfaktorzerlegungen durch zu gehen und die Häufigkeiten der Primfaktoren zu zählen. Daraus ergibt sich folgende Verteilung:<br />
<div id="attachment_638" class="wp-caption alignnone" style="width: 410px"><img src="http://www.muvik.de/wp-content/uploads/2010/05/primefactor_red-e1274094888619.png" alt="Reduzierte Primfaktoren" title="Reduzierte Primfaktoren" width="400" height="300" class="size-full wp-image-638" /><p class="wp-caption-text">reduzierte Häufigkeitsverteilung</p></div><br />
Das war es schon! Das Multiplizieren aller verbleibenden Faktoren führt zu der gesuchten Zahl:<br />
<code class="bash">1*2*2*2*2*3*3*5*7*11*13*17*19 = 232792560</code>
</li>
</ol>
<h3>Alternative Lösung</h3>
<p>Als alternative Lösung verkaufe ich heute einfach die Python-Implementierung des zuvor beschriebenen handschriftlichen Lösungswegs:</p>
<pre class="brush:python">import numpy as np

def eratosthenes(N):
    """liefert alle Primzahlen bis N"""
    primes = np.arange(1,N+1,1)

    for i in np.arange(2,np.ceil(np.sqrt(N))+1,1):
        primes[i*i-1:N:i] = 0;

    return primes

def prime_fact_counter(N,testPrimes):
    nPrimes = np.size(testPrimes)
    countPrimes = np.zeros_like(testPrimes)

    for i in range(1,nPrimes,1):
        actPrime = testPrimes[i]
        while ((N%actPrime == 0) &#038; (N >= actPrime)):
            N = N / actPrime;
            countPrimes[i] = countPrimes[i] + 1
        countPrimes[0] = 1
    return countPrimes

def solver(N):
    searchProduct = 1.0
    testPrimes = np.trim_zeros(np.sort(eratosthenes(N)))

    freq = np.zeros_like(testPrimes) # array of prime occurance for each factor 1..20
    totFreq = np.zeros_like(testPrimes) # array of total prime occurance

    print(testPrimes)

    for i in range(1,N+1,1):
        freq = prime_fact_counter(i,testPrimes)
        for j in range(0,freq.size,1):
            if (freq[j] > totFreq[j]):
                totFreq[j] = freq[j]

    print(totFreq)

    for j in range(0,totFreq.size,1):
        searchProduct = searchProduct * (testPrimes[j])**(totFreq[j])

    return searchProduct

N = 20

print(solver(N))</pre>
<p>Insgesamt habe ich drei Funktionen definiert. Die erste Funktion ist der bereits bekannte Sieb des Eratosthenes. Sie berechnet alle Primzahlen bis zu einer Zahl N, oder anders ausgedrückt, alle in der Primfaktorenzerlegung vorkommenden Primzahlen der Zahl N.</p>
<p>Die zweite Funktion zählt die Anzahl der Primfaktoren einer bestimmten Zahl N. Das ist wichtig, um die maximale Häufigkeit eines Faktors in einer Zahl festzustellen. Zum Beispiel enthält die 16 genau vier mal die 2 als Faktor: <code class="bash">2*2*2*2 = 16</code>
</p>
<p>Die solver-Funktion durchläuft alle Zahlen von 1 bis 20, berechnet die Primfaktorenzerlegung und überprüft die Häufigkeiten. Am Ende wird aus der reduzierten Häufigkeitsverteilung die gesuchte Zahl errechnet.</p>
<p>Damit wäre das fünfte Problem von Projecteuler gelöst!</p>
<h3>Schlusswort</h3>
<p>Aufgrund des niedrigen Schwierigkeitsgrades des fünften Problems konnte zum ersten Mal in dieser Serie eine rein handschriftliche Lösung präsentiert werden. Alternativ dazu wurde auch eine Python-Implementierung aufgeführt, welche auch für Zahlen größer als N=20 geeignet ist.</p>
<p>In der Hoffnung, dass die simple Idee, die hinter dem Lösungsvorschlag steckt, klar geworden ist, freue ich mich wie immer auf Kommentare und Verbesserungsvorschläge.</p>
<p><a href="http://partners.webmasterplan.com/click.asp?ref=515746&site=6989&type=text&tnb=1" target="_blank">
Deine Stadt - Dein Preis</a><br />Mit CityDeal und vielen Anderen
den Preis drücken!<br /><img src="http://banners.webmasterplan.com/view.asp?ref=515746&site=6989&type=text&tnb=1&js=1" BORDER="0" WIDTH="1" HEIGHT="1" /></p>
<hr />
<p><small>© Muvik for <a href="http://www.muvik.de">muvik-multigrid</a>, 2010. |
<a href="http://www.muvik.de/2010/05/17/projecteuler-loesung-zu-problem-5/">Permalink</a> |
<a href="http://www.muvik.de/2010/05/17/projecteuler-loesung-zu-problem-5/#comments">keine Kommentare</a> |
Teile es mit deinen Freunden:
<a href="http://del.icio.us/post?url=http://www.muvik.de/2010/05/17/projecteuler-loesung-zu-problem-5/&title=Projecteuler: Lösung zu Problem 5">del.icio.us</a>
<a href="http://www.mister-wong.de/addurl/?bm_url=http://www.muvik.de/2010/05/17/projecteuler-loesung-zu-problem-5/&title=Projecteuler: Lösung zu Problem 5">MisterWong</a>
<a href="http://twitter.com/home?status=http://www.muvik.de/2010/05/17/projecteuler-loesung-zu-problem-5/&title=Projecteuler: Lösung zu Problem 5">Twitter</a>
<br/>
Tags: <a href="http://www.muvik.de/tag/primzahlen/" rel="tag">Primzahlen</a>, <a href="http://www.muvik.de/tag/projecteuler/" rel="tag">Projecteuler</a>, <a href="http://www.muvik.de/tag/python/" rel="tag">Python</a><br/>
</small></p>]]></content:encoded>
			<wfw:commentRss>http://www.muvik.de/2010/05/17/projecteuler-loesung-zu-problem-5/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Projecteuler: Lösung zu Problem 3</title>
		<link>http://www.muvik.de/2010/04/03/projecteuler-loesung-zu-problem-3/</link>
		<comments>http://www.muvik.de/2010/04/03/projecteuler-loesung-zu-problem-3/#comments</comments>
		<pubDate>Sat, 03 Apr 2010 09:00:16 +0000</pubDate>
		<dc:creator>Viktor Müller</dc:creator>
				<category><![CDATA[Projekte]]></category>
		<category><![CDATA[Primzahlen]]></category>
		<category><![CDATA[Projecteuler]]></category>
		<category><![CDATA[Python]]></category>

		<guid isPermaLink="false">http://www.muvik.de/?p=413</guid>
		<description><![CDATA[Nach einer etwas längeren Pause geht es heute mit der Projecteuler-Serie weiter. In diesem Artikel stelle ich meine Lösung des dritten Problems dar. Wie bereits bei den vorangehenden Teilen gibt es auch hier wieder alternative Ansätze. Problemvorstellung Das dritte Problem von Projecteuler.net dreht sich allgemein gesprochen um die Primfaktorzerlegung. Aus grauer Schulzeit wissen wir, dass [...]]]></description>
			<content:encoded><![CDATA[<img class="cat-img-wide" alt="Projecteuler: Lösungen mit Python und C++" src="http://muvik.de/categorie_images/projecteuler_serie_start.gif" title="Projecteuler: Lösungen mit Python und C++" width="443" height="98" />
<p class="preview">Nach einer etwas längeren Pause geht es heute mit der Projecteuler-Serie weiter. In diesem Artikel stelle ich meine Lösung des dritten Problems dar. Wie bereits bei den vorangehenden Teilen gibt es auch hier wieder alternative Ansätze.</p>
<p><span id="more-413"></span></p>
<h3>Problemvorstellung</h3>
<p>Das dritte Problem von Projecteuler.net dreht sich allgemein gesprochen um die Primfaktorzerlegung. Aus grauer Schulzeit wissen wir, dass jede natürliche Zahl in Primfaktoren zerlegt werden kann. Des Weiteren haben Primzahlen die berüchtigte Eigenschaft nur durch sich selber und durch die Eins teilbar zu sein. Danach hat jede natürliche Zahl mindestens zwei Faktoren, wobei die Eins als trivialer Faktor beinahe vernachlässigt werden kann. Nicht-Primzahlen, also die zusammengesetzten Zahlen, können folglich in ihre kleinsten Bestandteile, die Primzahlen getrennt werden.</p>
<p>Ich muss zugeben, dass es nun wirklich keine wissenschaftliche Erklärung und kein Beweis für die Existenz einer exakten Primfaktorzerlegung ist, was ich aufgeführt habe. Den Zweck einer netten Einführung erfüllt es jedoch und ich bin glücklich <img src='http://www.muvik.de/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> . Sollte jemand weiterführende Informationen benötigen, so möge Er oder Sie sich im Web umschauen oder einen Hinweis in den Kommentaren hinterlassen, dann lässt sich sicher noch etwas machen.</p>
<p>Also wir wissen nun, wohin das dritte Problem führen wird, doch wie lautet die Aufgabenstellung genauer? Die Auflösung:</p>
<p><strong>Finde den größten Primfaktor der Zahl 600851475143.</strong></p>
<p>Ja, das war es schon! Hört sich doch ganz machbar an, oder? Das haben sich 56838 der derzeit 100370 Hobbymathematiker auch gedacht und die Aufgabe erfolgreich gelöst. Im Vergleich zum ersten und zweiten Problem entspricht dies schon deutlich weniger eingereichten Lösungen. Bisher sind es grob abgeschätzt etwa 50% aller Projecteuler.net Aktivisten. Schlussendlich kann diese Entwicklung auf einen steigenden Schwierigkeitsgrad oder einen sinkenden Motivationsgrad hindeuten, also ein typisches Glas-halb-leer bzw. Glas-halb-voll Problem, welches auf in einem anderen Artikel gelöst wird <img src='http://www.muvik.de/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> .</p>
<h3>Problemeingrenzung</h3>
<p>Kommen wir nun zum Kern der Geschichte: Das erste Durchlesen dieses Problems hinterließ bei mir zwei Gedanken. Der erste Gedanke war, wie finde ich raus, ob eine Zahl nun eine Primzahl ist oder nicht und der zweite Gedanke beschäftigte sich mit dem Prüfen des größten Teilers.</p>
<p>Das erste Teilproblem gehe ich im folgenden mit dem <a href="http://de.wikipedia.org/wiki/Sieb_des_Eratosthenes" target="_blank">Sieb des Erathosthenes (Wikipedia)</a> an.</p>
<p>Das zweite Teilproblem wird ganz simpel gelöst, indem die gegebene Zahl auf Teilbarkeit durch die gefundenen Primzahlen untersucht wird.</p>
<h3>Problemlösung</h3>
<p>Das Sieb des Erathostenes ist eine recht einfache Methode alle Primzahlen bis zu einer bestimmten Zahl N zu finden. Wie im verlinkten Wiki-Artikel schön dargestellt ist, schreibt man alle Zahlen bis einschließlich N auf und beginnt das Sieben. Dazu fängt man mit der kleinsten bekannten Primzahl, also der zwei, an und streicht alle Vielfachen dieser Zahl, dann macht man dasselbe mit der nächsten nicht gestrichenen Zahl nach der Zwei weiter. Auf diese Weise bleiben am Ende alle Primzahlen bis N übrig.</p>
<p>Der langen Rede kurzer Sinn ist in Python-Code im Folgenden dargestellt.</p>
<pre class="brush:python">import time as t
import numpy as np
from math import ceil, sqrt

def eratosthenes_direct(N):
    """
    Berechnet alle Primzahlen bis N mit dem Sieb des Eratosthenes
    """
    primes = np.arange(3,N+1,2)  # only uneven figures
    primes = np.insert(primes,0,2,0) # ... and two

    testFigs = np.arange(3,np.ceil(np.sqrt(N))+2,2)

    for i in testFigs:
        if (primes[((i+1)/2-1)] != 0):
            noPrime = i*i
            while noPrime <= N:
                primes[((noPrime+1)/2-1)] = 0
                noPrime = noPrime + 2 * i

    return np.trim_zeros(np.sort(primes))

def eratosthenes_vect(N):
    primes = np.arange(3,N+1,2)  # only uneven figures
    primes = np.insert(primes,0,2,0) # ... and two

    nUneven = np.size(primes) - 1.0

    for i in np.arange(3,np.ceil(np.sqrt(N))+2,2):
        primes[(i*i+1)/2-1:nUneven+1.0:i] = 0;

    return np.trim_zeros(np.sort(primes))</pre>
<p>In dem Code-Abschnitt habe ich gleich zwei alternative Beispiele für den Sieb des Eratosthenes aufgeführt. Beide Funktionen gehen nach dem gleichen Prinzip vor; der kleine Unterschied ist beim Streichen der Vielfachen zu finden.</p>
<p>Da von vornherein klar ist, dass keine gerade Zahl außer der Zwei Primzahl sein kann, werden nur die ungeraden Zahlen bis N im Vektor <em>primes</em> gespeichert. Bevor ich den Code getippt habe, führte ich das Sieben auf dem Papier aus und bin dann darauf gekommen, dass die größte, auf Vielfache zu prüfende Primzahl die Wurzel von N sein muss. Alle Zahlen die größer als die Wurzel von N sind, müssen demnach Primzahlen sein oder werden beim Sieben gestrichen.</p>
<p>Die an zweiter Stelle aufgeführte Funktion nutzt die Möglichkeiten von Numpy aus, indem keine while-Schleife verwendet wird, sondern das Streichen über eine Indexauswahl des Vektors stattfindet.</p>
<p>Zuletzt werden mit den Numpy-Funktionen <em>sort</em> und <em>trim_zeros</em> die Primzahlen von den Nullen getrennt.</p>
<p>So weit so gut! Nun liefert uns das Sieb einen Vektor an Primzahlen bis zu einer bestimmten Zahl N. Um die Projecteuler-Aufgabe zu lösen, muss noch der größte Primfaktor gefunden werden:</p>
<pre class="brush:python">def solver(N,primes):
    rebuild = 1.0
    prob    = N
    for i in primes:
        while (N%i == 0):
            N = N/i
            found = i
            rebuild = rebuild * found

            if (rebuild/prob > 0.9):
                print(rebuild)
                return found

    return 0.0</pre>
<p>Der Solver durchläuft alle Primzahlen, prüft Sie auf Teilbarkeit und, wenn die Zahl ein Teiler ist, so wird sie als ein Lösungskandidat gespeichert. Die while-Schleife soll doppelte Primzahlen ebenfalls erfassen.</p>
<p>Der Solver wurde von mir nicht weiter validiert und könnte durchaus noch das eine oder andere Problem bereiten, aber für die von mir getesteten Zahlen hat alles funktioniert.</p>
<h3>Lösungsanalyse</h3>
<p>Kommen wir nun zur Anwendung des Siebs und des Solvers.</p>
<p>Zunächst muss eine Grenze für das Sieb festgelegt werden. Da ich den Solver so geschrieben habe, dass er mir nur einen Lösungskandidaten ausgibt, wenn die Zahl von Projecteuler rekonstruiert werden konnte, habe ich als Grenze zunächst 1000 ausprobiert. Das war zu wenig und ich erhöhte die Grenze auf 10000, was eine Lösung ausspuckte.</p>
<p>Der Aufruf:</p>
<pre class="brush:python">N  = 10000
Pe = 600851475143
#
t0 = t.clock()
primes = eratosthenes_direct(N)
prim = solver(Pe,primes)
tn = t.clock()

print("Zeit fuer Primzahlensieb: %.15f" %(tn-t0))
print("Primzahl: ")
print(prim)

t0 = t.clock()
primes2 = eratosthenes_vect(N)
prim2 = solver(Pe,primes2)
tn = t.clock()

print("Zeit fuer Primzahlensieb: %.15f" %(tn-t0))
print("Primzahl: ")
print(prim2)</pre>
<p>Und die Ausgabe:</p>
<p><code class="bash">600851475143.0<br />
Zeit fuer Primzahlensieb: 0.080000000000000<br />
Primzahl:<br />
6857<br />
600851475143.0<br />
Zeit fuer Primzahlensieb: 0.030000000000000<br />
Primzahlen:<br />
6857</code></p>
<p>Abgesehen davon, dass das Ergebnis die richtige Lösung für das dritte Projecteuler-Problem ist, kann festgestellt werden, dass der Sieb ohne die while-Schleife um mehr als das doppelte schneller ist. Das war zu erwarten, denn die Numpy-Funktionen werden sicherlich nicht von Anfängern, wie ich einer bin, geschrieben. </p>
<h3>Fazit</h3>
<p>Damit wäre das dritte Problem gelöst. Auch diesmal gibt es eine kleine Neuerung im Blog: mit dem Sieb des Eratosthenes wurde der erste Algorithmus vorgestellt. Ich denke, dass ich in nächster Zeit wieder etwas mehr Zeit für den Blog haben werde und daher öfter etwas schreiben kann.</p>
<p>Jetzt sind aber erstmal die Leser wieder an der Reihe mit Verbesserungsvorschlägen und weiteren Lösungsansätzen. Ich freue mich darauf.</p>
<p><a href="http://partners.webmasterplan.com/click.asp?ref=515746&site=6989&type=text&tnb=1" target="_blank">
Deine Stadt - Dein Preis</a><br />Mit CityDeal und vielen Anderen
den Preis drücken!<br /><img src="http://banners.webmasterplan.com/view.asp?ref=515746&site=6989&type=text&tnb=1&js=1" BORDER="0" WIDTH="1" HEIGHT="1" /></p>
<hr />
<p><small>© Muvik for <a href="http://www.muvik.de">muvik-multigrid</a>, 2010. |
<a href="http://www.muvik.de/2010/04/03/projecteuler-loesung-zu-problem-3/">Permalink</a> |
<a href="http://www.muvik.de/2010/04/03/projecteuler-loesung-zu-problem-3/#comments">2 Kommentare</a> |
Teile es mit deinen Freunden:
<a href="http://del.icio.us/post?url=http://www.muvik.de/2010/04/03/projecteuler-loesung-zu-problem-3/&title=Projecteuler: Lösung zu Problem 3">del.icio.us</a>
<a href="http://www.mister-wong.de/addurl/?bm_url=http://www.muvik.de/2010/04/03/projecteuler-loesung-zu-problem-3/&title=Projecteuler: Lösung zu Problem 3">MisterWong</a>
<a href="http://twitter.com/home?status=http://www.muvik.de/2010/04/03/projecteuler-loesung-zu-problem-3/&title=Projecteuler: Lösung zu Problem 3">Twitter</a>
<br/>
Tags: <a href="http://www.muvik.de/tag/primzahlen/" rel="tag">Primzahlen</a>, <a href="http://www.muvik.de/tag/projecteuler/" rel="tag">Projecteuler</a>, <a href="http://www.muvik.de/tag/python/" rel="tag">Python</a><br/>
</small></p>]]></content:encoded>
			<wfw:commentRss>http://www.muvik.de/2010/04/03/projecteuler-loesung-zu-problem-3/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>

