Datorprogram, algoritmer och Turing-maskiner

Relevanta dokument
Lite om räkning med rationella uttryck, 23/10

Tal och polynom. Johan Wild

D. x 2 + y 2 ; E. Stockholm ligger i Sverige; F. Månen är en gul ost; G. 3 2 = 6; H. x 2 + y 2 = r 2.

Bakgrund. Bakgrund. Bakgrund. Håkan Jonsson Institutionen för systemteknik Luleå tekniska universitet Luleå, Sverige

Turingmaskiner och oavgörbarhet. Turingmaskinen. Den maximalt förenklade modell för beräkning vi kommer använda är turingmaskinen.

COMPUTABILITY BERÄKNINGSBARHET. Källa: Goldschlager, Lister: Computer Science A Modern Introduction 2. upplaga 1988, Prentice Hall

1 Josefs bil har gått kilometer. Hur långt har den gått när han har kört (3) tio kilometer till? km

Föreläsning 9: Turingmaskiner och oavgörbarhet. Turingmaskinen. Den maximalt förenklade modell för beräkning vi kommer använda är turingmaskinen.

DD1350 Logik för dataloger. Fö 7 Predikatlogikens semantik

Introduktion till algoritmer - Lektion 1 Matematikgymnasiet, Läsåret Lektion 1

Algoritmer i Treviso-aritmetiken.

Matematik EXTRAUPPGIFTER FÖR SKOLÅR 7-9

Algebra I, 1MA004. Lektionsplanering

Lösning till tentamensskrivning i Diskret Matematik för CINTE, CL2 och Media 1, SF1610 och 5B1118, onsdagen den 17 augusti 2011, kl

4 Fler deriveringsregler

(A B) C = A C B C och (A B) C = A C B C. Bevis: (A B) C = A C B C : (A B) C = A C B C : B C (A B) C A C B C

1, 2, 3, 4, 5, 6,...

Resträkning och ekvationer

Algebra, exponentialekvationer och logaritmer

Sidor i boken , , 3, 5, 7, 11,13,17 19, 23. Ett andragradspolynom Ett tiogradspolynom Ett tredjegradspolynom

Föreläsning 5. Deduktion

Tal i bråkform. Kapitlet behandlar. Att förstå tal

Hela tal LCB 1999/2000

TATM79: Föreläsning 1 Notation, ekvationer, polynom och olikheter

Låt n vara ett heltal som är 2 eller större. Om a och b är två heltal så säger vi att. a b (mod n)

Likhetstecknets innebörd

Block 2 Algebra och Diskret Matematik A. Följder, strängar och tal. Referenser. Inledning. 1. Följder

Gränsvärden. Joakim Östlund Patrik Lindegrén Pontus Nyrén 4 december 2003

Övningshäfte 2: Induktion och rekursion

Sidor i boken f(x) = a x 2 +b x+c

29 Det enda heltalet n som satisfierar båda dessa villkor är n = 55. För detta värde på n får vi x = 5, y = 5.

Bisektionsalgoritmen. Kapitel Kvadratroten ur 2

Matematik klass 4. Vårterminen FACIT. Namn:

Likhetstecknets innebörd

MATEMATIKENS SPRÅK. Avsnitt 1

Några satser ur talteorin

Alla datorprogram har en sak gemensam; alla processerar indata för att producera något slags resultat, utdata.

TATM79: Föreläsning 1 Notation, ekvationer, polynom och summor

Potenser och logaritmer på en tallinje

Övning log, algebra, potenser med mera

Prov 1 2. Ellips 12 Numeriska och algebraiska metoder lösningar till övningsproven uppdaterad a) i) Nollställen för polynomet 2x 2 3x 1:

Talteori (OBS en del frågor gäller diofantiska ekvationer och de tas inte upp från och med hösten 2012)

Matematik klass 4. Vårterminen. Namn: Anneli Weiland Matematik åk 4 VT 1

1 Julias bil har har gått kilometer. Hur långt har den gått när den har (3) körts tio kilometer till? km

Objektorienterad modellering och diskreta strukturer. 13. Problem. Sven Gestegård Robertz. Datavetenskap, LTH

Programmering och begrepp

Arbeta vidare med aritmetik 2018

Explorativ övning 4 ÄNDLIGT OCH OÄNDLIGT. Övning A

