<?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; Palindrom</title>
	<atom:link href="http://www.muvik.de/tag/palindrom/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 4</title>
		<link>http://www.muvik.de/2010/04/30/projecteuler-loesung-zu-problem-4/</link>
		<comments>http://www.muvik.de/2010/04/30/projecteuler-loesung-zu-problem-4/#comments</comments>
		<pubDate>Fri, 30 Apr 2010 09:00:10 +0000</pubDate>
		<dc:creator>Viktor Müller</dc:creator>
				<category><![CDATA[Projekte]]></category>
		<category><![CDATA[Palindrom]]></category>
		<category><![CDATA[Projecteuler]]></category>
		<category><![CDATA[Python]]></category>

		<guid isPermaLink="false">http://www.muvik.de/?p=493</guid>
		<description><![CDATA[Heute wird die Lösung des vierten Projekteuler-Problems vorgestellt. Es ist nun ein guter Monat vergangen, seit ich das Problem gelöst habe, deswegen hoffe ich, dass ich noch alles zusammenbekomme. Problemvorstellung Das Durchlesen des vierten Problems hat mir wieder einmal vor Augen geführt, warum die Mathematik auf viele Menschen eine abschreckende Wirkung hat. In der Aufgabe [...]]]></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">Heute wird die Lösung des vierten Projekteuler-Problems vorgestellt. Es ist nun ein guter Monat vergangen, seit ich das Problem gelöst habe, deswegen hoffe ich, dass ich noch alles zusammenbekomme.</p>
<p><span id="more-493"></span></p>
<h3>Problemvorstellung</h3>
<p>Das Durchlesen des vierten Problems hat mir wieder einmal vor Augen geführt, warum die Mathematik auf viele Menschen eine abschreckende Wirkung hat. In der Aufgabe gilt es das größte Palindrom zu finden, welches sich aus zwei dreistelligen Zahlen ergibt.</p>
<p>Da ist mir erstmal durch den Kopf gegangen: Pali&#8230;was?</p>
<p>Dabei ist die Mathematik doch viel einfacher als es klingt, der Blick hinter den Vorhang lohnt sich immer. Gesagt, getan und herausgefunden, dass Palindrome keine Medikamente und auch nichts zum Essen sind, sondern Zahlen, welche von vorne oder von hinten gelesen, den selben Wert ergeben:<br />
<code class="bash">22, 232, 23232, 996676699, ...</code><br />
Der Fantasie kann hierbei freier Lauf gewährt werden. Es gibt jedoch nicht nur Palindrom-Zahlen, sondern auch Namen, wie zum Beispiel Anna.</p>
<p>Um die Aufgabenstellung nochmal hervorzuheben, sei sie nochmal besonders genannt:</p>
<p><strong>Finde das größte Palindrom, welches sich multiplikativ aus zwei dreistelligen Zahlen ergibt.</strong></p>
<p>Aufgrund des Fremdwortes, welches genauer betrachtet nur für eine optisch besondere Zahlenmenge steht, hört sich die Aufgabe erstmal abschreckend an. Jedoch haben sich inklusive meiner Wenigkeit bis heute 54282 Projecteuler-Aktivisten an das Problem mit erfolgreichem Ausgang getraut. Verglichen mit den vorangehenden Problemen <a href="http://www.muvik.de/2010/04/03/projecteuler-loesung-zu-problem-3/">3</a> und <a href="http://www.muvik.de/2010/02/17/projecteuler-loesung-zu-problem-2/">2</a> haben sich an dieser Aufgabe noch etwas mehr Menschen die Zähne aus gebissen. Das hat dann dazu geführt, dass nochmal weniger Lösungen eingereicht wurden. Aber wir lassen uns doch nicht von irgendwelchen Statistiken abschrecken <img src='http://www.muvik.de/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' />  und grenzen das Problem etwas näher ein.</p>
<h3>Problemeingrenzung</h3>
<p>Hat man sich erstmal klar gemacht, was nun Palindrome sind, so stellt sich sogleich die Frage, wie man mit Hilfe einer Programmiersprache überprüfen kann, ob eine Zahl die besondere Eigenschaft der Palindrome besitzt oder nicht. Dies betrachte ich zunächst als erste kleine Herausforderung bei dem Problem.</p>
<p>Die zweite Herausforderung ist in meinen Augen, eine sinnvolle Suche nach Palindromen zu gestalten. Die straight forward Methode wäre alle Zahlen zu multipilzieren und das Produkt auf die Palindrom-Eigenschaft zu prüfen. Doch diesmal dachte ich mir, biete ich keine straight forward Lösung an, sondern steige gleich mit ein Paar Gedanken ins Programmieren ein.</p>
<p>Das Resultat einiger Gedanken kann zum Beispiel sein:</p>
<ul>
<li>Die größte Zahl aus einem Produkt zweier dreistelliger Zahlen ergibt sich aus den Zahlen 999 und 999, deswegen lassen wir die Suche von diesen Zahlen beginnen.</li>
<li>Das größte Palindrom hat wahrscheinlich eine 9 an der ersten und somit auch an der letzten Stelle. Daher sind nur Faktoren interessant, die definitiv eine 9 an letzter Stelle ergeben. Dazu zählen folgende Paare: <code class="bash">(7,7) (3,3) (1,9) (9,1)</code></li>
<li>Um garantiert das größte Palindrom mit dem Musters 9*****9 zu finden, muss in erster Annahme lediglich die Zehner-Stelle der Faktoren variiert werden. Diese wird in jedem Test um 1 reduziert. Sobald an der Hunderttausender-Stelle eine 8 auftaucht, wird angenommen, dass es schon nicht das größte Palindrom sein kann.</li>
</ul>
<p>Mit diesem &#8220;Wissen&#8221; im Hinterkopf, lässt sich das vierte Projecteuler Problem schnell lösen.
</p>
<h3>Problemlösung</h3>
<p>Aus der Problemeingrenzung wissen wir, dass es zwei Herausforderungen bei dieser Aufgabe gibt. Die erste ist der Palindromtest, die zweite die sinnvolle Suche nach dem größten Palindrom. Dazu habe ich folgenden Code geschrieben:</p>
<pre class="brush:python">import numpy as np

