Cryptografie les 5: Encryptiefunctie

Bij de encryptie van een tekst gebruiken we altijd de volgende stappen:

  1. Zet de tekst om in een serie getallen
  2. Voer een encryptiefunctie E(x) uit.
  3. Zet de getallen om in de versleutelde tekst.

Bij de decryptie van een tekst maak je de stappen in omgekeerde volgorde ongedaan:

  1. Zet de versleutelde tekst om in getallen.
  2. Voer de decryptiefunctie D(x) uit (D(x) is de inverse functie van E(x))
  3. Zet de getallen om in een leesbare tekst.

Op deze pagina zullen we dit illustreren aan de hand van een voorbeeld. Hierbij gebruiken we de volgende omzetting van letters naar getallen:

Daarnaast gebruiken we in dit voorbeeld de encryptiefunctie E(x)=3x \text{ mod } 26. Hierbij betekent modulo 26 (kortweg mod 26) dat we de rest nemen na deling door 26 (de %-operator in Python).

Opdracht 1:
a) Laat zien dat E(10)=4.
b) Leg uit waarom uit het antwoord van opdracht a volgt dat de encryptiefunctie E(x)=3x \text{ mod } 26 de letter K op de letter E afbeeldt.
c) Op welke letter wordt de X afgebeeld door deze encryptiefunctie?

Uitwerking 1a:

E(10)=3\cdot 10 \text{ mod } 26 = 30 \text{ mod } 26 = 4

Uitwerking 1b:

Bij het versleutelen van de letter K worden drie stappen gedaan:
1. De letter K wordt omgezet in het getal 10.
2. De encryptiefunctie zet 10 om in het getal E(10)=4.
3. De 4 wordt weer omgezet in de letter E met behulp van de tabel.

Uitwerking 1c:
  1. De letter X wordt eerst omgezet in het getal 23.
  2. Het getal 23 wordt versleuteld naar het getal E(23)=3\cdot 23 \text{ mod } 26 = 69 \text{ mod } 26 = 17
  3. Het getal 17 wordt omgezet in de letter R.

Conclusie: De X wordt afgebeeld op de R.

Bij deze encryptiefunctie hoort de decryptiefunctie D(x)=9x \text{ mod } 26. De reden is dat D(E(x))=9(3x) \text{ mod } 26 = 27x \text{ mod } 26= (26x+x) \text{ mod } 26= x.
De bovenstaande berekening laat zien dat als je de encryptiefunctie en decryptiefunctie na elkaar uitvoert het oorspronkelijke woord er weer uitkomt.

Opdracht 2:
a) Versleutel een woord met de encyryptiefunctie E(x) en geef het versleutelde woord aan de persoon naast je.
b) Ontcijfer het woord dat degene naast je versleuteld heeft.

Bovenstaande is zeker voor lange teksten best veel werk. Daarom gaan we op de volgende pagina dit laten automatiseren met Python. Eerst heb ik hieronder nog een paar andere encryptiefuncties staan. Kijk of het je lukt om bij iedere functie een decryptiefunctie te vinden.

Opdracht 3:
a) Verzin een decryptiefunctie bij E(x)=x+5 \text{ mod } 26.
b) Verzin een decryptiefunctie bij E(x)=(3x+5)\text{ mod } 26.
c) Verzin een decryptiefunctie bij E(x)=5x\text{ mod } 26.

Uitwerking 3a:

D(x)=x-5 \text{ mod } 26 werkt, omdat D(E(x))=((x+5)-5)\text{ mod } 26 = x \text{ mod } 26

Manier om op het antwoord te komen:
Je wilt 5 optellen ongedaan maken. Dat kun je doen door juist 5 af te trekken.

Uitwerking 3b:

D(x)=9(x-5)\text{ mod } 26 werkt, omdat D(E(x))=9((3x+5)-5) \text{ mod } 26 = 27x \text{ mod } 26= (26x+x) \text{ mod } 26= x

Manier om op het antwoord te komen:
Eigenlijk bestaat de encryptiefunctie E(x)=(3x+5)\text{ mod } 26 uit twee stappen. Eerst keer 3 en dan plus 5. Bij het maken van een inverse wil je die in omgekeerde functie ongedaan maken. Dat is eerst 5 aftrekken (om de plus 5 ongedaan te maken) en dan keer 9 doen (om de keer 3 ongedaan te maken).