1 Julias bil har gått km. Hur långt har den gått när den har körts tio (3) kilometer till? Rita en ring runt det största bråket.

MÖNSTER OCH TALFÖLJDER

Kontinuitet och gränsvärden

3-3 Skriftliga räknemetoder

PRIMTALEN, MULTIPLIKATION OCH DIOFANTISKA EKVATIONER

Material till kursen SF1679, Diskret matematik: Lite om kedjebråk. 0. Inledning

Talsystem Teori. Vad är talsystem? Av Johan Johansson

Repetitionsuppgifter inför Matematik 1. Matematiska institutionen Linköpings universitet 2013

Introduktion till logik

Rekursionsformler. Komplexa tal (repetition) Uppsala Universitet Matematiska institutionen Isac Hedén isac

Lösningar till Algebra och kombinatorik

x 23 + y 160 = 1, 2 23 = ,

Södervångskolans mål i matematik

Programmering och begrepp

LMA033/LMA515. Fredrik Lindgren. 4 september 2013

K2 Något om modeller, kompakthetssatsen

Inledande programmering med C# (1DV402) Introduktion till programmering

Kapitel 2: De hela talen

A B A B A B S S S S S F F S F S F S F F F F

Lokal studieplan Matematik 3 8 = 24. Centrum för tvåspråkighet Förberedelseklass

Imperativ programmering

y y 1 = k(x x 1 ) f(x) = 3 x

DE FYRA RÄKNESÄTTEN (SID. 11) MA1C: AVRUNDNING

Skolmatematiktenta 1 LPGG06 Kreativ Matematik Delkurs 1 4 december 2015 kl

DD1350 Logik för dataloger

inte följa någon enkel eller fiffig princip, vad man nu skulle mena med det. All right, men

Introduktion till programmering

a = a a a a a a ± ± ± ±500

Polynomekvationer (Algebraiska ekvationer)

TALTEORI FÖR ALLA 1 Juliusz Brzezinski

Kursplan för Matematik

1 Aylas bil har gått kilometer. Hur långt har den (2) gått när hon har kört en kilometer till?

Denna uppdelning är ovanlig i Sverige De hela talen (Både positiva och negativa) Irrationella tal (tal som ej går att skriva som bråk)

Manipulationer av algebraiska uttryck

PASS 2. POTENSRÄKNING. 2.1 Definition av en potens

Tema: Pythagoras sats. Linnéa Utterström & Malin Öberg

Kompletterande lösningsförslag och ledningar, Matematik 3000 kurs A, kapitel 4. b) = 3 1 = 2

Ekvationer och system av ekvationer

Uppsala Universitet Matematiska Institutionen Thomas Erlandsson

KW ht-17. Övningsuppgifter

Repetition av matematik inför kurs i statistik 1-10 p.

MULTIPLIKATION AV MATRISER, BASER I RUMMET SAMT FÖRSTA MÖTET MED MATRISINVERSER = = =

Läsanvisning till Discrete matematics av Norman Biggs - 5B1118 Diskret matematik

Studieplan och bedömningsgrunder i Matematik för åk 7 Moment Bedömningsgrunder för uppnåendemålen Begreppsbildning Tal och räkning

Matematik klass 4. Höstterminen. Facit. Namn:

Sammanfattningar Matematikboken X

Högstadiets matematiktävling 2016/17 Finaltävling 21 januari 2017 Lösningsförslag

INDUKTION OCH DEDUKTION

Lösningar till utvalda uppgifter i kapitel 5

Lite Kommentarer om Gränsvärden

Kompletteringsmaterial. K2 Något om modeller, kompakthetssatsen

Induktion, mängder och bevis för Introduktionskursen på I

Transkript:

Datorprogram, algoritmer och Turing-maskiner Uppsala universitet Turing-året 2012

Inledning Det är bekvämt om en maskin, till exempel en dator, kan utföra en uppgift, särskilt om den kan göra det avsevärt snabbare än en människa. Detta leder till frågan vad maskiner kan göra.

Inledning Det är bekvämt om en maskin, till exempel en dator, kan utföra en uppgift, särskilt om den kan göra det avsevärt snabbare än en människa. Detta leder till frågan vad maskiner kan göra. Det finns starka skäl att tro att maskiner inte kan lösa alla typer av problem, vilket kommer att förklaras.

