A jó öreg Diophantosz

E szép napon a while-ciklust egyenletmegoldásra fogjuk használni. Olyan egyenleteket tudunk vele megoldani, amik megoldása egész szám. Hogy miért csak ilyet? Tör(p)d a fejed, a végén elmondom – de hátha addigra rájössz.

Diophantos (wikimedia commons)

Szerencsére van fényképünk a híres tudósról

Kezdjük egy görög matematikus sírkőfeliratával:

Ím ezen emlékmű Diophantosz hamva fölött áll,
Élte korát adják művei és ez a kő.
Ifjúként tölté hatod életét isteni kegyből,
Még tizenketted után, gyenge szakálla kiüt.
Egy heted élttel utóbb nászfáklyák égtek előtte,
Öt évvel aztán kisfia megszületett.
Ó, boldogság nélküli ifjú, fél annyi évet
Mint tudós apa élt, s lett hona szürke Hádész.
Még négy esztendőn a tudás könnyíti gyászát,
S hosszú élet után őt is elérte a vég.

(Egmont Colerus: Az egyszeregytől az integrálig, Frankin Társulat, Bp, pp. 128, fordító és évszám nélkül, idézi: Juhász Tibor – Kiss Zsolt: Programozási ismeretek, Műszaki Kiadó, Bp, 2011.)

Talán sejted, hogy ki akarjuk találni, hogy Diophantosz hány évesen halt meg. Mondjuk, ha nem sejted, akkor is ki akarjuk találni.

Előtanulmány: oldjuk meg az x2 + 2x + 5 = 11668 egyenletet a természetes számok halmazán… Nem, nem, csak semmi megoldóképlet, mert attól a phalra mászunk. Majd próbálgatunk, jó?? Így:


x = 0
while x**2 + x*2 + 5 != 11668:
    x += 1
print(x, 'a megoldás.')

Az x**2 jelentése iksznégyzet, a felkiáltójelegyenlőjé pedig: nem egyenlő. Azaz addig ügyködünk, amíg nem lesz egyenlő. Az ügyködés nem valami bonyolult: először megpróbáljuk nullával, aztán eggyel, aztán kettővel, és hip-hopp eljutunk 107-ig, ahol a while feltétele nem teljesül, hiszen ott egyenlő lesz a kifejezés két oldala, azaz a cikluson átugrunk, és boldogan kiírjuk az eredményt.

Akkor most legördítjük a követ Diophantosz éveinek számáról:

A program lényegi része:


kor = 0
while kor/6 + kor/12 + kor/7 + 5 + kor/2 + 4 != kor:
    kor += 1
print(kor, 'évet élt.')

Az előző, egyenletmegoldós programhoz képest lényegében semmi újdonság nincs, az igazi feladat az egyenletet jól megírni. A videóban láthatod még azt is, hogy miként lehet sok sort egyhuzamra kiíratni a Pythonnal – a megoldás a 3(!) idézőjel.

Feladatok

F0009a: Keresd meg az iménti, x2 + 2x + 5 = 11668 egyenlet negatív gyökét is! (A megoldás lényege itt van, csak fehérrel. Jelöld ki és meglátod: x -= 1 (vagy x = x – 1) )

F0009b: Az x2 + 2x + 5 = 11668 egyenlet gyökeit megtaláló programokban a ciklus belépési feltétlében a != lecserélhető valamilyen más összehasonlító operátorra is. Melyikben melyikre? (Ha kell, akkor a kisebbegyenlő: <= és nem =<. Hasonlóan a nagyobbegyenlőt is meg tudod alkotni.)

F0009c: “Majmok játszottak az erdőben. Nyolcadrészük négyzetre emelve már ugrál a fákon. A fennmaradó 12 táncolva és nagy zajjal a zöld bokrok között szalad. Hányan voltak összesen?” (forrás: Juhász Tibor – Kiss Zsolt: Programozási ismeretek, Műszaki Kiadó, Bp, 2011.) (A megoldás feltétele itt van, csak fehérrel. Jelöld ki, és meglátod: while (majmok/8)**2 + 12 != majmok: )

Válasz a lecke elején feltett kérdésre

No és akkor miért is csak olyan egyenleteket tudunk while-ciklussal megoldani, aminek egész szám a gyöke? Mert ha tört gyök is lehetséges, akkor pontsoan mennyivel kell léptetni a próbálkozást? 0,1-gyel, vagy 0,000000000000001-gyel? Vagy még kisebb lépésekkel? Hát ezért.

 

A múltkor megtanultunk összetett feltételeket használni a while-ciklusban. Legközelebb megtanuljuk, mikor kell abbahagyni.

 

Advertisements

A jó öreg Diophantosz” bejegyzéshez ozzászólás

  1. Kedves raerek!

    Az f0009b feladatban a megoldás ugye az, hogy a != helyett < jelet írok, ugye? Nem pedig kisebbegyenlőt, azt csak beugratásképpen írod segítségként, ugye?

    És ha jól gondolom, a negatív gyöknél is < a megoldás, mert a négyzetre emelés miatt ott is a 11668 felé közelítünk.

    Kedvelés

Vélemény, hozzászólás?

Adatok megadása vagy bejelentkezés valamelyik ikonnal:

WordPress.com Logo

Hozzászólhat a WordPress.com felhasználói fiók használatával. Kilépés / Módosítás )

Twitter kép

Hozzászólhat a Twitter felhasználói fiók használatával. Kilépés / Módosítás )

Facebook kép

Hozzászólhat a Facebook felhasználói fiók használatával. Kilépés / Módosítás )

Google+ kép

Hozzászólhat a Google+ felhasználói fiók használatával. Kilépés / Módosítás )

Kapcsolódás: %s