Uitwerking 3c:

D(x)=21x \text{ mod } 26 werkt, omdat D(E(x))=21(5x)\text{ mod } 26 = 105x \text{ mod } 26 =(104x + x) \text{ mod } 26 = x

Manier om op het antwoord te komen:
De truc is om een getal a te vinden, zodat 5a één meer is dan een 26-voud. Als dat namelijk het geval is, geldt 5a \text{ mod } 26 = 1 en daarom ook 5ax \text{ mod } 26 = 1\cdot x = x. Als we die gevonden hebben, tonen deze berekeningen dat D(x)=ax een inverse is van E(x)=5x.

Om de bovenstaande a te vinden, kun je gewoon veelvouden van 26 noteren, totdat het getal dat erboven zit een vijfvoud is. Dat gebeurt bij 4\cdot 26=104 en dan is de gezochte a dus \frac{105}{5}=21.

Bonusopdracht:
Op de volgende pagina staat een Python-programma die bij een invoer van een woord met alleen hoofdletters als uitvoer het versleutelde woord na uitvoeren van de encryptie met E(x)=3x \text{ mod } 26 geeft. Als uitdaging kun je proberen of het je lukt om zo’n programma te schrijven voordat je op de volgende pagina spiekt.

Hint:

Zoek op internet op wat de ord– en de chr-functie doen.

Voorbereiden toets deel 1: Python

Op de toets krijg je drie Python-vragen. Het niveau hiervan zal één vraag van niveau 1.1 à 1.2 zijn, één vraag van niveau 1.3 à 1.4 en één vraag van niveau 1.5 tot 1.6. Zeker voor de moeilijkere vragen zul je echt moeten oefenen met het op papier opschrijven. Let er daarbij op dat je ook de witruimte (bij het inspringen van for-loops en if-loops) duidelijk doet.

Hieronder staat een overzicht van de functies die je in Python geleerd hebt. Zorg dat je deze functies kent en kunt toepassen.

a+b            a plus b
a-b            a min b
a*b            a keer b
a**b           a tot de macht b
a/b            a gedeeld door b
a//b           a gedeeld door b naar beneden afgerond op gehelen
a%b            a modulo b (de rest bij deling van a door b)
a,b = b, a     Verwisseld a en b
a^b            a XOR b

a == b         Dit test of a en b dezelfde waarde hebben.
a > b          Dit test of a een grotere waarde dan b heeft.
a >= b         Dit test of a groter of gelijk is aan b.
a < b          Dit test of a kleiner dan b is.
a <= b         Dit test of a kleiner of gelijk aan b is.
a != b         Dit test of a ongelijk aan b is.
A or B         Uitkomst is waar als A en/of B waar is.
A and B        Uitkomst is waar als zowel A als B waar is.

print(a)       Dit print a op het scherm van de gebruiker.
print(a,b)     Print a en b met een spatie ertussen.
input()        Dit leest een input in.
range(a,b,c)   Dit maakt een lijst van a tot b met steeds c verschil.
range(a,b)     Dit maakt een lijst van alle getallen vanaf a tot b.
range(b)       Dit maakt een lijst van alle getallen vanaf 0 tot b.
int()          Dit maakt van een waarde een geheel getal.
float()        Dit maakt van een waarde een kommagetal.
str()          Dit maakt van een waarde een stukje tekst.
for a in b:    Dit herhaalt de ingesprongen regels voor iedere waarde a uit de lijst b.
break          Dit zorgt dat de loop eindigt.
while a:       Dit herhaalt de ingesprongen regels zolang a waar is
if a:          Als a True is, worden de ingesprongen regels uitgevoerd. 
else:          Als de if False is, worden de ingesprongen regels uitgevoerd.
elif a:        Een else- en if-statement ineen
or and         Je kunt de logische operatoren "or" en "and" ook gebruiken in een loop.

.split()       Splitst een regel in een lijst.
input().split() Splitst de input in een lijst
a[3]           Geeft waarde die op plek 3 van de lijst a staat.    
len(a)         Geeft het aantal elementen in lijst a.