Inledning Det är bekvämt om en maskin, till exempel en dator, kan utföra en uppgift, särskilt om den kan göra det avsevärt snabbare än en människa. Detta leder till frågan vad maskiner kan göra. Det finns starka skäl att tro att maskiner inte kan lösa alla typer av problem, vilket kommer att förklaras. Men hur kan man undersöka sådana saker? Frågan handlar inte om vad en specifik maskin, till exempel datorn på ditt bord, kan göra. Frågan gäller vad maskiner överhuvudtaget kan göra.

Inledning Det är bekvämt om en maskin, till exempel en dator, kan utföra en uppgift, särskilt om den kan göra det avsevärt snabbare än en människa. Detta leder till frågan vad maskiner kan göra. Det finns starka skäl att tro att maskiner inte kan lösa alla typer av problem, vilket kommer att förklaras. Men hur kan man undersöka sådana saker? Frågan handlar inte om vad en specifik maskin, till exempel datorn på ditt bord, kan göra. Frågan gäller vad maskiner överhuvudtaget kan göra. För att undersöka frågan så behöver man betrakta begrepp som instruktioner, algoritmer, datorprogram, programmeringsspråk och hur maskiner, i princip, fungerar.

Vår värld vimmlar av instruktioner Du har förmodligen lärt dig hur man gör för att hitta ett ord, exempelvis koncession, i en ordlista, där orden antas vara organiserade i alfabetisk ordning. Troligtvis har du lärt dig att följa ett antal instruktioner som leder dig att göra på följande vis: Sök upp orden som börjar på k. Sedan söker du upp orden, bland dessa, som börjar med ko. Bland dessa söker du upp orden som börjar med kon. Och så vidare. Till sist hittar du ordet koncession, om det finns med i ordlistan. Dessa instruktioner kan sammanfattas med en enda: Instruktion: När du har funnit orden vars första n bokstäver (n = 0, 1, 2,...) är detsamma som för det givna uppslagsordet, så sök bland dessa ord de ord vars n + 1 första bokstäver är detsamma som för det givna uppslagsordet; tills du hittar uppslagsordet.

Vår värld vimmlar av instruktioner Uppgift. (a) Ge exempel på några instruktioner som du har fått i ditt liv. (b) Försök att komma på en eller flera instruktioner som hör ihop och som alltid leder till rätt svar på en viss sorts fråga, om man utför instruktionerna på rätt sätt. Möjligt svar till (b)

Vår värld vimmlar av instruktioner Uppgift. (a) Ge exempel på några instruktioner som du har fått i ditt liv. (b) Försök att komma på en eller flera instruktioner som hör ihop och som alltid leder till rätt svar på en viss sorts fråga, om man utför instruktionerna på rätt sätt. Möjligt svar till (b) De vanliga instruktionerna för hur man söker efter ord i en ordlista ger alltid svar på frågan om ett givet ord finns med i en given ordlista. Lite mer matematiskt så skulle frågan kunna uttryckas så här: Finns ordet w med i ordlistan L? där w betecknar ett godtyckligt ord och L en godtycklig ordlista.

Vår värld vimmlar av instruktioner Ett annat exempel är följande. I skolan har du lärt dig hur man multiplicerar två heltal (och förmodligen även tal med decimaler). Du ställer upp talen på ett visst sätt och bearbetar dem sedan, steg för steg, enligt några givna instruktioner. Uträkningen tar alltid slut och ger rätt svar (produkten) om varje steg har utförts på rätt sätt. Om två stora tal multipliceras så krävs många steg för att beräkna deras produkt, men i princip så kan uträkningen alltid göras enligt de instruktioner som du har lärt dig i skolan.

Algoritm: en samling instruktioner som hör ihop Som nämndes i föregående exempel så kan man alltid, i princip, beräkna produkten av två tal genom att följa några bestämda instruktioner i så många steg som behövs tills produkten till sist, om man har tålamod och tid, är uträknad. En (ändlig) mängd av instruktioner som hör ihop kallas med matematiskt och datavetenskapligt språk för algoritm. I skolan har du lärt dig algoritmer för att addera, subtrahera, multiplicera och dividera tal med varandra. Du har också lärt dig en algoritm för att hitta ord i ordlistor, och säkert ett flertal andra algoritmer. Även miniräknare och datorer använder algoritmer för att att addera, subtrahera, multiplicera och dividera tal, och för alla andra funktioner som miniräknaren och datorn har. Faktum är att allt som miniräknare och datorer gör, görs enligt algoritmer i deras minne.

