<?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; Pythagoras</title>
	<atom:link href="http://www.muvik.de/tag/pythagoras/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 9</title>
		<link>http://www.muvik.de/2010/07/26/projecteuler-loesung-zu-problem-9/</link>
		<comments>http://www.muvik.de/2010/07/26/projecteuler-loesung-zu-problem-9/#comments</comments>
		<pubDate>Mon, 26 Jul 2010 07:48:30 +0000</pubDate>
		<dc:creator>Viktor Müller</dc:creator>
				<category><![CDATA[Projekte]]></category>
		<category><![CDATA[Projecteuler]]></category>
		<category><![CDATA[Pythagoras]]></category>
		<category><![CDATA[Python]]></category>

		<guid isPermaLink="false">http://www.muvik.de/?p=1351</guid>
		<description><![CDATA[Jetzt geht es beinahe schon Schlag auf Schlag: nach der Vorstellung der Lösung des achten folgt sofort die Lösung des neunten Problems. Das neunte Projecteuler-Problem beschäftigt sich mit dem Satz von Pythagoras und der Bildung von sogenannten Pythagoras-Tripeln. Wie gewohnt, erfolgt auch diesmal die Lösung mit Python. Problemvorstellung Das neunte Projecteuler-Problem dreht sich um den [...]]]></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">Jetzt geht es beinahe schon Schlag auf Schlag: nach der Vorstellung der Lösung des achten folgt sofort die Lösung des neunten Problems. Das neunte Projecteuler-Problem beschäftigt sich mit dem Satz von Pythagoras und der Bildung von sogenannten Pythagoras-Tripeln. Wie gewohnt, erfolgt auch diesmal die Lösung mit Python.</p>
<p><span id="more-1351"></span></p>
<h3>Problemvorstellung</h3>
<p>Das <a href="http://projecteuler.net/index.php?section=problems&#038;id=9">neunte Projecteuler-Problem</a> dreht sich um den <a href="http://de.wikipedia.org/wiki/Satz_des_Pythagoras">Satz von Pythagoras</a>, welcher eine Aussage über die Seitenlängen eines rechtwinkligen Dreiecks liefert. Wie die meisten Schüler mehr oder weniger leidvoll erfahren haben, ergibt sich aus der Addition der Quadrate der zwei kürzeren Seiten, der Katheten, eines rechtwinkligen Dreiecks genau das Quadrat der längsten Seite, der Hypotenuse. Dass der Satz des Pythagoras auch heute noch bei Schülern sehr gefragt  ist, lässt sich auf <a href="http://www.gutefrage.net/frage/mathe-pythagoras-pendel-hilfe">gutefrage.net</a> nachlesen.</p>
<p>Ist nun die Länge der zwei Katheten und der Hypotenuse eines Dreiecks durch natürliche Zahlen (ganze Zahlen) beschreibbar, so bezeichnet man die drei Zahlen als pythagoreisches Tripel.</p>
<p>In dem neunten Projecteuler-Problem geht es darum, ein bestimmtes pythagoreisches Tripel zu finden. Dieses Tripel soll folgende Bedingungen erfüllen:</p>
<ol>
<li><code>a + b + c = 1000</code>,</li>
<li><code>a < b < c </code> und natürlich</li>
<li><code>a^2 + b^2 = c^2</code></li>
</ol>
<p>So viel sei zur Aufgabenstellung angemerkt.</p>
<p>Obwohl der Satz des Pythagoras eine elementare Unterrichtseinheit in der Schule darstellt, haben zum heutigen Zeitpunkt trotzdem nur 52711 der insgesamt 114860 Projecteuler-Teilnehmer die Aufgabe mit Erfolg gelöst und das richtige Ergebnis eingegeben.</p>
<p>Als Ergebnis werden übrigens nicht die drei Zahlen <code>a, b, c</code> erwartet, sondern ihr Produkt: <code>a * b * c</code>.</p>
<h3>Problemeingrenzung</h3>
<p>Geht man ganz unbedarft an das Problem heran, kommt man schnell auf die Lösung, einfach alle Zahlen für a und b einzusetzen, die die Bedingung <code>a < b</code> erfüllen. Dann muss die Hypotenuse errechnet werden. Was noch bleibt, ist zu testen, ob die Summe der drei Zahlen auch wirklich 1000 ergibt.</p>
<p>Damit hätte man zwei <code>for</code>-Schleifen und eine <code>if</code>-Abfrage und natürlich die Lösung des Problems. Eine elegante Lösung ist jedoch etwas anderes!</p>
<p>Ebenso unbedarft kann das Problem nur ein wenig genauer angeschaut werden. Ein Quäntchen Glück vorausgesetzt, erkennt man dabei, dass man bei drei Unbekannten genau zwei Gleichungen gegeben hat. Dies kann ausgenutzt werden, um die Lösung etwas komplizierter erscheinen zu lassen.</p>
<p>Dabei lässt sich zum Beispiel die erste Bedingung <code>a + b + c = 1000</code> nach <code>c</code> auflösen und in die dritte einsetzen:<br />
<code class="bash">a + b + c = N<br />
c = N - a - b<br />
a^2 + b^2 - N^2 - 2*N*(a+b) - (a+b)^2 = 0</code></p>
<p>Die letzte Gleichung kann nun nach zum Beispiel <code>b</code> aufgelöst werden:<br />
<code class="bash">b = (0.5*N^2 - N*a)/(N - a)</code></p>
<p>Das Auflösen nach <code>b</code> lässt sich über die zweite Bedingung motivieren. Wenn wir nun Zahlen von 1 ausgehend für a einsetzen, dann wird die zweite Bedingung immer erfüllt bleiben.</p>
<p>Damit müssen wir nur noch die Zahlen für a vorgeben und testen, ob der Quotient eine natürliche Zahl ergibt.</p>
<p>Weiter wollen wir das Problem nicht mehr mit mathematischem Hintergrund aufblasen und gehen zur Lösung mit Python über.</p>
<h3>Problemlösung</h3>
<p>Abgesehen davon, dass dieses Problem eigentlich keiner Implementierung in einer Programmiersprache bedarf, wenn die Informationen zur <a href="http://de.wikipedia.org/wiki/Pythagoreisches_Tripel">Erzeugung eines pythagoreischen Tripels</a> ausgenutzt werden, ist es wohl eines der kürzesten Lösungen, die ich im Rahmen dieser Serie bisher vorgestellt habe.</p>
<pre class="brush:python">def search(a,N):
    found = 0

    while (found == False):
        for i in a:
            num = 0.5*N*N - N * i
            denom = N - i
            if (num%denom == 0.0):
                found = 1
                result = np.array([i,num/denom])
    return result