def ja(a):     Start van de functie met de naam ja met inputvariabele a.
return True:   Als het programma op deze regel komt, eindigt de functie. De regel waar de functie aangeroepen werd, krijgt als waarde "True" terug
ord("A")       Geeft de ASCII-waarde van het symbool A.
chr(65)        Geeft het symbool met ASCII-waarde 65.
pow(3,7,13)    Berekent 3^7 modulo 13

Mijn advies is verder om in jouw Python-programma niet te veel op één regel te willen doen. Op papier geldt nog meer als op de computer dat het beter is om meer regels te gebruiken als dat voor jezelf en/of de lezer meer overzicht geeft.

Een laatste advies is om altijd te beginnen met de problemen. Zelfs als je geen idee hebt, krijg je het eerste punt bij een vraag voor het inlezen van de input-variableen in het juiste type (integer, float of string) en dat kun je ook als je nog niet precies weet hoe je de opgave moet oplossen.

We gaan dit oefenen door de les te starten met 5 problemen van niveau 1.1 t/m 1.5 die je op papier gaat programmeren. Over 30 minuten bespreken we de oplossingen.

Opdracht 1: (niveau 1.1)
Schrijf een programma op papier dat drie getallen na elkaar inleest. De output moet het derde getal min de som van de twee andere getallen zijn.
Voorbeeld input:
17
39
100
Voorbeeld output:
44

Je kunt je antwoord controleren door hem over te typen bij de opdracht A leid i bio op Kattis.

Uitwerking:

Je begint met het inlezen van de drie getallen:

a = int(input())
b = int(input())
c = int(input())

Nadat je de getallen ingelezen hebt, doe je het sommetje c-a-b en print dat op het scherm.

print(c-a-b)

Opdracht 2: (niveau 1.2)
Schrijf een programma dat één getal van 1 t/m 12 inleest. Dit staat voor de hoeveelste maand van 2025 het is. Geef als output het aantal dagen dat deze maand duurt.
Voorbeeld input:
2
Voorbeeld output:
28
Hint: April, Juni, September en November hebben 30 dagen.

Je kunt je antwoord controleren door hem over te typen bij de opdracht Dagatal op Kattis.

Uitwerking:

Allereerst moet je natuurlijk het maandnummer inladen.:

maand = int(input())

Vervolgens controleer je eerst of dit de maand februari is (en het antwoord dus 28 is). Als dat niet zo is, controleer je of het een maand met 30 dagen is en als dat ook niet zo is, moet het wel een maand van 31 dagen zijn.

if maand == 2:
    print(28)
elif maand == 4 or maand == 6 or maand == 9 or maand == 11:
    print(30)
else:
    print(31)

Opdracht 3: (niveau 1.3)
Op regel één van het programma staat hoeveel regels met getallen er volgen. Ieder van de volgende getallen staat voor de moeilijkheid van de problemen. Geef als output hoeveel van deze problemen een oneven getal als moeilijkheid hebben.
Voorbeeld input:
3
2
1
5
Voorbeeld output:
2

Je kunt je antwoord controleren door hem over te typen bij de opdracht Call for problems op Kattis.

Uitwerking:

Als eerste zet je de input van de eerste regel in de variabele aantal (die noem ik zo, omdat hierin het aantal opdrachten staat). Vervolgens maak je een variabele aan waarin je gaat tellen hoeveel opdrachten er met een oneven moeilijkheidsgraad zijn. In het begin heb je er nog nul geteld en daarom zet je het getal 0 in deze variabele.

aantal = int(input())
antwoord = 0

Vervolgens laad je de moeilijkheid van ieder probleem in en controleer je steeds of dit aantal oneven is. Voor ieder probleem dat een oneven moeilijkheid heeft, verhoog je het antwoord met één.

for i in range(aantal):
    moeilijkheid = int(input())
    if moeilijkheid % 2 == 1:
        antwoord += 1

Tot slot print je het antwoord.

print(antwoord)