Vad är skillnaden mellan algoritm och datorprogram? Ett datorprogram är en algoritm som är skrivet i ett visst programeringsspråk. Men en algoritm behöver inte vara ett datorprogram. Exempelvis beskrevs tidigare, något översiktligt visserligen, en algoritm för att se efter om ett givet ord finns med i en given ordlista. Men algoritmen var skriven på svenska, vilket inte är ett programeringsspråk, så algoritmen är inte ett datorprogram. Om svenska skulle bli ett programringsspråk så skulle den givna algoritmen för att se om ett ord är med i en ordlista bli ett datorprogram. Man kan också säga att ett datorprogram är en algoritm som är skrivet på ett språk som någon dator förstår. Vad som är ett datorprogram beror alltså på vilka språk datorer förstår, och detta kan variera med tidens gång.

Därför är algoritmer det intressanta I problemlösningssammanhang så är man som regel intresserad av hur man utför en viss uppgift, eller hur man löser ett visst problem och inte av språket som instruktionerna är beskrivna med. Om en algoritm beskrivs med ett visst språk, till exempel svenska eller C ++, så kan den vanligen översättas till ett annat språk, till exempel engelska eller Ada. Av dessa skäl så är ofta begreppet algoritm viktigare är begreppet datorprogram.

Terminering: kommer jag någonsin få ett svar? En sak som skiljer divisionsalgoritmen från algoritmerna för att addera, subtrahera och multiplicera är följande. När man använder divisionsalgoritmen för att beräkna a delat med b så kan det hända att divisionen inte går jämnt ut, hur många steg man än utför. Om man, exempelvis, dividerar 4 med 3 så får man kvoten 1.3333333... där decimalutvecklingen aldrig tar slut, eftersom det är omöjligt att skriva 4/3 på decimalform med ändlig decimalutveckling. Så om man använder divisionsalgoritmen för att dividera 4 med 3 så säger algoritmen att man skall fortsätta ett steg till, och ett steg till, och så vidare i all oändlighet. Man säger att algoritmen inte terminerar i detta fall. Om algoritmen ger ett svar efter ändligt många steg så säger man att den terminerar.

Terminering: kommer jag någonsin få ett svar? Man får lätt en divisionsalgoritm som alltid terminerar genom att bara bestämma sig för hur många decimalers nogrannhet man vill ha i svaret, som då inte nödvändigtvis är exakt, utan bara ett närmevärde/uppskattning. Om vi till exempel är nöjda med tre decimalers noggranhet så lägger vi till följande instruktion till divisionsalgoritmen: avsluta beräkningen då tre decimalers noggranhet har uppnåtts. Miniräknare, vars algoritmer alltid terminerar, räknar med närmevärden/uppskattningar, så svaren är oftast inte exakta utan bara närmevärden/uppskattningar av det som ska beräknas.

Kan algoritmer lösa alla problem? Finns det någon superalgoritm som löser varje matematiskt problem? Denna fråga är snarlik den fråga, kallad Entscheidungsproblem (på svenska avgörbarhetsproblem ), som den kände matematikern David Hilbert ställde i början av 1900-talet. En lite blygsammare fråga är om det för varje typ av matematiskt problem P finns en algoritm A P som löser varje problem av typen P. Exempel. Låt P(x, y) vara problemet beräkna produkten av x och y. Då löses problemet P, att beräkna produkten av två tal, av den algoritm som du har fått lära dig i skolan.

Kan algoritmer lösa alla problem? För att bevisa att det finns en algoritm som löser en viss typ av problem P så räcker det att skriva ner en algoritm A P som gör detta. Att bevisa att algoritmen faktiskt gör det som den skall kan dock ibland vara mycket invecklat och kräva avancerade kunskaper i matematik. Exempelvis konstruerade år 2002 Manindra Agrawal, Neeraj Kayal och Nitin Saxena en algoritm som, mycket snabbare än tidigare kända algoritmer, avgör om ett godtyckligt positivt heltal är ett primtal eller inte. För att förstå att deras algoritm faktiskt gör det som den ska, och snabbare än andra algoritmer för samma ändamål, så krävs djupa kunskaper den gren av matematiken som kallas talteori.

