Bennfoglalás és egyenlő egészekre osztás elvi különbsége és számítása

Az egész számok közötti osztás műveletét két módon szoktuk mondani, ha például az osztandó 105 és az osztó 3:

a) 105-ben a 3

b) 105 osztva 3-mal

Bár a kettő megfogalmazást szinonimaként használjuk, de valójában a kettő szemantikailag nem azonos.

Az a) esetben azt kérdezzük, hogy a 3 hányszor, hány egésszer van meg a 105-ben. Más szóval hány darab 3 elemből álló csoportot tudunk a 105-ből képezni. Ez magában hordozza, hogy nem biztos, hogy maradék nélkül lehet a csoportosítást megtenni. A 105-ből 35 db 3-as csoportot lehet képezni. Tehát a 105-ben a 3 35-ször van meg. A 106-ból ugyancsak 35 db 3-as csoportot lehet alkotni, de még marad 1.

E kérdés általános megválaszolására egy egyszerű algoritmust tudunk felállítani. Annyit kell tenni, hogy az osztandóból elkezdjük kivonni az osztót és számoljuk, hogy hányszor tudtuk úgy kivonni, amíg az eredmény negatív nem lesz. Az ezt megvalósító div1 függvény definíciója látható alább. E függvény helyett alkalmazható az egész osztást (floor division) végző operátor, amit szintén itt láthatunk.

A b) esetben azt keressük, hogy a 105-öt hogyan lehet három egyenlő egész részre osztani, és ha ez sikerül, mekkora egy rész. Ez tehát nem ugyanaz kérdés, mint az a) esetben. Ennek megfelelően az a) esetben alkalmazott fokozatos kivonások módszere sem alkalmazható, mert most nem arra vagyunk kíváncsiak, hogy hány 3 elemű csoport képezhető, hanem arra, hogy ha 3 egyenlő részre osztjuk a 105-t, akkor mekkora lesz egy rész. Ebben az esetben a maradék nem értelmezhető, hiszen azt kérdezzük, hogy hány egyenlő egész részre tudjuk az osztandó egész számot osztani. (Mivel ez nem mindig lehetséges, ez vezet el a törtek fogalmához.) A b) kérdésre a válasz tehát kétféle lehet: vagy egy egész szám, vagy az, hogy nincs a műveletnek megoldása.

A feladat elvi megoldását a lehetséges egész hányadosok számbavétele és az osztóval való szorzás eredményének vizsgálata jelenti. Ezt a következő div2 függvénnyel valósítjuk meg.

Most az // operátorral való egész osztás önmagában nem adna koncepcionálisan helyes eredményt, hiszen az akkor is ad egy egész számértéket, ha nem teljesül az a feltétel, hogy a hányadosnak az osztóval való szorzata az osztandót kell kiadnia. Ha mégis használni akarjuk a // operátort (pl. mert akkor nem kell külön függvényt definiálni), akkor azt a helyes eredmény érdekében csak kiegészítő feltételvizsgálattal tudjuk megtenni: megnézzük, hogy az eredmény egész-e, és ha nem akkor None lesz az eredmény, egyébként pedig az egész osztás eredménye. Az ezt megvalósító feltételes kifejezéseket is láthatjuk az előbbi kódban.

Az a) és b) megfogalmazást azért tekintjük szinonimaként, mert ami az egész hányadost illeti, azonos eredményt kapunk. Ez a tény azonban nem triviális, mert a szemantikákból (a feltett kérdések tartalmából) nem következik közvetlenül.

Elvileg az általános iskola alsó tagozatában tanulta mindenki e két osztás fogalom megkülönböztetését és az a) esetet bennfoglalásnak a b) esetet egyenlő részekre osztásnak neveztük és jelölésben is megkülönböztettük: bennfoglalás esetén 105:3, egyenlő részekre osztás esetén 105/3 az írásmód, és a kettőt együtt osztásnak neveztük. Elvben. Ugyanis olvasható olyan tankönyv, ahol a bennfoglalást és egyenlő részekre osztást is ugyanúgy jelölik. Ennél lényegesebb, hogy nem, vagy nem kellően van elmagyarázva és megindokolva, hogy aztán később miért kezeljük a két műveletet egyetlen, osztás nevű műveletként, amit egyébként az egyenlő részekre osztás jelölésével (105/3) írunk. Talán ez a fogalmi és jelölési zavar és magyarázati hiányosság vezethet oda, hogy sok évvel később már sokan nem is emlékeznek pl. a bennfoglalás fogalomra; de az sem sokkal jobb, akiknél mindez úgy marad meg, hogy a bennfoglalás az egy „dedós” kifejezés az osztásra.

Ez a zavar némileg érthető, mert annak belátásához, hogy a két különböző kérdésre választ adó bennfoglalás és egyenlő részekre osztás azonos hányadost eredményez, a szorzás kommutatív tulajdonsága kell. Azonban a szorzás kommutativitása sem triviális. Az, hogy a 3-at 35-ször ismételten összeadva ugyanazt az eredményt kapjuk, mint amikor a 35-öt 3-szor ismételten adjuk össze, nem nyilvánvaló. Olyannyira, hogy ennek van formális matematikai bizonyítása (akit érdekel a neten megtalálja), de most elegendő a szemlélet alapján belátni. Ha 3 elemű oszlopokat egymás mellé teszünk 35-ször, akkor ebben a négyszögbe rendezett formában 105 elem lesz. Mivel az összelemszám nem változik, ugyanezt fordítva is tekinthetjük: 35 elemű sorokat egymás alatt 3-szor vesszük. Tehát 35*3 = 3*35.

Visszatérve az osztáshoz. Az a) esetben 105 = 35*3 a helyes felírás, hiszen 35-ször van 3-as csoport a 105-ben. A b) esetben fordítva, 105 = 3*35, ami azt jelenti, hogy úgy tudjuk a 105-t 3 egyenlő részre osztani, ha minden részben 35 elem van.

És mivel a szorzás kommutatív ezért írhatjuk, hogy 35*3 = 3*35. Ebből adódik, hogy az a) és b) azonos egész hányadost eredményez.

De, ahogy korábban említettük, ha az osztást nem lehet egész számszor elvégezni, akkor a két megfogalmazás nem egyenértékű.

A Python számtípusaira értelmezett operátorainak ismertetése a Python tudásépítés lépésről lépésre című e-könyv „Műveletek” fejezetének „Számtípusok műveletei” alfejezetén belül található. Operátorokkal vagy kulcsszavak használatával megvalósuló műveletek eredményével megegyező visszatérési értéket adó függvényekről és használatukról pedig a „Készétel fogyasztás – a szabványos könyvtár moduljainak használata” fejezet „Műveletek függvények formájában – operator modul” alfejezetben olvashatunk.

Érdekel a Python tudásépítés lépésről lépésre az alapoktól az első asztali alkalmazásig című e-könyv.