Feladat, amely szerint bizonyos bemenő (input) adatok alapján olyan kimenő (output) adatokat kell kiszámítani, melyek meghatározott kapcsolatban állnak a bemenő adatokkal.
Speciális esetek:
Példák:
Valamely számítási probléma megoldására szolgáló módszer véges leírása.
Valamely programozási nyelven leírt algoritmus.
A kiszámíthatóság elmélete azzal foglalkozik, hogy mely számítási problémákat lehet algoritmussal megoldani és melyeket nem. Ugyancsak a kiszámíthatóság témakörébe tartozik a különböző számítási modellek vizsgálata. Két számítási modellt ismertetünk röviden: az úgynevezett L programozási nyelvet és a Turing-gép modellt.
Input változók: X1, X2, ... (végtelen sok)
Segéd változók: Z1, Z2, ... (végtelen sok)
Output változó: Y
Minden változó értéke egy tetszőleges (bármilyen nagy) nemnegatív egész szám lehet.
Címkék: L1, L2, ... (végtelen sok)
L-nyelvű program: Az alábbi alakú utasítások véges sorozata (a programban az
utasításokat egymás alá írjuk és mindegyik utasítás előtt állhat egy címke is):
L-nyelvű program futtatása: Az X1, ..., Xn input változókba betöltjük az input adatokat, az összes többi változóba 0-t töltünk, majd elindítjuk a programot az első utasításnál. Ha a program megáll, akkor a számítás eredménye az Y változó értéke a megállás pillanatában.
Példák L-nyelvű programra
| X1 = X1 + 1 | |
| L1: | X1 = X1 - 1 |
| Y = Y + 1 | |
| if X1 != 0 goto L1 |
Makro utasítások
További példák:
Lásd Wikipédia.
A Church-Turing tézis szerint tetszőleges P számítási problémára az alábbi állítások ekvivalensek:
Léteznek algoritmikusan megoldhatatlan számítási problémák. Például az alábbi eldöntési probléma megoldhatatlan:
p és x.p kódú L nyelvű
program véges lépésben megáll-e az x inputon.
Tegyük fel ugyanis, hogy a megállási probléma algoritmikusan
megoldható. Akkor a Church-Turing tézis szerint megoldható
L-nyelvű programmal. Legyen H
egy olyan L-nyelvű program, ami megoldja
a megállási problémát. Tekintsük az alábbi P
programot:
| X2 = X1 | |
| H | |
| L: | if Y != 0 goto L |
Legyen p a fenti P program számkódja.
Kérdés: megáll-e a P program a p inputon?
Kövessük végig a P program működését úgy, hogy kezdetben
az X1 változóba a p számot töltjük.
Azt látjuk, hogy a H program X1 = p és
X2 = p kezdeti értékekkel fut le, ami azt jelenti, hogy
megválaszolja a Megáll-e a
kérdést.P program a p inputon?
Tegyük fel, hogy a P program megáll a p inputon.
Akkor a H program az 1 értéket tölti az Y
változóba, ami azt jelenti, hogy az L címkével megjelölt if
utasítás fog a végtelenségig ismétlődni, vagyis a P program nem áll meg
a p inputon - ellentmondás.
Ugyancsak ellentmondást kapunk, ha feltesszük, hogy a P program
nem áll meg a p inputon, hiszen ekkor a H program
a 0 értéket tölti az Y változóba, ezért az L
címkével megjelölt if utasítás feltétele nem teljesül,
tehát a P program megáll a p inputon.
Ez az ellentmondásos helyzet csak abból adódhat, hogy a kezdeti feltevésünk, miszerint a megállási probléma megoldható L-nyelvű programmal, hamis.
Determinisztikus tár- és időigény fogalma.
Tetszőleges P számítási problémára az alábbi állítások ekvivalensek:
Példák: palindrómák felismerése, prímtesztelés, 3-színezhetőség
A P, NP és co-NP bonyolultsági osztályok.
NP-teljes problémák.
A nyilvános kulcsú titkosítás alapelve.
A leginkább elterjedt nyilvános kulcsú titkosítási módszer, melyet 1978-ban talált fel három matematikus: Ron Rivest, Adi Shamir és Leonard Adleman.
Az algoritmus leírása:
RSA eljárás - Wikipédia
RSA leírás (angol) és JAVA nyelvű megvalósítás
Felhasználási lehetőségek:
Viszonylag nagy méretű NP-teljes feladatok gyors megoldása.
Leonard Adleman: Hamilton-kör keresés (egyszerűsített utazó ügynök probléma) megoldása.
DNA computing - Wikipedia
NP-teljes problémák determinisztikus polinom időben történő megoldását ígéri,
de a gyakorlati megvalósítás még nagyon kezdeti stádiumban van.
Quantum computer - Wikipedia
A programozási feladat pontos meghatározása.
A megrendelő és a programozó részletesen megbeszéli és általában írásban
(szerződésben) is rögzíti, hogy mit kell tudnia a készítendő programnak.
Megoldható-e a feladat? Ha igen, milyen eszközökkel?
Az adatszerkezetek és algoritmusok tervezése.
Algoritmus-leíró eszközök:
A program megírása a választott programozási nyelven.
Fontos, hogy olvasható, könnyen értelmezhető legyen a program. Ezt segíti elő:
Tesztelés: A program minden inputon a specifikáció szerinti outputot adja-e?
Hibakeresés: Ha teszteléskor hibát találunk, akkor azt a program melyik pontján kell javítani?
Adott input esetén a hiba helyének felderítésére szolgáló hatékony módszer a
nyomkövetés, melynek során lépésről-lépésre hajtjuk végre a programot
és közben folyamatosan figyeljük, ellenőrizzük a változók értékét.
Ha hibát találunk, akkor a program hibás részét javítjuk (Kódolás). A tesztelést, hibakeresést és javítást addig folytatjuk, amíg már nem találunk több hibát.
Felhasználói dokumentáció: A program használói számára írja le a program kezelését, működését.
Fejlesztői dokumentáció: Ha később módosítani vagy javítani kell a programot, akkor segíti a programozó munkáját.
A felhasználók által talált hibák javítása.
Ha új igény merül fel, akkor újra végig kell járni a teljes életciklust az első lépéstől kezdve.
Verziószámok használata.
Martin D. Davis, Ron Sigal, Elaine J. Weyuker
Computability, complexity, and languages : fundamentals of theoretical computer science - 2. ed. - Boston etc. : Academic P., 1994.
Michael R. Garey, David S. Johnson
Computers and intractability : a guide to the theory of NP-completeness - 22. print. - New York, N. Y. : Freeman, 2000.
Christos H. Papadimitriou
Számítási bonyolultság; Bp., Novadat, 1999. (1-3. és 9. fejezet)
List of important publications in theoretical computer science
Angster Erzsébet
Objektumorientált tervezés és programozás; Bp., Kör Bt., 2004.