Kan algoritmer lösa alla problem? Exempel 1 Men kan varje typ av problem lösas av någon algoritm? Svaret är nej, och här följer en beskrivning av en typ av problem som ingen algoritm kan lösa. Vi betraktar tabeller med ord (som inte behöver betyda någonting) i två kolumner som består av endast bokstäverna a och/eller b: Exempel 1 abb b 2 b ba 3 a ab 4 b bab

Kan algoritmer lösa alla problem? Exempel 1 Om vi väljer en följd av rader, där samma rad får väljas flera gånger, så kan vi bilda ett sammansatt ord av orden i vänstra kolumnen av de valda raderna. Om vi väljer följden av rader 2,1,1,3,4 och vi tar ordet ur vänstra kolumnen från motsvarande rad så får vi b, abb, abb, a, b, vilket ihopdraget och utan kommatecken ger babbabbab. Om vi i stället väljer ordet i högerkolumnen för samma följd 2,1,1,3,4 så får vi ba, b, b, ab, bab, vilket ihopdraget och utan kommatecken ger babbabbab. Det blev samma sammansatta ord, babbabbab, i båda fallen! Så behöver det inte bli för alla följder av rader. Om man i stället väljer följden 2,1,1,3 så får man babbabba om man väljer orden i vänsterkolumnen från dessa rader, och man får babbab om man väljer orden i högerkolumnen från samma rader.

Kan algoritmer lösa alla problem? Exempel 1 För tabellen 1 a ba 2 b bb så finns ingen följd av rader så att om man bara väljer ord i vänsterkolumnen från dessa rader så blir det samma sammansatta ord som när man bara väljer ord i högerkolumnen från samma rader (i samma ordning). Försök att förklara varför. Förklaring

Kan algoritmer lösa alla problem? Exempel 1 För tabellen 1 a ba 2 b bb så finns ingen följd av rader så att om man bara väljer ord i vänsterkolumnen från dessa rader så blir det samma sammansatta ord som när man bara väljer ord i högerkolumnen från samma rader (i samma ordning). Försök att förklara varför. Förklaring För varje följd av rader så blir det sammansatta ordet som fås från motsvarande högerkolumner dubbelt så långt som det sammansatta ordet som fås från motsvarande vänsterkolumner.

Kan algoritmer lösa alla problem? Exempel 1 För tabellen 1 aab a 2 ab abb 3 ab bab 4 ba aab finns en följd av rader så att man får samma sammansatta ord oavsett om man väljer orden från vänsterkolumnen eller om man väljer orden från högerkolumnen. Det är dock inte så lätt att hitta ett sådan följd eftersom den behöver vara ganska lång, med mer än 50 radval. Finns det en algoritm som givet vilken tabell som helst av detta slag, med hur många rader som helst, avgör (dvs. ger rätt svar på frågan) om det går att välja en följd av rader så att man får samma sammansatta ord oavsett om man bara väljer orden från vänsterkolumnen eller bara orden från högerkolumnen, i den ordning som följden av rader anger. Svaret är nej.

Kan algoritmer lösa alla problem? Exempel 2 Här följer ett till exempel på ett problem som ingen algoritm kan lösa. Vi kallar en funktion med variablerna (det som motsvarar indata till funktionen) x 1,..., x n för ett polynom med heltalskoefficienter om den endast använder addition, subtraktion och/eller multiplikation av variablerna och vissa givna heltalskonstanter då den räknar ut sitt värde. Exempel på polynom med heltalskoefficienter är 5xy 2x 2, 2 + 4x1 2x 2x3 5 17x 1x3 2 och ( x1 7 3x 1 2x 2 5x 3 3 ) 4 + 5x2 x3 2. Det första polynomet har 2 variabler, x och y, medan de två andra polynomen har 3 variabler, x 1, x 2 och x 3.

Kan algoritmer lösa alla problem? Exempel 2 Problem: Givet ett polynom med heltalskoefficienter och 11 variabler, betecknat f (x 1, x 2,..., x 11 ), finns det heltal n 1, n 2,..., n 11 sådana att f (n 1, n 2,..., n 11 ) = 0? Vi ställer oss nu frågan om det finns någon algoritm som, om den får vilket polynom som helst med heltalskoefficienter och 11 variabler avgör ovanstående problem (dvs. ger rätt svar på frågan)? Svaret är nej.

