Timplanering Diskret matematik I förslaget har vi fördelat ut 40 timmar på de olika kapitlen och avsnitten. Har ni fler (eller färre) timmar kan ni lätt räkna om så att det passar er egen timplanering. Mängdlära Mängder Relationer Blandade uppgifter De hela talen Motsatta tal och absolutbelopp Positionssystemet Binära och hexadecimala tal Om delbarhet och primtal Faktoruppdelning Restklassaritmetik Blandade uppgifter Satslogik och algoritmer Satslogik Algoritmer Blandade uppgifter Sannolikhetslära och kombinatorik Inledande sannolikhetslära Kombinatorik Grafteori Blandade uppgifter Talföljder Olika typer av talföljder Beskrivning av talföljder Rekursiva talföljder Induktion Blandade uppgifter Prov 4 h 2,5 h 0,5 h 1 h 7 h 0,5 h 1 h 2 h 1 h 1,5 h 1 h 6 h 2,5 h 2,5 h 1 h 7 h 1,5 h 3 h 1 h 1,5 h 13 h 0,5 h 4 h 4 h 3 h 1,5 h 3 h
Diskret Matematik Fel i första upplagans första tryckning Sida, uppgift s. 23, 1022 c Ska vara (A B) C. s. 26, 2004 Fel i facit. Fyrorna ändras till treor. s. 28, nedersta raden 10 8 ska ändras till 8 1 s. 43, rad 17 Stryk ordet inte i Nästa tal, dvs. 7, är större än 5,5. s. 44, 2031 Saknar räknarsymbol. s. 59, 2067 Ledtrådstexten fel. Istället för delbart med n ska det vara delbart med 9. s.61, 4:e raden 1010 två ska vara 10101 två.. s. 75, 3018 Fel i facit. Istället för 1 i for-satsen ska det vara 100 och istället för 100 ska det vara 999. s. 93, nionde raden från slutet Fel komplementhändelse. Ska vara båda mynten visar inte klave s. 97, programmet dices Saknas S + 1 S efter if-satsen s. 117, 4030a Fel i facit. Termen 6a 2 ba ska 6a 2 b 2 s. 123, 4036b Ta bort kanten mellan B och E annars blir det ingen Euler-slinga. s. 129, 4064b Fel avrundat i facit, ska vara 0,556. s. 130, 4072 Fel i facit, ska vara 90 matcher. s. 130, 4084 Facit till denna uppgift har fått fel nummer, nämligen 4086. s. 133, I texten Stina undrar ska ordet rad bytas ut mot ordet match. s. 140, 5007c Fel i facit. Ska vara 6,4 10 5. s. 156, 5042b De tre sista raderna i uppgiften bör ersättas med: Poolen anses tjänlig att bada i när koncentrationen är 1,5 ppm. Hur länge dröjer det? Vad blir koncentrationen efter en månad (30 dagar)? s. 164, 5058 Fel i facit, bör vara ca 450 år. s. 184, 4035a ADECB ändras till ADECBA. s. 184, 4036a ABCDEFD ändras till ABCDEFDA.
6 Fördjupningskapitel Diskret matematik I detta kapitel är det tre större uppgifter av fördjupningskaraktär. Vår tanke är att du ska kunna ta del av dem efter intresse. En uppgift behandlar diofantiska ekvationer och de två andra sortering och sökning. Den första uppgiften är av matematisk karaktär medan de två andra är av programmeringskaraktär. Gemensamt för dessa uppgifter är att de inleds av en teoretisk genomgång och därefter följer ett antal problem att lösa. Diofantiska ekvationer En ekvation av utseendet a x+ b y = cdär x och y är variabler och a, b och c är heltalskoefficienter kallas en diofantisk ekvation. Exempel på en diofantisk ekvation är 15 x+ 17 y = 8. En sådan ekvation har heltalslösningar under vissa speciella omständigheter. I andra fall saknar den heltalslösningar. I vårt inledande exempel på Euklides algoritm i kapitel 2 på sidan 51 bestämde vi den största gemensamma delaren till 8 316 och 2 940. Den är 84. För att visa att detta verkligen var den största gemensamma delaren skrev vi om algoritmen så att vi fick 84 = 7 2940 6 8316. Om du studerar ekvationen x 2940 + y 8316 = 84 ser du att vi har funnit en heltalslösning till den. Lösningen är x = 7 och y = 6. Det kan finnas flera lösningar. Just nu kan vi inte avgöra detta. Resonemanget, som vi har fört, kan generaliseras till ett allmänt fall. Vi påstår nu utan bevis att den diofantiska ekvationen a x+ b y = c har heltalslösning då och endast då största gemensamma delaren till a och b delar c, dvs. c = n SGD(a,b), för något heltal n. En intressant följd av ovanstående är att den diofantiska ekvationen a x+ b y = c har heltalslösningar för alla heltal c om a och b är relativt prima, dvs., SGD(a,b) = 1. Denna slutsats kan vi dra eftersom talet 1 som en självklarhet delar alla heltal c. En ekvation av utseendet a x + b y = c där x och y är variabler och a, b och c är heltalskoefficienter kallas en diofantisk ekvation! Den diofantiska ekvationen a x + b y = c har heltalslösning då och endast då c = n SGD(a,b). Kompl. till 47-01697-3, Diskret matematik 1 Liber AB och författarna
Exempel 1 Bestäm en heltalslösning till den diofantiska ekvationen a) 105x + 161y = 21 b) 22x 55y = 15 Lösning: a) 105x +161y = 21 Största gemensamma delaren till 161 och 105 bestäms: 161 = 1 105 + 56 som skrivs om 56 = 161 1 105 105 = 1 56 + 49 som skrivs om 49 = 105 1 56 56 = 1 49 + 7 som skrivs om 7 = 56 1 49 49 = 7 7 + 0 Största gemensamma delaren till 105 och 161 är 7 och 7 är en delare till 21. Med hjälp av omskrivningarna får vi: 7 = 56 1 49 = 56 1 (105 1 56) = 2 56 1 105 = = 2 (161 1 105) 1 105 = = 2 161 3 105 Den ursprungliga ekvationen är 21 = 105x + 161y Vi har funnit att 7 = 3 105 + 2 161 Om vi multiplicerar båda leden i vårt resultat med 3 (= 21/7) får vi 21 = 9 105 + 6 161. Vi har alltså funnit lösningen x = 9 och y = 6. Vi kontrollerar resultatet på räknaren. Se bilden! b) 22x 55y = 15 Största gemensamma delaren till 55 och 22 bestäms: 55 = 2 22 + 11 22 = 2 11 + 0 Största gemensamma delaren är 11. Eftersom 11 inte delar 15 saknar ekvationen heltalslösning. Resultat: a) En heltalslösning är x = 9 och y = 6 b) Saknar heltalslösning Kompl. till 47-01697-3, Diskret matematik 2 Liber AB och författarna
UPPGIFTER 6001 Bestäm en lösning till den diofantiska ekvationen: a) 156x + 66y = 18 b) 21x + 35y = 7 c) 15x + 12y = 2 d) 65x + 33y = 8 6002 Ange något par av heltal a och b så att ekvationen ax + by = 10 har heltalslösningar. Låt oss studera lösningen till ekvationen 105x +161y = 21 genom att lösa ut y och studera den linjära funktionen grafiskt. Vi får 21 105x y =, som vi skriver in i funktionseditorn. Ett lämpligt 161 fönster anpassas. Vi har valt att studera funktionen i intervallet 15 < x < 15. I fönstret visas en heltalslösning till ekvationen, den med x = 9 och y = 6. Finns det flera lösningar? Vi söker i tabellen på räknaren och finner då att x = 14 och y = 9 är en heltalslösning. Fortsatt sökande ger att x = 37 och y = 24 är en lösning. Finns det ännu flera? Man kan visa att det finns oändligt många heltalslösningar x = 9 + 23 n och y = 6 15 n för ett godtyckligt heltal n, och att detta är alla heltalslösningar. Den lösning vi först fann, får du med n = 0, den andra med n = 1 och den senaste med n = 2. Observera redan nu att den ursprungliga ekvationen 105 x + 161 y = 21 kan förenklas. Genom att dividera ekvationens båda led med största gemensamma delaren får vi: Kompl. till 47-01697-3, Diskret matematik 3 Liber AB och författarna
15 x + 23 y = 3 Efter denna förenkling är koefficienterna 15 och 23, relativt prima. Just dessa båda tal är de som dyker upp som multipler då vi skapar mångfalden av lösningar. Koefficienten för y blir multipeln för x, x = 9 + 23n, och det motsatta talet till koefficienten för x blir multipel för y, y = 6 15n. Förutsättningen för att detta ska vara sant är att koefficienterna i den diofantiska ekvationen är relativt prima. Om koefficienterna a och b i ekvationen, ax + by = c, från början inte är relativt prima måste vi alltså först dividera ekvationen med största gemensamma delaren till a och b. Observera att vi vet att denna också delar c om vi ska få heltalslösningar. *Bevisgången framgår av följande resonemang: Vi studerar på nytt ekvationen 105x +161y = 21. Denna har vi dividerat med SGD(105,161) = 7 och på så sätt fått den enklare ekvationen 15x + 23y = 3. Vi har funnit att x = 9 och y = 6 är en av lösningarna till ekvationen. Det innebär att 15 ( 9) + 23 6 = 3. Låt oss beteckna en allmän lösning med X och Y. För denna gäller då på samma sätt 15 X + 23 Y = 3. Subtrahera ekvationerna: 15 ( X ( 9)) + 23 ( Y 6) = 3 3 Som vi skriver: 15 ( X ( 9)) = 23 ( Y 6) Högra ledet i denna ekvation är delbart med 23. Om vänstra ledet är delbart med 23 så kommer lösningen att vara ett heltal. Vi vet att 15 inte är delbart med 23. Dessa tal är relativt prima. Alltså måste (X ( 9)) vara delbart med 23. Det innebär att vi kan skriva (X ( 9)) som en multipel av 23: (X ( 9)) = 23n, dvs. X = 9 + 23n, för något heltal n. Vi sätter in detta i ekvationen 15 ( X ( 9)) = 23 ( Y 6) och får: 15 ( 9 + 23 n ( 9)) = 23 ( Y 6) som förenklas till 15 23 n= 23 ( Y 6) eller Y = 6 15 n Resonemanget kan generaliseras till godtyckliga tal a, b och c, varmed vi på ett allmänt sätt kan bevisa att ekvationens lösningar har ovanstående struktur. Slutsats: Den diofantiska ekvationen ax + by = c, där a och b förutsätts vara relativt prima, har den allmänna heltalslösningen x = x0 + b n och y = y0 a n för godtyckliga heltal n. Här betecknar x 0 och y 0 en funnen heltalslösning till den diofantiska ekvationen. Kompl. till 47-01697-3, Diskret matematik 4 Liber AB och författarna
En diofantisk ekvation, Ax + By = C där A och B inte är relativt prima och för vilken SGD(A,B) = k har heltalslösningar om k är en delare till C. Vi dividerar då ekvationen med k och får en ekvation, ax + by = c, där a och b är relativt prima. Exempel 2 Bestäm alla heltalslösningar till den diofantiska ekvationen 15x + 17y = 21 Lösning: Euklides algoritm ger: 17 = 15 1+ 2 som kan skrivas 2 = 17 15 15 = 2 7 + 1 som kan skrivas 1 = 15 2 7 2= 2 1+ 0 Eftersom 15 och 17 är relativt prima finns lösning. Omskrivning ger 1= 15 2 7= 15 (17 15) 7 = 15 8+ 17 ( 7) dvs. 1= 15 8+ 17 ( 7) x = 8 och y = 7 är en lösning till ekvationen 1 = 15x + 17y Den ursprungliga ekvationen är 21 = 15x + 17y. Genom att multiplicera 1 = 15 8 + 17 ( 7) med 21 får vi: 21 1 = 15 (21 8) + 17 ( 7 21) x = 21 8 = 168 och y = 21 ( 7) = 147 är alltså en lösning till 21 = 15x + 17y: Den allmänna heltalslösningen är då, enligt slutsatsen ovan: X = 168 + 17n och Y = 147 15n Vi kontrollerar resultatet med räknaren: Resultat: Den allmänna lösningen är x = 168 + 17n och y = 147 15n UPPGIFTER 6003 Bestäm alla heltalslösningar till ekvationen a) 18x + 54y = 72 b) 18x 15y = 27 c) 156x + 104y = 234 6004 Bestäm alla heltalslösningar till ekvationen: a) 11x + 12y = 13 b) 12x + 18y = 9 c) 7x 9y = 41 6005 Studera ekvationen 13x + 19y = k. Visa att denna ekvation har heltalslösningar för varje godtyckligt valt heltal k. Kompl. till 47-01697-3, Diskret matematik 5 Liber AB och författarna
**Exempel 3 På en cirkus fick man in 26 180 kr i entréavgifter vid en föreställning. Avgiften för barn var 90 kr och för vuxna 140 kr. Kassören tappade kontrollen av hur många som hade betalat och eftersom man inte lämnat några biljetter blev det problem vid redovisningen av antalet besökande. Det enda kassören med säkerhet visste var att det var något fler barn än vuxna på föreställningen. Hur många människor såg cirkusföreställningen? Lösning: Antalet barn var x och vuxna y. Vi söker heltalslösningar till 90x + 140y = 26 180. Euklides algoritm ger: 140 = 90 1 + 50 90 = 50 1 + 40 50 = 40 1 + 10 40 = 10 4 +0 Största gemensamma delaren är 10 och högerledet är delbart med 10. Vi studerar den enklare ekvationen 9x + 14y = 2 618 14 = 9 1 + 5 som ger 5 = 14 9 9 = 5 1 + 4 som ger 4 = 9 5 5 = 4 1 + 1 som ger 1 = 5 4 4 = 1 4 + 0 Alltså är: 1 = 5 4 = 5 (9 5) = 2 5 9 = 2 (14 9) 9 = 2 14 3 9 dvs. 1 = 3 9 + 2 14 Multiplicera båda leden med 26 180: 26 180 = 26 180 3 9 + 26 180 2 14 dvs.: 26 180 = 7 854 90 + 5 236 140 En heltalslösning är x = 7 854 och y = 5 236, men den är orimlig eftersom antalet personer inte rimligen kan vara negativt. Den allmänna lösningen blir då: X = 7 854 + 14n och Y = 5 236 9n Eftersom 7 854/14 = 561 börjar vi studera lösningar som har egenskapen att n är större än 561, annars blir X 0. För n = 570 får vi lösningen X = 126 och Y = 106. För n = 569 får vi 112 barn och 115 vuxna och för n = 571 får vi 140 barn och 97 vuxna. Räknaren visar flera närliggande lösningar. Eftersom något fler vuxna var på föreställningen är den första lösningen, X = 126 och Y = 106, den troligaste. Resultat: Det var troligtvis 232 personer på föreställningen, 126 barn och 106 vuxna. Kompl. till 47-01697-3, Diskret matematik 6 Liber AB och författarna
Vem var Diofantos? Diofantos var en grekisk matematiker som levde cirka 250 e.kr. Han undersökte det som vi numera kallar diofantiska ekvationer, dvs. ekvationer där koefficienterna är heltal och där vi söker heltalslösningar. Diofantos har betytt mycket för talteorins utveckling. Fermats förmodan, som du läste om i kapitel 2, handlar n n n om en diofantisk ekvation, x + y = z, där n är ett heltal större än 2. Det var i marginalen av Diofantos berömda bok Arithmetika som Fermat på 1600-talet skrev om sin förmodan. UPPGIFTER 6006 Gunilla är mattelärare. Eftersom hon gärna ville fostra yngste sonen Hampus, som älskade kakor, gav hon honom uppgiften att köra till det närbelägna konditoriet för att köpa två sorters läckra kakor. I konditoriet fanns det nämligen två sorters delikata bakverk, nötkakor och drömmar. Priset per styck för de förra (G) var 15 kr och för de senare (S) 9 kr. Hampus fick med sig hela kakkassan, 351 kr, med uppdraget att han skulle köpa av båda sorterna eftersom Gunilla gärna ville ha minst en kaka av varje sort. Men han måste handla för precis hela summan och bara dessa båda sorter. Hur många kakor kom Hampus hem med? 6007 På en nattklubb var entréavgiften 175 kr för män och 145 kr för kvinnor. En kväll summerades kassan för entréavgifter till 10 000 kr. Hur många betalande besökare hade nattklubben denna kväll? 6008 a) Visa att det finns heltal m och n så att 1 = 17m + 15n. ** b) Största gemensamma delaren till de positiva heltalen p och q är 1. Tror du att det finns heltal m och n så att 1 = mp + nq? Argumentera för det du tror på. Kompl. till 47-01697-3, Diskret matematik 7 Liber AB och författarna
Sortering När man hanterar listor med värden är man ofta i behov av att sortera dem. Inom datalogi har det utvecklats ett stort antal sorteringsalgoritmer. I detta avsnitt behandlas en enkel sorteringsalgoritm, nämligen selectionsort. I uppgifterna kan du dessutom stifta bekantskap med ytterligare en enkel sorteringsalgoritm, bubblesort, och en mer anvancerad, combsort. Selectionsort bygger på att man ska kunna hitta det minsta talet i en del av en lista. Därför inleder vi detta avsnitt med att söka efter det minsta / det största talet i en lista. Minimum / maximum Ett transportbolag mäter tiden det tar för ett tåg att köra mellan två stationer. Mättiderna lagras som en sekvens av heltal. Varje heltal anger antalet sekunder mellan start och stopp. När sekvensen innehåller 1 000 mätvärden så ska bolaget ta reda på den kortaste körtiden. Vi börjar med att göra en algoritm för att hitta den kortaste tiden: 1 Avläs det första värdet och kom ihåg det som det hittills minsta värdet. 2 Om alla värden är kontrollerade så gå till steg 6. 3 Avläs nästa värde i sekvensen. 4 Om det avlästa talet är mindre än det hittills minsta så kom ihåg det som hittills minst. 5 Gå till steg 2. 6 Skriv ut det minsta värdet. När ovanstående algoritm är färdig så har du skrivit ut det minsta värdet. Om man uttrycker algoritmen i halvkod kan den se ut så här: Tilldela variabeln minst värdet av det första lagrade värdet Medan det finns fler värden i listan så Är nästa värde mindre än minst så Lagra värdet i minst Skriv ut minst mätvärden 254 283 278 248 268 243 258 287 280 minst 254 254 254 248 248 243 243 243 243 På räknaren kan ett program som beräknar minimum i lista L1 se ut så här: Kompl. till 47-01697-3, Diskret matematik 8 Liber AB och författarna
PROGRAM:MINIMUM dim(l1) N L1(1) M For(I,2,N) If L1(I)<M L1(I) M Disp MIN=,M Antal element i lista L1 lagras i N Lagra det första värdet i M Iteration där I=2,3,4,..,N-1,N Om värdet i position I är mindre än M så Lagra värdet i M Skriv ut M Om man dessutom vill ta reda på den längsta körtiden använder man en annan variabel för att minnas det hittills största värdet. Sedan kontrollerar man detta värde mot värdena i listan. UPPGIFTER 6009 Skriv programmet MINIMUM på din räknare. Testkör programmet med ett antal olika värden i lista L1. 6010 Skriv ett program som skriver ut det minsta talet och det största talet i en lista. *6011 Skriv en algoritm för att ta fram de två minsta värdena i en lista. Implementera sedan din algoritm på räknaren så att de två minsta värdena i lista L1 skrivs ut. Ditt program ska inte förändra innehållet i listan. **6012 I bedömningssporter låter man ett antal domare avge var sin poäng. För att göra bedömningen rättvis så tar man ofta bort den högsta och den lägsta domarpoängen innan utövaren får sin poäng. Skriv ett program vilket beräknar medelpoängen av avgivna domarpoäng. Den högsta poängen och den lägsta poängen ska inte ingå i medelpoängsberäkningen. Du kan utgå från att samtliga Kompl. till 47-01697-3, Diskret matematik 9 Liber AB och författarna
domares poäng är lagrade i lista L6. I skärmdumpningen är följande värden lagrade i L6: 9.3, 9.1, 9.0, 9.2, 9.1, 9.2. **6013 Skriv en algoritm för att skriva ut alla udda heltal i en lista. Skriv sedan ett program på din räknare, men ändra så att alla udda heltal i lista L1 kopieras till lista L2. * Du kan testa om ett tal x är ett heltal med fpart(x) = 0. * Du kan testa om ett tal x ej är ett jämnt tal med fpart(x/2) 0. Selectionsort Ett sätt att sortera en lista med tal är att söka genom listan och välja det minsta värdet av samtliga och placera det främst i listan. Sedan väljer man det näst minsta och placerar det som andra elementet i listan. Och på det sättet fortsätter man tills listan är sorterad i växande ordning. Denna sorteringsalgoritm kallas för selectionsort. Om man i ovanstående beskrivning börjar med att välja det största talet och sedan det näst största osv. så sorteras listan i avtagande ordning. Halvkod för algoritmen att sortera i växande ordning ser ut så här: Upprepa för varje position i listan med start på den första Sök efter det minsta talet i listan. Börja sökningen på aktuell position och fortsätt tills listan är slut. Låt talet på den aktuella positionen och det minsta talet byta plats i listan Som exempel kan vi sortera en lista med talen 5, 8, 9, 4, 6. I figuren nedan sorteras ett tal på varje rad. Aktuell position, dvs. den position dit ett tal ska flyttas, markeras med understruket tal. Det är bland de tal som inte är sorterade som man väljer ut talet som ska flyttas. Dessa tal markeras med en ram. Den delen som inte är markerad är sorterad. 5 8 9 4 6 talen 5 och 4 byter plats 4 8 9 5 6 talen 8 och 5 byter plats 4 5 9 8 6 talen 9 och 6 byter plats 4 5 6 8 9 talet 8 byter plats med sig själv Kompl. till 47-01697-3, Diskret matematik 10 Liber AB och författarna
Ett program som använder selectionsort på lista A i räknaren ser du nedan: PROGRAM: SELSORTA For(A,1,dim(LA)-1) Iterera med A=1, 2,..,(antal värden -1) A I Till position A ska det minsta värdet flyttas, I håller minsta värdets position (antar position A från början) For(B,A+1,dim(LA)) Iterera med B = A + 1, A + 2,..,antal värden If LA(B)< LA(I) Leta efter värde som är mindre än det i position I B I LA(A) C LA(I) LA(A) C LA(I) Om sådant hittas så lagra positionen i I Byt värden i position A och i position I UPPGIFTER 6014 Skriv programmet för selectionsort (SELSORTA) i din räknare och testa programmet genom att sortera några listor. Eftersom programmet alltid sorterar lista A så måste du lagra värdena du vill ha sorterade i lista A före sorteringen. 6015 Skriv programmet SELSORTD vilket sorterar en lista (välj själv vilken) avtagande. *6016 En sorteringsalgortim som är ungefär lika effektiv som selectionsort är bubblesort. Om en lista, vilken innehåller n tal, ska sorteras växande så är tanken bakom bubblesort följande: 1. För varje tal i listan med start på det första elementet så genomför punkt 2, 3 och 4. 2. Jämför det sista talet i listan med det näst sista. Om det sista talet är mindre än det näst sista så låt talen byta plats. 3. Jämför sedan det näst sista talet med det tredje sista talet i listan. Om det näst sista talet är mindre än det tredje sista så låt talen byta plats. 4. Fortsätt på detta sätt ända tills aktuellt tal (se punkt 1) jämförts med talet efter. Så här kan halvkod för räknaren se ut: Kompl. till 47-01697-3, Diskret matematik 11 Liber AB och författarna
Tilldela variabeln N antalet tal i listan. För varje position X i listan A, med start på position 1, så Tilldela variabeln J värdet N-1 Medan J X så Om A(J)>A(J+1) så Tilldela variabeln T värdet A(J) Tilldela A(J) värdet A(J+1) Tilldela A(J+1) värdet T Minska J med 1. Implementera ovanstående halvkod som programmet BUBSORT på din räknare. Du kan utgå från att det alltid är en speciell lista som sorteras. *6017 Du märkte säkert att sorteringen gick mycket långsamt på din räknare. Detta beror till stor del på att räknaren jobbar långsamt. Implementera SELSORTA i ett programmeringsspråk på en dator. Gör helst implementeringen som en funktion, vilken tar emot en lista som argument och som returnerar listan sorterad. 6018 En effektivare sorteringalgoritm än de du hittills stiftat bekantskap med är combsort. combsort är egentligen en modifiering av bubblesort. Skriv in nedanstående program. Testa gärna hur lång tid selectionsort respektive combsort tar med en lista med 100 tal. PROGRAM: COMBSORT 1.3 F dim(la) N 0 S N G While S=0 and G>1 int(g/f) G If G<1 1 G 1 S N-G T For(I,1,T) G+I J If LA(I)> LA(J) LA(I) X LA(J) LA(I) X LA(J) 0 S *6019 Implementera combsort (se uppgift 6018) i ditt programmeringsspråk. Kompl. till 47-01697-3, Diskret matematik 12 Liber AB och författarna
Sökning Då du söker ett namn i en telefonkatalog vet du att namnen är ordnade i bokstavsföljd. Detta utnyttjar du och gör en effektiv sökning. Men om namnen varit helt oordnade så skulle sökningen bli besvärligare. Förmodligen skulle du söka från början i katalogen och fortsätta bakåt tills du hittar personen (eller ger upp). Vid sökning efter speciella värden i en lista råkar man ut för dessa två situationer, nämligen att listan är osorterad eller att den är sorterad. I en osorterad lista söker man linjärt, dvs. från början till slut, medan man i en sorterad lista kan söka mer effektivt genom s.k. binär sökning. I texten nedan söker vi efter tal men man kan naturligtvis söka efter vilken typ av data som helst. Linjär sökning Algoritmen för linjär sökning är mycket enkel. Man kontrollerar elementen i listan ett efter ett och ser efter om det är det värde man söker efter. När man hittat värdet så slutar man söka. Om värdet man söker inte finns i listan så innebär detta att samtliga värden i listan kontrollerats utan resultat. Det spelar ingen roll om man söker från slutet eller från början av listan. Halvkod för ett program vilket använder linjär sökning skriver ut det sökta värdets position i listan. Om värdet ej finns i listan skrivs talet 0. blir så här: Tilldela variabeln index värdet av antalet element. Det innebär att index refererar till det sista talet i listan. Tilldela variabeln funnen värdet false. Medan index 1 och funnen=false så Om det tal index refererar till är det sökta så tilldela variabeln funnen värdet true Annars så minska värdet på index med 1 Skriv index Binär sökning Om en lista är sorterad kan man söka binärt. Men man måste veta om det minsta värdet är först i listan (växande ordning) eller sist i listan (avtagande ordning). Vi utgår från en växande lista i följande förklaring. Strategin är att man kontrollerar talet i mitten först. Är det två tal i mitten så väljer vi det första av talen. Talen före det kontrollerade talet utgör en sorterad dellista där samtliga tal är mindre än eller lika stora som talet vi kontrollerat. På samma sätt utgör talen efter det kontrollerade talet en sorterad dellista. Om talet vi söker är mindre än det kontrollerade upprepar vi denna sökstrategi på den Kompl. till 47-01697-3, Diskret matematik 13 Liber AB och författarna
första halvan, dvs. på talen som är mindre än det kontrollerade. Om talet vi söker är större än det kontrollerade så upprepar vi strategin på den andra halvan. Om vi har listan 2 3 5 7 11 13 17 19 23 29 31 37 41 och söker efter värdet 23 så får vi följande sökningar. Det kontrollerade värdet är understruket och dellistan vi arbetar mot är markerad med ram 1. 2 3 5 7 11 13 17 19 23 29 31 37 41 23 är större än 17 2. 2 3 5 7 11 13 17 19 23 29 31 37 41 23 är mindre än 29 3. 2 3 5 7 11 13 17 19 23 29 31 37 41 23 är större än 19 4. 2 3 5 7 11 13 17 19 23 29 31 37 41 sökt värde funnet! Det behövdes endast 4 sökningar att finna talet i listan med 13 tal. Och sämre kan det inte bli med 13 värden i listan. Däremot kan det bli bättre. I ovanstående exempel framgår det att talet 19 kräver 3 sökningar, talet 29 två och talet 17 en. Detta ska du jämföra med linjär sökning som kan kräva upp till 13 sökningar. Om man uttrycker ovanstående algoritm i halvkod så blir det så här: Tilldela variabeln start värdet 1. Det är första positionen i listan. Tilldela variabeln slut värdet av antal tal. Det är sista positionen i listan. Tilldela variabeln attkontrollera heltalsvärdet av ((start+slut)/2). Medan (talet i positionen attkontrollera inte är det sökta) och (start<slut) så Om talet i positionen attkontrollera är större än det sökta så Tilldela slut värdet (attkontrollera-1) Annars Tilldela start värdet (attkontrollera+1) Tilldela attkontrollera heltalsvärdet av ((start+slut)/2) Om talet i positionen attkontrollera är det sökta talet så Skriv ut värdet attkontrollera Annars Skriv ut FINNS EJ Kompl. till 47-01697-3, Diskret matematik 14 Liber AB och författarna
UPPGIFTER 6020 Skriv halvkod för ett program vilket söker efter ett värde i lista L1 och som meddelar om värdet finns i listan. Man kan inte veta om listan är sorterad så sökningen måste vara linjär. Implementera sedan ditt program på räknaren. 6021 Ändra programmet i uppgift 6020 så att antalet förekomster av det sökta värdet skrivs ut. *6022 Skriv halvkod för ett program vilket frågar efter ett värde och som sedan söker efter värdet i lista L1. Programmet meddelar om värdet finns i listan eller ej. Programmet förutsätter att listan är sorterad växande och därför kan binär sökning användas. Implementera sedan ditt program på räknaren. *6023 En person A tänker på ett tal i intervallet [0, 1000] och att en annan person B försöker gissa talet. Efter varje gissning meddelar person A om gissningen är för liten, för stor eller korrekt. Leken avslutas med att antalet gissningar meddelas efter korrekt gissning. Skriv halvkod för ett program där räknaren är person A och användaren av räknaren person B. Implementera sedan programmet på din räknare. randint(0,1000) ger ett slumptal i intervallet [0, 1000]. Kompl. till 47-01697-3, Diskret matematik 15 Liber AB och författarna
Facit 6001 a) x = 9 och y = 21 b) x = 2 och y = 1 c) inga lösningar d) x = 8 och y = 16 6002 a = 5 och b =7, dvs. a och b är relativt prima 6003 a) x = 1+ 3n och y = 1 n b) x = 9 5n och y = 9 6n c) inga lösningar 6004 a) x = 13+ 12n och y = 13 11n b) inga lösningar c) x =164 9n och y = 123 7n 6005-6006 9 st nötkakor och 24 st drömmar. 6007 64 eller 58 6008 a) m = 7, n = 8 duger. Jämför med exempel 2 b) Sådana m och n finns. Man kan visa det med Euklides algoritm ungefär som i exempel 2. 6009 6010 PROGRAM:MINMAX dim(l1) N L1(1) M: L1(1) S For(I,2,N) If L1(I)<M L1(I) M If L1(I)>S L1(I) S Disp MIN=,M Disp MAX=,S 6011 PROGRAM:MINIMUM2 dim(l1) N If N>1 L1(1) A L1(2) B If A>B A C B A C B For(I,3,N) If L1(I) A A B L1(I) A Else If L1(I)<B L1(I) B Disp A,B 6012 PROGRAM:DOMARE dim(l6) N L6(1) A L6(1) B L6(1) S For(I,2,N) S+L6(I) S If L6(I)<A L6(I) A If L6(I)>B L6(I) B Disp POANG,(S-A-B)/(N-2) 6013 PROGRAM:UDDA 0 dim(l2) 0 N For(I,1,dim(L1)) If (fpart(l1(i))=0) and (fpart(l1(i)/2) 0) N+1 N L1(I) L2(N) Kompl. till 47-01697-3, Diskret matematik 16 Liber AB och författarna
6014 6015 PROGRAM:SELSORTD For(A,1,dim(LA)-1) A I For(B,A+1,dim(LA)) If LA(B)> LA(I) B I LA(A) C LA(I) LA(A) C LA(I) 6016 PROGRAM:BUBSORT dim(la) N For(X,1,N) N-1 J While J X If LA(J)> LA(J+1) LA(J) T LA(J+1) LA(J) T LA(J+1) J-1 J 6017 6018 6019 6020 Låt användaren mata in det tal som söks. Lagra värdet i variabeln T Iterera med I = 1, 2,.., antal värden Om talet i position I är samma som T så Skriv FINNS Stoppa programmet Skriv FINNS EJ PROGRAM:LSEARCH Input SOKT TAL:,T For(I,1,dim(L1)) If L1(I)=T Disp FINNS Stop Disp FINNS EJ 6021 PROGRAM:ANTAL 0 N Input SOKT TAL:,T For(I,1,dim(L1)) If L1(I)=T N+1 N N 6022 PROGRAM:BSEARCH Input SOKT TAL:,T 1 A dim(l1) B int((a+b)/2) I While L1(I) T and A<B If L1(I)>T I-1 B Else I+1 A int((a+b)/2) I If L1(I)=T Disp FINNS Else Disp FINNS EJ 6023 PROGRAM:GISSA randint(0,1000) T 0 N -1 G While G T N+1 N Input GISSNING,G If G<T Disp FOR LITET If G>T Disp FOR STORT Disp ANTAL GISSNINGAR,N Kompl. till 47-01697-3, Diskret matematik 17 Liber AB och författarna