N = 1000.0

aa = np.arange(int(N)/3)

erg = search(aa,N)

a = erg[0]
b = erg[1]
c = N-a-b

print(a,b,c,a*b*c)</pre>
<p>Innerhalb dieser Zeilen habe ich die wenigen Gedanken aus der Problemeingrenzung verarbeitet. Der aufmerksame Leser wird gemerkt haben, dass noch eine zusätzliche Vereinfachung im Code berücksichtigt wurde.</p>
<p>Aufgrund der gegebenen Bedingungen wurde für <code>a</code> ein etwas kleinerer Suchbereich von maximal bis 300 eingestellt. Gehen wir von einem Extremfall aus:<br />
<code class="bash">a = 300<br />
b = 301<br />
a^2 + b^2 = c^2 = 180601<br />
=> c = 424.972<br />
</code></p>
<p>Prüfen wir die erste Bedingung, so finden wir, dass die Summe bereits ca. 1026 beträgt. Das ist schon zu viel.</p>
<p>Lässt man sich nun das Ergebnis berechnen, so erhält man folgende Ausgabe:<br />
<code class="bash">(200.0, 375.0, 425.0, 31875000.0)</code></p>
<p>Damit wäre die gesuchte Zahl: <code>31875000</code>.</p>
<h3>Schlusswort</h3>
<p>Ich gebe zu, dass der Lösungsvorschlag nicht der Weisheit letzter Schluss ist, doch für dieses Problem funktioniert er gut und zuverlässig. Die Grenzen, die Projecteuler vorgibt, werden nicht annähernd erreicht.</p>
<p>Natürlich wäre ich daher besonders froh, den einen oder anderen Lösungsvorschlag in den Kommentaren zu sehen <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/26/projecteuler-loesung-zu-problem-9/">Permalink</a> |
<a href="http://www.muvik.de/2010/07/26/projecteuler-loesung-zu-problem-9/#comments">keine Kommentare</a> |
Teile es mit deinen Freunden:
<a href="http://del.icio.us/post?url=http://www.muvik.de/2010/07/26/projecteuler-loesung-zu-problem-9/&title=Projecteuler: Lösung zu Problem 9">del.icio.us</a>
<a href="http://www.mister-wong.de/addurl/?bm_url=http://www.muvik.de/2010/07/26/projecteuler-loesung-zu-problem-9/&title=Projecteuler: Lösung zu Problem 9">MisterWong</a>
<a href="http://twitter.com/home?status=http://www.muvik.de/2010/07/26/projecteuler-loesung-zu-problem-9/&title=Projecteuler: Lösung zu Problem 9">Twitter</a>
<br/>
Tags: <a href="http://www.muvik.de/tag/projecteuler/" rel="tag">Projecteuler</a>, <a href="http://www.muvik.de/tag/pythagoras/" rel="tag">Pythagoras</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/26/projecteuler-loesung-zu-problem-9/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