Kan algoritmer lösa alla problem? Exempel 2 Det följer att svaret fortfarande är nej om man släpper begränsningen att polynomen bara får ha 11 variabler, och alltså tillåter vilket antal variabler som helst. Problemet i denna allmänna form kallas för Hilberts tionde problem, efter matematikern David Hilbert som vid den internationella matematikerkonferensen år 1900 gav en lista med 23 matematiska problem som har blivit berömda. Tre av dessa är fortfarande olösta. Hilberts tionde problem fick sin slutgiltiga lösning genom att Yuri Matijasevic bevisade att varje beräkningsbart uppräknelig mängd av tal är diofantisk (dvs. består av lösningar till sådana ekvationer som ovan), men vi går inte in närmare på vad detta betyder här.

Algoritmiska Hur bevisar man att en viss typ av problem inte kan lösas av någon algoritm? Algoritmer kan ju uttryckas på olika språk, som svenska, engelska, indiska, C ++, Ada, Fortran, och så vidare. Men det nämndes tidigare att om en algoritm kan uttryckas i ett språk så kan den ofta uttryckas i andra språk också. Tyvärr är detta bara sant ofta, men inte alltid. Vi skulle kanske behöva ett universalspråk för algoritmer. Detta algoritmiska universalspråk borde i så fall ha egenskapen att varje algoritm kan beskrivas i detta språk. Med andra ord, om en algoritm kan skrivas med något språk överhuvudtaget så skall den kunna översättas till universalspråket, som vi kan kalla algoritmiska. Men finns algoritmiska? Och hur ser det i så fall ut?

Algoritmiska Under 1920- och 1930-talen konstruerades flera olika språk, av olika matematiker, som var tänkta att beskriva algoritmer och samtidigt vara lämpliga för att förstå bättre vad algoritmer kan, och inte kan, göra. Språken hade namn som logiska kombinatorer, lambda kalkyl, a-maskiner, och rekursiva funktioner. Lite udda namn kanske, och om du såg språken så skulle du förmodligen bli förvånad. Men kom ihåg att dessa språk var avsedda att beskriva algoritmer, inte för att användas i vardaglig kommunikation mellan människor. På 1930-talet så blev en del matematiker så självsäkra på sin sak att de föreslog att deras språk faktiskt kunde beskriva alla algoritmer. Mot slutet av årtiondet så lyckades man bevisa att de nämnda språken var ekvivalenta, med vilket man menar att om ett av dem kan beskriva alla algoritmer, så gäller detsamma för alla de andra språken (av de nämnda). Men var dessa språk universalspråk för algoritmer?

Vad är karakteristiskt för en algoritm? Innan vi går vidare med den frågan så försöker vi förstå vad som gör att något är en algoritm. Med andra ord så försöker vi karakterisera en algoritm, så gott vi kan. Vi har redan tidigare sagt att en algoritm är en ändlig samling av instruktioner. Det har varit underförstått att varje instruktion är ändlig (beskriven med ändligt många tecken/symboler) för varje instruktion skall kunna läsas på ändlig tid. För att kunna använda en algoritm så behövs en miljö, inom vilken algoritmens instruktioner skall utföras. Med datavetenskapligt och matematiskt språkbruk så kallas miljön för algoritmens semantik. Därför tar vi också hänsyn till en algoritms miljö när vi försöker karakterisera en algoritm.

Vad är karakteristiskt för en algoritm? Eftersom varje instruktion är ändlig så kan den bara påverka och påverkas av en ändlig del av den miljö inom vilken algoritmen arbetar. Därför finns, för varje algoritm, en begränsning av hur många symboler som den, i sitt arbete, kan skriva och/eller radera när en instruktion utförs. Det följer att algoritmen efter att ha utfört ett antal instruktioner, hur många som helst (men ändligt antal), så kommer bara en ändlig del av dess miljö att ha påverkats. Som nog har framgått så kan miljön användas som arbetsminne (där algoritmen skriver och raderar) under arbetets gång. En algoritm borde kunna ta tillvara på tillgänglig kunskap; sådant som står i böcker eller finns lagrat i datorer till exempel. Vi tänker oss att även denna är ändlig. Denna kunskap kan finnas lagrad i algoritmens miljö, men eftersom den tillgängliga kunskapen är ändlig så kan den också skrivas in i algoritmens instruktioner; så att all kunskap som behövs för dess arbete redan är inbyggd i algoritmen. Ett algoritmiskt universalspråk (med tillhörande miljö) bör alltså ha dessa egenskaper och dessutom kunna beskriva varje ändlig samling instruktioner med ovan nämnda egenskaper.

