Arbetsblad 3 I det tredje arbetsbladet tar vi upp rekursiva definitioner, listor och primtal. Precis som det tidigare arbetsbladet är detta en mindre modifiering av en text skriven av Rikard Bögvad för kursen Matematik I (30 hp). En skillnad mot tidigare arbetsblad är att uppgifterna är litet mer omfattande. För att underlätta prioritering av uppgifter har jag angivit svårighetsnivå i inledningen av varje uppgift. Svårighetsnivå 1 är den enklaste typen av uppgift, svårighetsnivå 3 är den svåraste. 1. Att hitta de största talen i en lista. Mycket av det material som Mathematica producerar är listor, alltså ordnade mängder. Vi har sett att en matris t ex är en lista av sina rader, som i sin tur är listor av tal. Lösningarna till en ekvation är en lista av transformationsregler. Det finns många kommandon för att göra allt man kan vilja göra med listor. Här är några exempel. En lista kan se ut så här: {15,25,35,45,55,65} För att sedan plocka ut i:te element ur en lista, skriver man [[i]] efter listan, t ex 815, 25, 35, 45, 55, 65<@@5DD Har man en lista av listor, t ex följande lista l av punkter i planet, kan man alltså plocka ut det 2:dra elementet ur den 3:de listan i l så här. l = 8811, 22<, 833, 44<, 855, 66<, 877, 88<< l@@3dd@@2dd För att få första och sista elementet i en lista kan man använda First och Last First@lD Last@lD Det finns kommandon för att ta snitt och komplement, och för att välja ut element som uppfyller ett visst kriterium, t ex vara jämna eller något annat. Se nästa exempel. Här tillverkar vi en lista på binomialkoefficienter, kallad bc. bc = Table@Binomial@20, id, 8i, 1, 20<D Sidospår, om att införa egna namn: Alla Mathematicas inbyggda funktioner börjar på stor bokstav. En grundregel som man kan använda för att markera att en funktion är vår egen och inte Mathematicas är alltså att låta dess namn börja med en liten bokstav. Även om denna regel inte används konsekvent i denna arbetsbok så rekomenderas ändå att du gör det! Tillbaka till vår lista med binomialkoeficienter: Det största elememtet i bc hittar vi så här: Max@bcD Vilket är det nu? Tittar vi på listan verkar det ligga mitt i. Vi kan plocka ut det tionde elementet i listan såhär: bc@@10dd Binomial@20, 10D Det finns förstås ett inbyggt kommando i Mathematica för att hitta de index där ett element förekommer:
2 Arbetsblad3.nb Position@bc, Max@bcDD Slutligen kan vi plotta alla koefficienterna JJ = ListPlot@bc, PlotStyle Ø PointSize@0.02DD Vi kan förena punkterna (i ordningsföljd) genom kommandot Joined Æ True. Show@JJ, ListPlot@bc, Joined Ø TrueDD Här är några fler exempel på listor och linjeteckningar. Nedanstående kommando skapar en lista av 1000 slumpade punkter i planet vars koordinater ligger mellan 0 och 1. Aktivera cellerna! slumppunkter = Table@RandomReal@80, 1<, 2D, 8i, 20<D; ListPlot@slumppunkterD ListPlot@slumppunkter, Joined Ø True, Axes Ø FalseD 1 (svårighetsnivå 1). Bilda en lista l1 båstående av 10000 slumpade heltal i intervallet [1,20000]. a) Avgör om elementet 10000 ligger i listan l1 (genom lämpligt kommando i Mathematica - sök i hjälpen!). b) Bestäm antalet unika element i listan l1 (genom lämpligt kommando i Mathematica - sök i hjälpen!). c) Finn ett tal i l1 med högsta frekvens (genom lämpligt kommando i Mathematica - sök i hjälpen!). 2 (svårighetsnivå 3). Bestäm hur många perfekta blandningar av en kortlek man behöver utföra för att få tillbaka kortleken i den ordning man började med. Med en perfekt blandning menar jag detta: Dela upp högen i två likadana högar och alternera kort från vardera högarna. 2. Hitta primtalstvillingar Det finns oändligt många primtal, fast de ligger glesare och glesare bland heltalen. Vissa av dem som 11 och 13 eller 34 301 och 34303 skiljer sig bara med 2 och kallas för primtalstvillingar. Ingen vet om det finns oändligt många sådana eller inte. Det närmaste man har kommit är att man lyckats visa att det finns oändligt många primtal som skiljer sig med 246. Detta är ett mycket nytt resultat, det är från 2014 och bygger på ett banbrytande arbeta av Yitang Zhang från 2013. Här ska vi leka lite och se att det finns primtalstvillingar större än en miljard. Mathematica kan avgöra om ett tal är ett primtal: PrimeQ@65 537D PrimeQ@65 536D Vi kan få det 1000:de primtalet Prime@1000D Och då kan vi använda Table för att göra en lista av de första hundra primtalen(som vanligt ger vi ett påhittat namn åt den) primtalstabell = Table@Prime@iD, 8i, 1, 100<D; Nu vill vi veta vilka av dessa som är primtalstvillingar. Vi vill alltså gå igenom listan och konstruera dellistan av de x för vilka x+2 också är ett primtal.
Arbetsblad3.nb 3 Den vägledande insikten är att Mathematica har kommandon för allt som svarar mot sedvanliga matematiska operationer. Att ur en mängd välja ut de x som uppfyller ett visst kriterium är ju ett vanligt matematiskt tillvägagångssätt. Alltså ska det finnas ett lätt sätt att göra detta på. Variabeln som löper över mängden kallas #. Så här väljer vi ut de # i primtalstabell som är mindre än 10. Select@primtalstabell, Ò < 10 &D 82, 3, 5, 7< För att få primtalstvillingar kan vi då göra så här: Select@primtalstabell, PrimeQ@Ò + 2D &D 83, 5, 11, 17, 29, 41, 59, 71, 101, 107, 137, 149, 179, 191, 197, 227, 239, 269, 281, 311, 347, 419, 431, 461, 521< Select[lista,kriterium] väljer ut de element i listan som uppfyller kriteriet. Här är listan primtalstabell, # är som tidigare namnet på variabeln som löper över elementen amanda och kriteriet är att # + 2 ska vara ett primtal. D v s vi väljer ut det första primtalet i varje par av primtalstvillingar. Nu kan vi ställa och snabbt besvara frågan om det finns några primtalstvillingar bland primtal nummer 100 000 000 och 100 000 100. storaprimtal = Table@Prime@iD, 8i, 1 000 000 000, 1 000 000 100<D; storatvillingar = Select@storaprimtal, PrimeQ@Ò + 2D &D 822 801 763 729, 22 801 763 951, 22 801 764 059, 22 801 764 959, 22 801 765 211, 22 801 765 247, 22 801 765 409< Vi har alltså flera primtalstvillingar större än 2 miljarder. Det man framförallt ska imponeras av är med vilken lätthet vi kan hantera mängder eller listor. 1. (svårighetsnivå 1) Bestäm dellistan till l1 från föregående avsnitt som består av alla tal i l1 som är primtal. 2. (svårighetsnivå 2) Hitta den 2024:e förekomsten av par av primtal på formen p,p+4. 3. Rekursionsföljder. En idealiserad modell för kanintillväxt ser ut så här. Antalet kaninpar efter n månader kallas f[n], och uppfyller rekursionsformeln f[n] = f[n - 1] + f[n - 2]. Startvillkoren är f[0]=1 och f[1]=1. En rekursiv definition lämpar sig förstås för att beräknas på dator. Clear@fD f@0d = 50; f@1d = 10; f@n_d := f@nd = f@n - 1D + f@n - 2D Observera formen av definitionen f[n_] := f[n]=. Kolonet efter f[n_] talar om för matematica att skjuta upp beräkningarna tills den verkligen behöver göra det. Att det också står upprepat f[n_] := f[n]= garanterar att programmet visserligen skjuter upp beräkningen tills det behövs, men att den också kommer ihåg redan beräknade värden, och inte upprepar beräkningen för dessa. f@10d
4 Arbetsblad3.nb Table@f@nD, 8n, 1, 20<D f@120d För att få grepp om hur snabbt antalet kaninpar växer gör vi nu en tabell av (närmevärden) av kvoterna mellan ett värde och det nästa: Table@N@f@n - 1D ê f@ndd, 8n, 1, 20<D Vi kan jämföra gränsvärdet med det tal som kallas gyllene snittet. N@HSqrt@5D - 1L ê 2D 1 (svårighetsnivå 1). Nu har du lärt dig hur man definierar en rekursiv funktion. I Mathematica finns det förstås en inbyggd funktion för att beräkna fakultet. Finn denna funktion. Skriv därefter en egen rekursivt definierad funktion i Mathematica som beräknar fakultet. 2 (svårighetsnivå 2). Vi har sett att succesiva kvoter av på varandra följande fibonaccital (det är så de heter) närmar sig gyllene snittet. Vad händer om man istället tittar på kvoten f[n-a]/f[n]? Experimentera och redovisa en förmodan (du behöver inte bevisa din förmodan). Experimentera även med olika startvärden på rekursionen. Vad händer? 4. Sannolikheten för att ett tal är ett primtal. PrimePi[x] talar om hur många primtal, som är mindre än x. PrimPi[x]/x är då sannolikheten att ett slumpvis valt heltal mindre än x ska vara ett primtal. Det finns en sats som säger att för stora x är PrimPi[x]/x av samma storleksordning som 1/ln(x+1). Först några exempel. Antalet primtal mindre än 100: PrimePi@100D Andelen av talen mindre än 100 som är primtal: PrimePi@100D ê 100 êê N Andelen av talen mindre än 1000 som är primtal: PrimePi@1000D ê 1000 êê N En fjärdedel av alla tal mindre än 100 är primtal, men bara en sjättedel av de mindre än 1000. Sannolikheten minskar alltså---men hur snabbt? Vi kan använda tekniken ovan: primsannolikhet = Table@8x, PrimePi@xD ê x<, 8x, 2, 20 000<D; gprim = ListPlot@primsannolikhetD Jämför den sedan med grafen till 1/log(x), för att se en illustration av primtalssatsen. Vi ska ta kvoten mellan de två funktionern och påståendet är alltså att att PrimePi(x)Log[x]/x går mot 1 när x blir stort. ff = Table@8x, PrimePi@xD Log@xD ê x<, 8x, 2, 100 000<D; gprim2 = ListPlot@ffD Ett av de sju Clay-priserna om en miljon dollar styck handlar om att ge en bättre uppskattning. 1 (svårighetsnivå 1). Primtalen kan delas in i tre grupper. Jämna, udda på formen 4k+1, udda på formen 4k +3. Skriv en funktion som ger alla primtalen på formen 4k+3 som är mindre än n. (För n = 12 är dessa 3,7,11.) 2. (svårighetsnivå 2) Skriv en funktion som också ger alla primtalen på formen 4k+1 som är mindre
Arbetsblad3.nb 5 2. (svårighetsnivå 2) Skriv en funktion som också ger alla primtalen på formen 4k+1 som är mindre än n. (För n = 12 finns det bara ett, nämligen 5.) Undersök hur fördelningen mellan primtal på formen 4k+3 och primtal på formen 4k+1 ser ut asymptotiskt med en plot av kvoten av de två funktionerna liknande den ovan. 3. (svårighetsnivå 3) Det verkar som att antalet primtal mindre än eller lika med x är mycket större än x/ln(x) när x är litet. Vi säger att ett primtal p är stort om det är större än 1000. Formulera en hypotes om antalet stora primtal mindre än x och gör en plot motsvarande plotten ovan.