def test_palindrom(x):
    return x == int(str(x)[::-1])

#    return x == reverse_int(x)

def solver(L,R):
    chL = np.array([-2,-6,-8,0])
    chR = np.array([-2,-6,0,-8])

    maxChange = range(0,11,1)

    palindroms = np.array([[1,2,3]],ndmin=2)

    for k in [0,1,2,3]:
        for i in maxChange:

            LFact = L + chL[k] - i*10

            for j in maxChange:

                RFact =  R + chR[k] - j*10
                testFig = LFact * RFact

                if test_palindrom(testFig):
                    palindroms = np.append(palindroms, [[testFig, LFact, RFact]],axis=0)

    return palindroms

L = 999
R = 999

print(solver(L,R))</pre>
</p>
<p>Die zu Beginn definierte Funktion test_palindrom(x) überprüft die Palindromeigenschaft. Dies geschieht auf eine einfache Weise: zuerst wird die Zahl x in einen String umgewandelt, dann wird der String gedreht und wieder in einen Integer-Wert konvertiert. Auf diese Weise kann getestet werden, ob x von beiden Seiten gelesen den selben Wert besitzt.</p>
<p>Die Doppelpunktnotation, welche ich zum Umdrehen des Strings verwendet habe, kennt wahrscheinlich jeder Matlab-Nutzer. Der erste Doppelpunkt steht für den ersten Wert, der ausgegeben werden soll, der zweite für den Letzten und die &#8220;-1&#8243; zeigt an, dass jeder 1-ste Wert ausgegeben werden soll, aber von hinten.</p>
<p>Wenn nun x kein Palindrom ist, dann spuckt die Funktion den wert &#8220;0&#8243; oder &#8220;false&#8221; aus.</p>
<p>Die solver-Funktion baut auf den zuvor gemachten Gedanken auf. Als Eingabewerte werden jeweils 999 erwartet. Die numpy-Vektoren &#8220;chL&#8221; und &#8220;chR&#8221; beinhalten die Variation der Suchzahlen. Damit werden folgende Zahlen als Startzahlen verwendet:<br />
<code class="bash">(997,997) (993,993) (991,999) (999,991)</code></p>
<p>Der Vektor maxChange bewirkt, dass von den Startwerten maximal Zehn mal die Zehn abgezogen wird.</p>
<p>Durch die drei Schleifen wird sichergestellt, dass auch jede Zahl mit jeder multipliziert wird, die nach der Eingrenzung noch übrig geblieben sind. Ist eine Zahl ein Palindrom, so wird sie in einem Feld samt der Faktoren gespeichert und zurückgegeben.</p>
<p>Der langen Rede kurzer Sinn besteht dann aus drei Zeilen:<br />
<code class="bash">[[     1      2      3]<br />
 [906609    993    913]<br />
 [906609    913    993]]<br />
</code> Erwartungsgemäß trat zumindest ein Palindrom mit einer äußeren 9 auf. Da habe ich ziemlich Glück gehabt <img src='http://www.muvik.de/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> . Ebenfalls war zu erwarten, dass das Palindrom doppelt vorkommt, weil mit der gezeigten Methode jedes Zahlenpaar zwei Mal multipliziert wird. Da wäre also noch etwas Optimierungspotential vorhanden.</p>
<h3>Fazit</h3>
<p>Da es heute keine alternativen Lösungen gibt, komme ich gleich zum Fazit. Das vierte Problem war für mich eine interessante Aufgabe, bei der ich Python etwas besser lernen konnte. Zum Beispiel war mir nicht bekannt, dass in Python die Doppelpunkt-Notation auch mit negativen Zahlen funktioniert. Also wieder etwas gelernt.</p>
<p>Nun hoffe ich, dass es euch auch Spass gemacht hat, das Problem und die Lösung nachzuvollziehen und freue mich über Kommentare.</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/30/projecteuler-loesung-zu-problem-4/">Permalink</a> |
<a href="http://www.muvik.de/2010/04/30/projecteuler-loesung-zu-problem-4/#comments">ein Kommentar</a> |
Teile es mit deinen Freunden:
<a href="http://del.icio.us/post?url=http://www.muvik.de/2010/04/30/projecteuler-loesung-zu-problem-4/&title=Projecteuler: Lösung zu Problem 4">del.icio.us</a>
<a href="http://www.mister-wong.de/addurl/?bm_url=http://www.muvik.de/2010/04/30/projecteuler-loesung-zu-problem-4/&title=Projecteuler: Lösung zu Problem 4">MisterWong</a>
<a href="http://twitter.com/home?status=http://www.muvik.de/2010/04/30/projecteuler-loesung-zu-problem-4/&title=Projecteuler: Lösung zu Problem 4">Twitter</a>
<br/>
Tags: <a href="http://www.muvik.de/tag/palindrom/" rel="tag">Palindrom</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/30/projecteuler-loesung-zu-problem-4/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>