Alan Turings förslag till algoritmiskt universalspråk Matematikern och logikern Alan Turing (1912-1954) tänkte förmodligen i banor som inte var så olika de ovan beskrivna. I princip skulle en människa kunna utföra en algoritms arbete (givet tillräckligt mycket tid och plats för arbetet) och han resonerade att den mänskliga hjärnan har ett ändligt minne och ändligt många tillstånd. Den yttre miljön (bibliotek, datorer etc.) innehåller också en ändlig mängd information, och människan är begränsad på så sätt att hon bara kan bearbeta ändligt mycket information i varje arbetsmoment. Detsamma gäller för alla maskiner. Turing betonade såväl algoritmers mekaniska natur (att arbeta steg för steg utifrån givna instruktioner) som möjligheten att maskiner skulle kunna utföra alla arbeten som kan beskrivas av algoritmer. Kanske var det sådana tankegångar som gjorde att Turings algoritmspråk med tillhörande arbetsmiljö, a-maskinen, senare kallat Turing-maskinen, fick sådan form att de påminner mycket om en maskin, särskilt datamaskin med instruktioner (dvs. program).

Hur var det då med ett universalspråk? Men efter allt detta prat, finns det ett universalspråk för algoritmer? Svaret är kanske en besvikelse. Man vet inte. Och man kan inte ge ett precist svar på frågan av det skälet att begreppet algoritm inte är mer precist än vad som har förklarats här. Sedan 1930-talet har många nya språk för att beskriva algoritmer uppfunnits, men ingen av de nya språken kan beskriva fler algoritmer än Turing-maskiner. Och varje algoritm som kan beskrivas med något språk kan också beskrivas med Turing-maskiner (och med lambda-kalkyl, logiska kombinatorer och rekursiva funktioner).

Church-Turings tes Sedan 1930-talet har en så gott som allmän acceptans vuxit fram bland matematiker och datavetare om att följande påstående stämmer: Church-Turings tes: Varje algoritm kan beskrivas av en Turing-maskin. Så när man säger att det inte finns någon algoritm som kan lösa en viss typ av problem, så menar man att det inte finns någon Turing-maskin som kan göra det. Det är också vad som har menats här då det har sagts att det inte finns någon algoritm som löser problemet. Church-Turings tes är ett påstående som inte kan bevisas eftersom begreppet algoritm inte är precist. Men eftersom begreppet Turing-maskin är precist så kan man bevisa att det inte finns någon Turing-maskin som löser en viss typ av problem.

Turing-maskiner Som nämndes tidigare så finns flera (många faktiskt) språk för algoritmer som är lika starka som Turing-maskiner, i den meningen att varje algoritm som kan beskrivas med en Turing-maskin också kan översättas till det andra språket, och omvänt. Turing-maskinen, förkortat TM, har dock blivit det mest använda algoritm-språket i sammanhang då man försöker bevisa saker om algoritmer och om en mängd olika problem, från vardagen och från olika vetenskaper. Kanske beror det på att en TM, och dess arbetssätt, är relativt lätt att förstå. Man skall ha i tankarna att begreppet TM har skapats för att kunna bevisa saker om algoritmer i allmänhet (om vi tror på Church-Turings tes) och inte för programering i praktiska sammanhang. Program för Turing-maskiner följer väldigt enkla regler för att det skall vara lätt att hantera Turing-maskinerna när man bevisar saker om dem. Men å andra sidan innebär det att TM-program, även för enkla uppgifter, lätt blir väldigt stora. Att programera Turing-maskiner kan liknas med att programera fysiska datorer på bit-nivå.

