Középiskolai Matematikai és Fizikai Lapok
Informatika rovattal
Kiadja a MATFUND Alapítvány
Már regisztráltál?
Új vendég vagy?

Az I. 124. feladat (2006. február)

I. 124. Írjunk programot az ax+by=c alakú diophantoszi egyenletek megoldására. A program a standard bemeneten kapja a legfeljebb 4-jegyű a, b, c, egész számokat egy sorban, szóközzel elválasztva. A program írja ki az egész megoldásokat paraméteres alakban, szintén egy sorban, a példákban látható formátumban. Ha nincs megoldás, akkor írja ki azt, hogy ,,nincs megoldás''.

Példák:

Beküldendő a program forráskódja (i124.pas, i124.cpp, ...).

(10 pont)

A beküldési határidő 2006. március 16-án LEJÁRT.


A feladat megoldásához először nézzük végig a speciális eseteket, majd az általános esetet.

1. eset: 0*x+0*y=0

Ha a és b is 0, akkor az egyenletnek csak akkor van megoldása, ha c is 0. Ebben az egyetlen esetben van szükségünk két változóra a megoldáshoz:

x=t;   y=u

2. eset: 0*x+b*y=c

Ha a vagy b 0, akkor az egyenlet csak akkor oldható meg, ha a nem-nulla szorzótényező osztója c-nek, lenkező esetben az egyenlet bal oldala osztható lenne b-vel, a jobb oldala viszont nem. Ebben az esetben a megoldás:

x=t;   y=c/b

3. eset: a*x+b*y=c

Ha sem a, sem b nem 0, a megoldás a kétváltozós, lineáris diophantoszi egyenlet általános megoldása:

x=x0+b/lnko(a,b)*t;   y=y0;   a/lnko(a,b)*t

ahol x0 és y0 az egyenlet egy megoldása. Megoldás csak akkor létezik, ha c osztható lnko(a,b)-vel. (lnko(a,b) = a és b legnagyobb közös osztója )

x0 és y0 meghatározására létenek különböző algoritmusok, de mivel az együtthatók viszonylag kicsi számok, a legegyszerübb, ha sorban végignézzük 0-tól az egész számokat, míg találunk egy megfelelőt: c-a*x0 -nak oszthatónak kell lennie b-vel. Bizotsan találunk egy ilyet, a [0;b/lnko(a,b)] halmazban.

A megoldáshoz szükségünk van az lnko(a,b) meghatározására, ezt az euklideszi algoritmussal könnyen megtehetjük: vegyük a nagyobbik szám helyett a nagyobbik szám kisebbik számmal való osztási maradékát, és ezt ismételjük addig, amíg valamelyik szám 0 nem lesz.

(x0 és y0 meghatározására lehetséges lenne például úgy, hogy az egyenletet átalakítjuk: (tegyük föl, hogy a<b, és jelölje b%a a b a-val való osztási maradékát, b/a pedig b és a hányadosának egészrészét)

c=b*y+a*x=(b/a*a+b%a)*y+a*x=a*(b/a*y+x)+b%a*y=a*z+b%a*y=...

ez az átalakítás az euklideszi algoritmus szerint megy, minden lépésben egy új ismeretlent bevezetve. Az átalakítások végén:

c=lnko(a,b)*xn+0*xn-1

egyenletet kapjuk, innen xn értéke meghatározható. xn-1 értékét pedig szabadon megválaszthatjuk. Ebből az egyenletből az is látszik, hogy miért kell c-nek oszthatónak lennie lnko(a,b)-vel. xn és xn-1-ből visszaszámolható x és y, ami a diophantoszi egyenlet egy megoldása lesz.)

Letölthető megoldás: i124.pas

Engedy István


Statisztika:

10 dolgozat érkezett.
10 pontot kapott:Balambér Dávid, Czigler András, Györök Péter, Kovács 129 Péter, Ozsvárt László, Szoldatics András, Véges Márton, Vincze János.
3 pontot kapott:1 versenyző.
0 pontot kapott:1 versenyző.

A KöMaL 2006. februári informatika feladatai