Opdracht 4: (niveau 1.4)
Op regel één van het programma staat hoeveel regels met getallen er volgen. Alle volgende getallen waren oorspronkelijk machten met een ééncijferige exponent waarbij de exponent naar beneden is gevallen. Zo staat 235 voor de som 23^5. De vraag is om de som van de oorspronkelijke machten te geven als output. Het antwoord van de voorbeeldinput is dus 2^3+1^7+4^3+5^2+2^2=102.
Voorbeeld input:
5
23
17
43
52
22
Voorbeeld output:
102

Je kunt je antwoord controleren door hem over te typen bij de opdracht Pot op Kattis.

Uitwerking:

Je kunt op dezelfde manier beginnen als bij het vorige probleem.

aantal = int(input())
antwoord = 0

Nu willen we steeds (dus een for-loop) een getal inlezen. Hiervan is het laatste cijfer de exponent. Deze krijgen we door het getal modulo 10 te doen. Het stuk voor het laatste cijfer is het grondtal. Die krijgen we door het getal te delen door 10 en naar beneden af te ronden. Dat doet de operator //. Vervolgens tellen we \text{grondtal}^{\text{exponent}} op bij ons antwoord.

for i in range(aantal):
    getal = int(input())
    exponent = getal % 10
    grondtal = getal // 10
    antwoord += grondtal ** exponent

Tot slot hoeven we alleen nog het antwoord te printen.

print(antwoord)

Opdracht 5: (niveau 1.5)
Op regel één van het programma staan twee getallen gescheiden door een spatie. Deze getallen staan voor het aantal zijden van de twee dobbelstenen die je hebt. Je gooit met beide dobbelstenen en telt de uitkomsten op. Als output geef je het getal wat de grootste kans heeft om de som van de twee dobbelstenen te zijn. Als dit er meerdere zijn, print je deze één voor één van klein naar groot op verschillende regels.
Voorbeeld input:
6 4
Voorbeeld output:
5
6
7

Je kunt je antwoord controleren door hem over te typen bij de opdracht Dice Cup op Kattis.

Uitwerking:

Met 6 en 4 zien alle combinaties die we kunnen gooien er als volgt uit:

We zien dat 5 t/m 7 op iedere rij voorkomt. Vijf is de eerste, omdat je minstens één groter moet zijn dan het aantal ogen (4) op de viervlakkige dobbelsteen om in de laatste rij voor te komen. Zeven is de laatste omdat je maximaal 1 groter dan het aantal ogen (6) op de zesvlakkige dobbelsteen mag zijn om in de eerste rij voor te komen.

In het algemeen moeten we dus alle getallen printen van het kleinste aantal ogen plus één tot het grootste aantal ogen plus één. Dat is wat de volgende code doet:

getallen = input().split()
a = int(getallen[0])
b = int(getallen[1])
if a < b:
    a,b = b,a
for c in range(b+1,a+2):
    print(c)

Cryptografie les 4: Lijsten

In de afgelopen lessen hebben we de volgende methodes in python geleerd:

a+b            a plus b
a-b            a min b
a*b            a keer b
a**b           a tot de macht b
a/b            a gedeeld door b
a//b           a gedeeld door b naar beneden afgerond op gehelen
a%b            a modulo b (de rest bij deling van a door b)

a == b          Dit test of a en b dezelfde waarde hebben.
a > b           Dit test of a een grotere waarde dan b heeft.
a >= b          Dit test of a groter of gelijk is aan b.
a < b           Dit test of a kleiner dan b is.
a <= b          Dit test of a kleiner of gelijk aan b is.
a != b          Dit test of a ongelijk aan b is.
A or B          Uitkomst is waar als A en/of B waar is.
A and B         Uitkomst is waar als zowel A als B waar is.

print(a)       Dit print a op het scherm van de gebruiker.
print(a,b)     Print a en b met een spatie ertussen.
input()        Dit leest een input in.
range(a,b,c)   Dit maakt een lijst van a tot b met steeds c verschil.
range(a,b)     Dit maakt een lijst van alle getallen vanaf a tot b.
range(b)       Dit maakt een lijst van alle getallen vanaf 0 tot b.
int()          Dit maakt van een waarde een geheel getal.
float()        Dit maakt van een waarde een kommagetal.
str()          Dit maakt van een waarde een stukje tekst.
for a in b:    Dit herhaalt de ingesprongen regels voor iedere waarde a uit de lijst b.
if a:          Als a True is, worden de ingesprongen regels uitgevoerd. 
else:          Als de if False is, worden de ingesprongen regels uitgevoerd.
elif a:        Een else- en if-statement ineen
or and         Je kunt de logische operatoren "or" en "and" ook gebruiken in een loop.