Noll-summe-problemet För den som vill se mer exempel på frågor som handlar om existens eller icke-existens av vissa typer av algoritmer, så följer här ett till. Givet en följd av olika heltal, exempelvis 4, 1, 3, 7, 2, 10, så frågar vi oss om det är möjligt att välja en kombination av dessa tal så att summan av dem blir 0? Om följden är 4, 1, 3, 7, 2, 10, så kan vi välja talen 4, 1, 3, 2 och vi ser att 4 + 1 + ( 3) + ( 2) = 0, så för följden 4, 1, 3, 7, 2, 10 så går det att välja en kombination av dessa tal sådan att summan av dem blir 0. Men om följden är 8, 4, 3, 9 så finner man, efter att ha provat alla kombinationer, att det inte finns någon kombination av talen vars summa är 0. Givet vilken följd av (hur många) heltal n 1, n 2,..., n k som helst så kan man förstås testa varje kombination av dessa tal som helst och se om summan av dem blir 0. Denna tanke går att formulera som en algoritm, så det finns alltså en algoritm som avgör, givet vilken ändlig följd av heltal som helst, om det finns en kombination av dessa tal sådan att summan av dem blir 0.

Noll-summe-problemet Det finns dock 2 n kombinationer av tal från en följd av n olika tal (varför?). Så om man ska testa, för varje kombination, om summan av den blir 0, så kan det hända att man måste testa 2 n kombinationer innan man hittar någon vars summa blir 0, eller kan dra slutsatsen att inge sådan finns. Varje test om summan blir 0 innebär att man utför minst en instruktion av algoritmen. Detta medför att om en sådan algoritm får en följd av n heltal som indata så kan den behöva utföra minst 2 n instruktioner innan den är klar. Man säger att en algoritm terminerar efter n steg, givet ett visst indata, om den terminerar (dvs. stannar) efter att ha utfört instruktioner n gånger. För någon konstant C > 0 gäller att den ovan (översiktligt) beskrivna algoritmen för att lösa noll-summe-problemet terminerar efter högst C 2 n steg on indata består av högst n heltal. Det kan dock behövas 2 n steg innan den terminerar för vissa indata bestående av n tal. Eftersom 2 n är en exponential-funktion så säger man att algoritmen har exponentiell tillväxt.

Noll-summe-problemet Man säger att en algoritm har polynomiell tillväxt om det finns ett positivt heltal k så att algoritmen, givet indata bestående av högst n tecken/symboler, terminerar efter högst n k steg. Nu ställer vi oss frågan: Finns det någon algoritm som löser noll-summe-problemet och har polynomiell tillväxt? Om man fixerar k så gäller för alla tillräckligt stora n att 2 n är mycket större än n k. Därför kan frågan ses som en precisare version än följande fråga: Finns det någon algoritm som löser noll-summe-problemet och är betydligt snabbare än den beskrivna algoritmen (som testar alla kombinationer)?

Noll-summe-problemet Om vi tror på Church-Turings tes så är frågan väsentligen densamma som frågan om det finns en Turing-maskin som löser noll-summe-problemet och har polynomiell tillväxt. Denna fråga kan förväntas ha ett precist matematiskt svar (eftersom begreppet Turing-maskin är precist). Men trots att en annan variant av frågan ställdes redan i början av 1970-talet så har ingen hittills kunnat svara på den. Om någon skulle besvara frågan skulle det medföra att antingen så (1) skulle många olika (kända) problem ha algoritmer med polynomiell tillväxt, eller så (2) skulle många olika (kända) problem inte ha algoritmer med polynomiell tillväxt. Noll-summe-problemet hör till en samling problem som kallas för NP-fullständiga. Alla NP-fullständiga problem delar egenskapen att om någon av dem kan lösas med en algoritm som har polynomiell tillväxt så gäller detsamma för många andra problem.

Noll-summe-problemet Om någon kom på en algoritm med polynomiell tillväxt för noll-summe-problemet, så skulle det till exempel finnas en algoritm med polynomiell tillväxt som avgör om ett heltal a delar ett annat heltal b (dvs. om det finns ett heltal k sådant att b = ka) och detta skulle innebära att den nuförtiden mest använda algoritmen för att koda och avkoda meddelanden (som används om man handlar nå internet eller använder en internetbank), den s.k. RSA-algoritmen, skulle kunna forceras (dvs. avkodas) relativt snabbt, åtminstone om exponenten k i polynomet n k (som begränsar tillväxten) inte är väldig stor. Den mest utbredda uppfattningen, dvs. den bildade gissningen, bland datavetare och matematiker i dagsläget är dock att det inte finns någon algoritm med polynomiell tillväxt för noll-summe-problemet, så om denna uppfattning är korrekt så är bankkunder och andra relativt säkra. (Algoritm-teori kan dock inte garantera att inte andra katastrofer, inom området ekonomi och finansväsende, drabbar bankkunder och andra medborgare.)