Met deze methodes kun je de meeste belangrijke algoritmes programmeren. Voor veel van deze algoritmes is het echter wel fijn als je een lijst gemakkelijker kan bewerken. Daarom zullen we in deze les leren hoe je in Python met lijsten kunt werken. Voor we daarmee beginnen, starten we al met het nadenken over sorteringsalgoritmes.

Opdracht 1:
Over drie minuten krijg je een geschud spel kaarten zonder jokers. De opdracht is om zo snel mogelijk de kaarten te sorteren. Bovenop moeten alle schoppen komen dan de harten, dan de ruiten en dan de klaveren. Hierbij moeten de kaarten van iedere kleur in de volgorde 2-3-4-5-6-7-8-9-10-Boer-Vrouw-Heer-Aas komen te liggen. Degene die dit als snelste voor elkaar krijgt, wint deze wedstrijd.

Cryptografie les 3: If-statement

In de afgelopen twee lessen heb je de volgende methodes in Python geleerd:

a+b            a plus b
a-b            a min b
a*b            a keer b
a**b           a tot de macht b
a/b            a gedeeld door b
a//b           a gedeeld door b naar beneden afgerond op gehelen
a%b            a modulo b (de rest bij deling van a door b)

a == b         Dit test of a en b dezelfde waarde hebben.
a > b          Dit test of a een grotere waarde dan b heeft.
a >= b         Dit test of a groter of gelijk is aan b.
a < b          Dit test of a kleiner dan b is.
a <= b         Dit test of a kleiner of gelijk aan b is.
a != b         Dit test of a ongelijk aan b is.
A or B         Uitkomst is waar als A en/of B waar is.
A and B        Uitkomst is waar als zowel A als B waar is.

print(a)       Dit print a op het scherm van de gebruiker.
print(a,b)     Print a en b met een spatie ertussen.
input()        Dit leest een input in.
range(a,b,c)   Dit maakt een lijst van a tot b met steeds c verschil.
range(a,b)     Dit maakt een lijst van alle getallen vanaf a tot b.
range(b)       Dit maakt een lijst van alle getallen vanaf 0 tot b.
int()          Dit maakt van een waarde een geheel getal.
float()        Dit maakt van een waarde een kommagetal.
str()          Dit maakt van een waarde een stukje tekst.
for a in b:    Dit herhaalt de ingesprongen regels voor iedere waarde a uit de lijst b.

In deze les gaan we een tweede manier leren om een loop uit te voeren en leren we het if-statement. We beginnen echter met verder te oefenen met de commando’s die we vorige keer geleerd hebben.

Opdracht 1: (moeilijkheid 1.1)
Maak de opdracht Framtidar FIFA op Kattis. Deze opdracht gaat over een spel dat in 2022 is uitgekomen. Als input krijg je op regel 1 hoeveel updates n er van het spel in totaal uitgekomen zijn. Op regel 2 krijg je hoeveel updates k het spel per jaar krijgt. Gegarandeerd wordt dat n een geheel veelvoud van k is. Geef als output welk jaar het op basis van deze gegevens nu is.
Voorbeeldinput:
30
5
Voorbeeldoutput:
2028

Uitwerking:

In deze opdracht moet je de eerste input door de tweede delen en de uitkomst optellen bij 2022. Let er hierbij op dat je // gebruikt, zodat je blijft werken met gehele getallen. Een voorbeeld van een goed antwoord is:

updates = int(input())
perjaar = int(input())
print(2022+updates// perjaar)

Opdracht 2: (moeilijkheid 1.2)
Maak de opdracht Echo Echo Echo op Kattis. Hierin krijg je als input een woord. Als output moet je dit woord op één regel drie keer achter elkaar printen met spaties ertussen.
Voorbeeldinput:
mollen
Voorbeeldoutput:
mollen mollen mollen

Uitwerking:

In deze opdracht kun je gebruik maken van het print(a,b)-commando wat we eind vorige les geleerd hebben. Hiermee worden a en b geprint met een spatie ertussen. In dit geval moet het woord uit de input drie keer geprint worden met spaties ertussen en dat kan dus met print(woord, woord, woord).

woord = input()
print(woord, woord, woord)

Opdracht 3: (moeilijkheid 1.3)
Maak de opdracht Bitte ein Bit op Kattis. Als input krijg je een string die uit alleen enen en nullen bestaat. Als output moet je een cijfer geven dat minstens één keer voorkomt in de string.
Voorbeeldinput:
00000000
Voorbeeldoutput:
0

Uitwerking:

Een manier om dit op te lossen is door altijd het laatste cijfer als antwoord te geven. Hiervoor lees je de input in als getal en krijg je het laatste cijfer door modulo 10 te doen.

getal = int(input())
print(getal % 10)

Opdracht 4: (moeilijkheid 1.4)
Maak de opdracht Diggy Hole op Kattis. Dit probleem gaat over het beroemde raadsel waarbij gegeven wordt dat vier werkers vier uur bezig zijn met het graven van vier gaten. De vraag is dan hoe lang twee werkers bezig zijn met het graven van een half gat. Het antwoord is één uur. De aannamen hierachter zijn dat een werker schijnbaar vier uur nodig heeft voor het graven van één gat en het met twee werkers twee keer zo snel gaat en een half gat de helft van de tijd kost.
In deze puzzel moet je dit probleem oplossen waarbij n werkers h uur doen over x gaten en de vraag is hoeveel uur m werkers over y gaten doen. De input van dit probleem bestaat uit 5 gehele getallen die in de volgorde n, h, x, m en y op vijf regels staan. Als antwoord moet je het aantal uur geven. Dat kan een kommagetal zijn.
Voorbeeldinput:
4
4
4
3
2
Voorbeeldoutput:
2.66666666666666667

Uitwerking:

Ik begin te redeneren met als basis de tijd h uur. Vervolgens beredeneer ik dat als er in plaats van n personen er m zijn het \frac{n}{m} keer zo lang duurt (als je dit moeilijk vindt met variabelen, vul dan getallen in – als je in plaats van n=10 personen je m=5 personen hebt, duurt het \frac{10}{5} keer zo lang). Op dezelfde manier beredeneren we dat als je y gaten wilt graven in plaats van x gaten dit \frac{y}{x} keer zo lang duurt. Hiermee wordt het eindantwoord \frac{n}{m}\cdot \frac{y}{x}\cdot h.

n = int(input())
h = int(input())
x = int(input())
m = int(input())
y = int(input())
print(n/m*y/x*h)

Opdracht 5: (moeilijkheid 1.5)
Maak de opdracht Upprödun op Kattis. In de eerste regel van de input staat een geheel getal n. Dit geeft aan hoeveel klassen er zijn. Op de tweede regel staat een geheel getal m wat aangeeft hoeveel leerlingen er zijn. Als output moet je n regels geven waarbij in totaal m * staan. Deze sterretjes staan voor leerlingen en moet je zo gelijkmatig over de klassen verdelen. Als het niet mooi uitkomt, geef je de laatste klassen een leerling extra.
Voorbeeldinput:
4
14
Voorbeeldoutput:
***
***
****
****

Uitwerking:

We kunnen 10 sterretjes op een regel printen, met print(“*” * 10). Daarbij is het aantal sterretjes op de eerste regel natuurlijk gelijk aan het aantal kinderen gedeeld door het aantal klassen naar beneden afgerond. Dat is kinderen // klassen. Vervolgens halen we het aantal kinderen dat we in de eerste klas gestopt hebben af van het aantal kinderen dat we nog moeten verdelen over de overige klassen. Het aantal klassen dat we nog moeten vullen is ook één kleiner. Daarna kunnen we op dezelfde manier bepalen hoeveel kinderen er in de volgende klas zitten.
Dat levert de volgende code op:

klassen = int(input())
kinderen = int(input())
klassen_over = klassen
kinderen_over = kinderen
for i in range(klassen):
    klasgrootte = (kinderen_over)//klassen_over
    print("*" * klasgrootte)
    kinderen_over -= klasgrootte
    klassen_over -= 1

Cryptografie les 2: For-loop

In de vorige les hebben we de volgende Python-code geleerd:

a+b            a plus b
a-b            a min b
a*b            a keer b
a**b           a tot de macht b
a/b            a gedeeld door b
a//b           a gedeeld door b naar beneden afgerond op gehelen
a%b            a modulo b (de rest bij deling van a door b)
a,b = b, a     Verwisseld a en b

a == b         Dit test of a en b dezelfde waarde hebben.
a > b          Dit test of a een grotere waarde dan b heeft.
a >= b         Dit test of a groter of gelijk is aan b.
a < b          Dit test of a kleiner dan b is.
a <= b         Dit test of a kleiner of gelijk aan b is.
a != b         Dit test of a ongelijk aan b is.
A or B         Uitkomst is waar als A en/of B waar is.
A and B        Uitkomst is waar als zowel A als B waar is.

print()        Dit geeft een output door aan de gebruiker.
input()        Dit leest een input in.
range(a,b,c)   Dit maakt een lijst getallen vanaf a tot b met steeds c verschil.
int()          Dit maakt van een waarde een geheel getal.
float()        Dit maakt van een waarde een kommagetal.
str()          Dit maakt van een waarde een stukje tekst.

Samen met loops en if-statements zijn dit de belangrijkste methodes voor als je wilt leren programmeren. Bij programmeren geldt namelijk hetzelfde als wat Richard Rusczyk beschrijft in deze blogpost bespreekt. Hoe goede programmeur je bent, hangt niet af van hoeveel methodes je kent, maar van hoe handig je deze kunt combineren.

Een mooi voorbeeld hiervan is dat jullie vorige les een getal op de normale manier moesten afronden. Natuurlijk bestaat daarvoor een ingebouwde methode round(). Desondanks heb je er voor het handiger worden als programmeur ook wat aan om te bedenken hoe je zonder deze methode een getal kunt afronden.

Opdracht 1:
Schrijf op papier een programma dat een kommagetal van de user inleest en deze correct afgerond op gehelen aan de gebruiker teruggeeft. Gebruik hierbij alleen de basismethodes en de wiskundige operatoren.

Uitwerking:

Een werkende code staat hieronder. Merk hierbij op dat de functie int automatisch al naar beneden afrondt en het dus niet nodig is om nog de //-operator te gebruiken.

getal = float(input())
afgerond = int(getal + 0.5)
print(afgerond)

Cryptografie les 1: Python

In deze eerste les ga je leren hoe je regels code schrijft. Daarbij maken we gebruik van methodes die programmeurs eerder al voor ons gemaakt hebben. Een van de belangrijkste methodes in Python is print. Het print een uitkomst terug aan de gebruiker (denk aan de output van onze computer). In de volgende opdracht ga je ontdekken wat deze methode zoal doet.

Opdracht 1:
Kopieer de onderstaande code in de Python Playground. Beschrijf met elkaar wat iedere regel doet. Waarschijnlijk moet je bij sommige regels experimenteren met andere getallen om te achterhalen wat die regel doet.

print(2+4)
print(2*4)
print(2**4)
print(2-4)
print(14/4)
print(14//4)
print(14%4)
print("2+4")
print("3"+"2")
print("32"*2)
Uitwerking:
print(2+4)      # Dit print 6, de som van 2 en 4.
print(2*4)      # Dit print 8, het product van 2 en 4.
print(2**4)     # Dit print 16, 2 tot de macht 4.
print(2-4)      # Dit print -2, het verschil 2 min 4.
print(14/4)     # Dit print 3.5, namelijk 14 gedeeld door 4.
print(14//4)    # Dit printt 3, 14 gedeeld door 4 naar beneden afgerond.
print(14%4)     # Dit print 2, de rest van deling van 14 door 4.
print("2+4")    # Dit print 2+4, letterlijk wat er tussen de "" staat.
print("3"+"2")  # Dit print 32, de symbolen 3 en 2 na elkaar.
print("32"*2)   # Dit print 3232, de symbolen 32 twee keer achter elkaar.

Opdracht 2:
a) Maak een account aan op open.kattis.com.
b) Klik rechtsboven op je naam en vervolgens op profile settings. Stel hier vervolgens Python3 als standaard programmeertaal in.

Opdracht 3:
Ga naar de opdracht Hello World! op Kattis. Klik op “Start coding” en schrijf daar een programma dat altijd “Hello World!” als output geeft.

Uitwerking:

Je kunt dit probleem oplossen met de volgende code.

print("Hello World!")

Opdracht 4:
Maak de opdracht Velkomin! op Kattis. De opdracht is om een programma te schrijven dat altijd “VELKOMIN!” als output geeft.

Uitwerking:

Je kunt dit probleem oplossen met de volgende code.

print("VELKOMIN!")

Opdracht 5:
Maak de opdracht Til hamingju op Kattis. De opdracht is om een programma te schrijven dat altijd “TIL HAMINGJU MED AFMAELID FORRITUNARKEPPNI FRAMHALDSSKOLANNA!” als output geeft.

Uitwerking:

Om overtypfouten te voorkomen, kopieer ik zo’n tekst die ik moet plakken altijd in mijn code. Je krijgt dan:

print("TIL HAMINGJU MED AFMAELID FORRITUNARKEPPNI FRAMHALDSSKOLANNA!")

Cryptografie (overzicht module)

Bij cryptografie gaat het om het versleutelen van gegevens, zodat alleen de juiste personen deze gegevens kunnen lezen. Vroeger ging dat met eenvoudige technieken. Zo verschoof Ceasar de letters gewoon drie plekken terug in het alfabet om een bericht te ontcijferen (D wordt A, E wordt B, F wordt C, …, Z wordt W, A wordt X, B wordt Y en C wordt Z).

Opdracht 1:
Het bericht DBIRHQ is versleuteld met de Ceasar-versleuteling. Wat was het oorspronkelijke bericht?

Uitwerking

Er staat GELUKT.

Opdracht 2:
Verzin een aantal toepassingen waarin cryptografie gebruikt wordt.

Uitwerking

Je kunt aan van alles denken. Bijvoorbeeld:

  • Bankpassen
  • WhatsApp
  • Itunes (hoe kun je muziek luisteren zonder dat je de bestanden kunt downloaden)
  • Persoonsgegevens veilig opslaan (zodat jij ze kunt gebruiken, maar anderen die niet kunnen stelen)
  • Inloggen op een website
  • DigiD

Voor de toepassingen die bij het antwoord van opdracht 2 staan voldoen de eenvoudige encrypties als die van Ceasar niet meer. De onderstaande video legt op een begrijpelijke manier uit hoe we dit tegenwoordig wel doen.

In de bovenstaande video wordt al een beetje uitgelegd hoe slim moderne cryptografie in elkaar zit. Het doel van deze module is om te zien hoe we wiskunde kunnen gebruiken om dit soort zaken mogelijk te maken.

Wat we gaan doen in deze module

Moderne cryptografie wordt gedaan met computers. Om hier goed mee te kunnen spelen helpt het om een beetje te kunnen programmeren. In de eerste vier lessen van deze module zullen we daarom met puzzels van de website Kattis leren hoe de basis van programmeren werkt.

Vervolgens zullen we in les 5 t/m 11 de basis van cryptografie leren. Hiervoor zullen we veel eigenschappen van positieve gehele getallen nodig hebben. Het wiskundige vakgebied waar die trucjes uitkomen, heet getaltheorie. Hier zullen we in deze lessen dus ook het een en ander over leren.

Op de toets (die op papier is!) zul je zowel vragen krijgen over programmeren in Python als over cryptografie. Ter voorbereiding hierop kun je de lessen “Voorbereiden Python” en “Voorbereiden cryptografie” maken. Daarnaast zullen we ook nog een les besteden aan het oplossen van een digitale escaperoom die je kunt oplossen met behulp van jouw opgedane kennis over cryptografie.

Ik wens je veel plezier bij deze module!