Tilbake
9.3
Algoritmer i matematikk

9.3 Algoritmer i matematikk

Forstå og lage algoritmer for matematiske problemer.

45 min
10 oppgaver
AlgoritmerSteg-for-stegProblemløsningFlytdiagram
Du leser den tradisjonelle versjonen
Din fremgang i kapitlet
0 / 10 oppgaver
Kapitlets plass i kurset

Algoritmer i matematikk

Du bruker algoritmer hver dag uten å tenke over det. Når du følger en oppskrift for å lage mat, eller når du sorterer spillkortene dine, utfører du en algoritme. En algoritme er rett og slett en oppskrift – en steg-for-steg-plan for å løse et problem.

I matematikken har algoritmer blitt brukt i tusenvis av år. Den greske matematikeren Euklid beskrev en algoritme for å finne den største felles divisoren allerede rundt 300 f.Kr. I dag bruker vi datamaskiner til å utføre algoritmer lynraskt.

I dette kapittelet skal du lære:
- Hva en algoritme er og hva som kjennetegner en god algoritme
- Å lage flytdiagram for å beskrive algoritmer visuelt
- Å kode klassiske algoritmer: finne primtall og sortere tall

Algoritme

En algoritme er en nøyaktig, steg-for-steg-beskrivelse av hvordan man løser et problem eller utfører en oppgave.

Kjennetegn på en god algoritme:
1. Endelig: Den må stoppe etter et begrenset antall steg
2. Entydig: Hvert steg må være klart og presist, uten rom for tolkning
3. Inndata: Den kan ta imot informasjon (input)
4. Utdata: Den gir et resultat (output)
5. Effektiv: Den bør løse problemet uten unødvendige steg

Hverdagseksempel: Algoritme for å krysse veien:
1. Gå til et gangfelt
2. Se til venstre
3. Se til høyre
4. Hvis det ikke kommer biler: gå over
5. Hvis det kommer biler: vent, og gå tilbake til steg 2

Flytdiagram

Et flytdiagram er en visuell fremstilling av en algoritme. Det bruker ulike former for å vise de forskjellige delene:

- Oval (avrundet rektangel): Start og slutt
- Rektangel: En handling/instruksjon
- Rombe (diamant): En beslutning (ja/nei-spørsmål)
- Piler: Viser retningen – hva som skjer neste

Eksempel: Flytdiagram for «er et tall partall?»

Start → Les inn tallet nn → Er n÷2n \div 2 uten rest? → Ja: «nn er partall» → Slutt
→ Nei: «nn er oddetall» → Slutt

Flytdiagram er nyttige fordi de gir oss en oversikt over hele algoritmen før vi begynner å kode.

✏️Eksempel 1: Algoritme for å finne det største tallet

Beskriv en algoritme som finner det største av tre tall aa, bb og cc.

Algoritme (med ord):
1. Les inn tallene aa, bb og cc
2. Sett storst = a
3. Hvis b>b > storst, sett storst = b
4. Hvis c>c > storst, sett storst = c
5. Skriv ut storst

Python-kode:

a = int(input("Skriv inn a: "))
b = int(input("Skriv inn b: "))
c = int(input("Skriv inn c: "))

storst = a
if b > storst:
    storst = b
if c > storst:
    storst = c

print("Det største tallet er:", storst)

Eksempel: Med a=5a = 5, b=12b = 12 og c=8c = 8:
1. storst = 5
2. Er 12>512 > 5? Ja, så storst = 12
3. Er 8>128 > 12? Nei, storst forblir 1212
4. Svar: 1212

Denne algoritmen fungerer uansett hvilke tall vi setter inn!

📝Oppgave S1
Sant eller usant?

«En algoritme må alltid skrives som et dataprogram for å kunne brukes.»

If-setninger (betingelser)

For å lage algoritmer som tar beslutninger, trenger vi if-setninger. De lar programmet velge ulike veier basert på en betingelse:

alder = int(input("Hvor gammel er du? "))

if alder >= 18:
    print("Du er myndig")
else:
    print("Du er ikke myndig ennå")

Forklaring:
- if sjekker om betingelsen er sann
- Hvis den er sann, kjøres koden under if
- Hvis den er usann, kjøres koden under else

Vi kan også sjekke flere betingelser med elif (kort for «else if»):

poeng = int(input("Hvor mange poeng fikk du? "))

if poeng >= 90:
    print("Karakter: 6")
elif poeng >= 75:
    print("Karakter: 5")
elif poeng >= 60:
    print("Karakter: 4")
elif poeng >= 40:
    print("Karakter: 3")
elif poeng >= 25:
    print("Karakter: 2")
else:
    print("Karakter: 1")

Python sjekker betingelsene fra toppen. Så snart en betingelse er sann, kjøres den tilhørende koden, og resten hoppes over.

✏️Eksempel 2: Sjekke om et tall er primtall

Skriv en algoritme som sjekker om et gitt tall nn er et primtall.

Hva er et primtall? Et tall større enn 11 som bare er delelig med 11 og seg selv.

Algoritme:
1. Les inn tallet nn
2. Hvis n<2n < 2: «Ikke primtall»
3. For hvert tall ii fra 22 til n1n - 1:
- Hvis nn er delelig med ii: «Ikke primtall», stopp
4. Hvis vi kom gjennom hele løkken uten å finne en deler: «Primtall»

Python-kode:

n = int(input("Skriv et tall: "))

if n < 2:
    print(n, "er ikke et primtall")
else:
    er_primtall = True
    for i in range(2, n):
        if n % i == 0:
            er_primtall = False
            break  # Trenger ikke sjekke flere

    if er_primtall:
        print(n, "er et primtall")
    else:
        print(n, "er ikke et primtall")

Eksempler:
- n=7n = 7: Vi sjekker 7÷2,7÷3,7÷4,7÷5,7÷67 \div 2, 7 \div 3, 7 \div 4, 7 \div 5, 7 \div 6 – ingen gir rest 00, så 77 er et primtall \checkmark
- n=12n = 12: Vi sjekker 12÷2=612 \div 2 = 6 (rest 00!) – 1212 er ikke et primtall

Nøkkelord: break avslutter løkken umiddelbart. Når vi finner en deler, trenger vi ikke sjekke flere.

✏️Eksempel 3: Eratosthenes' sil

Bruk Eratosthenes' sil til å finne alle primtall opp til 5050.

Eratosthenes' sil er en av de eldste algoritmene vi kjenner til (ca. 240 f.Kr.). Den finner primtall ved å systematisk «sile bort» tall som ikke er primtall.

Algoritme:
1. Skriv opp alle tall fra 22 til 5050
2. Start med det minste tallet (22). Det er et primtall.
3. Stryk alle multipler av 22 (unntatt 22 selv): 4,6,8,10,4, 6, 8, 10, \ldots
4. Gå til neste tall som ikke er strøket (33). Det er et primtall.
5. Stryk alle multipler av 33 (unntatt 33 selv): 6,9,12,15,6, 9, 12, 15, \ldots
6. Fortsett med 5,7,5, 7, \ldots til du har gått gjennom alle
7. Tallene som gjenstår er primtallene

Python-kode:

grense = 50
er_primtall = [True] * (grense + 1)
er_primtall[0] = False
er_primtall[1] = False

for i in range(2, grense + 1):
    if er_primtall[i]:
        # Stryk alle multipler av i
        for j in range(i * 2, grense + 1, i):
            er_primtall[j] = False

# Skriv ut alle primtall
print("Primtall opp til", grense, ":")
for i in range(2, grense + 1):
    if er_primtall[i]:
        print(i, end=" ")

Utskrift:

Primtall opp til 50:
2 3 5 7 11 13 17 19 23 29 31 37 41 43 47

Det er 1515 primtall mellom 22 og 5050.

✏️Eksempel 4: Sortere tall (boblesortering)

Beskriv og programmer en algoritme som sorterer en liste med tall fra minst til størst.

Boblesortering er en enkel sorteringsalgoritme. Den sammenligner to og to naboer og bytter dem hvis de er i feil rekkefølge. Vi gjentar prosessen til listen er sortert.

Algoritme:
1. Gå gjennom listen fra start til slutt
2. Sammenlign hvert element med neste element
3. Hvis de er i feil rekkefølge, bytt dem
4. Gjenta steg 1–3 til ingen bytter trengs

Python-kode:

tall = [64, 25, 12, 22, 11]
print("Før sortering:", tall)

n = len(tall)
for i in range(n - 1):
    for j in range(n - 1 - i):
        if tall[j] > tall[j + 1]:
            # Bytt de to tallene
            tall[j], tall[j + 1] = tall[j + 1], tall[j]

print("Etter sortering:", tall)

Utskrift:

Før sortering: [64, 25, 12, 22, 11]
Etter sortering: [11, 12, 22, 25, 64]

Steg for steg (første gjennomgang):
- [64,25,12,22,11][\mathbf{64}, \mathbf{25}, 12, 22, 11] → bytt: [25,64,12,22,11][25, 64, 12, 22, 11]
- [25,64,12,22,11][25, \mathbf{64}, \mathbf{12}, 22, 11] → bytt: [25,12,64,22,11][25, 12, 64, 22, 11]
- [25,12,64,22,11][25, 12, \mathbf{64}, \mathbf{22}, 11] → bytt: [25,12,22,64,11][25, 12, 22, 64, 11]
- [25,12,22,64,11][25, 12, 22, \mathbf{64}, \mathbf{11}] → bytt: [25,12,22,11,64][25, 12, 22, 11, 64]

Etter første gjennomgang er det største tallet (6464) «boblet» til slutten. Vi trenger flere gjennomganger for å sortere resten.

✏️Eksempel 5: Euklids algoritme for SFD

Bruk Euklids algoritme til å finne den største felles divisoren (SFD) av 4848 og 1818.

Euklids algoritme finner den største felles divisoren (SFD) av to tall. Den er basert på at SFD(a,b)=SFD(b,amodb)\text{SFD}(a, b) = \text{SFD}(b, a \bmod b), der mod\bmod er rest etter divisjon.

Steg for steg:
1. SFD(48,18)\text{SFD}(48, 18): 48mod18=1248 \bmod 18 = 12SFD(18,12)\text{SFD}(18, 12)
2. SFD(18,12)\text{SFD}(18, 12): 18mod12=618 \bmod 12 = 6SFD(12,6)\text{SFD}(12, 6)
3. SFD(12,6)\text{SFD}(12, 6): 12mod6=012 \bmod 6 = 0 → Ferdig! SFD =6= 6

Python-kode:

a = int(input("Skriv inn a: "))
b = int(input("Skriv inn b: "))

# Lagre originalverdiene for utskrift
a_orig, b_orig = a, b

while b != 0:
    rest = a % b
    a = b
    b = rest

print("SFD av", a_orig, "og", b_orig, "er:", a)

Eksempel:

Skriv inn a: 48
Skriv inn b: 18
SFD av 48 og 18 er: 6

Sjekk: Divisorene til 4848 er 1,2,3,4,6,8,12,16,24,481, 2, 3, 4, 6, 8, 12, 16, 24, 48. Divisorene til 1818 er 1,2,3,6,9,181, 2, 3, 6, 9, 18. Den største de har felles er 66 \checkmark

Lage flytdiagram

Et flytdiagram hjelper oss å planlegge en algoritme visuelt før vi skriver kode. La oss lage et flytdiagram for «sjekk om et tall er delelig med 33»:

Flytdiagram (tekstversjon):

    ┌──────────┐
    │  START   │
    └────┬─────┘
         │
    ┌────▼─────┐
    │ Les inn  │
    │ tall n   │
    └────┬─────┘
         │
    ┌────▼─────────┐
    │ Er n % 3 == 0│
    │   (rest=0?)  │
    └──┬────────┬──┘
       │ Ja     │ Nei
  ┌────▼────┐ ┌─▼──────────┐
  │ Skriv:  │ │ Skriv:     │
  │ "n er   │ │ "n er ikke │
  │ delelig │ │ delelig    │
  │ med 3"  │ │ med 3"     │
  └────┬────┘ └─┬──────────┘
       │        │
    ┌──▼────────▼──┐
    │    SLUTT     │
    └──────────────┘

Tips for å tegne flytdiagram:
- Start alltid med en oval «Start»
- Bruk rektangler for handlinger (beregninger, utskrift)
- Bruk romber for ja/nei-spørsmål
- Sørg for at alle veier fører til «Slutt»
- Piler viser retningen gjennom algoritmen

📝Oppgave 1

Forklar med egne ord hva en algoritme er. Gi et eksempel fra hverdagen som ikke handler om datamaskiner.

📝Oppgave 2

Hva skriver dette programmet ut? Er 1515 et primtall?

a
n = 15
er_primtall = True
for i in range(2, n):
    if n % i == 0:
        er_primtall = False
        break

if er_primtall:
    print("Primtall")
else:
    print("Ikke primtall")
Løs oppgavenTren
📝Oppgave 3

Tegn et flytdiagram for en algoritme som avgjør om et tall er positivt, negativt eller null.

📝Oppgave 4

Bruk Euklids algoritme (med penn og papir) til å finne SFD av følgende tallpar.

a

SFD(24,36)(24, 36)

b

SFD(56,21)(56, 21)

c

SFD(100,75)(100, 75)

Løs oppgavenTren
📝Oppgave 5

Bruk Eratosthenes' sil med penn og papir til å finne alle primtall opp til 3030.

📝Oppgave 6

Skriv et program som finner alle primtall mellom 11 og 100100 ved å bruke Eratosthenes' sil.

📝Oppgave 7

Vis steg for steg hvordan boblesortering sorterer listen [5,3,8,1,4][5, 3, 8, 1, 4].

📝Oppgave 8

Tegn et flytdiagram for Euklids algoritme (finne SFD av to tall). Oversett deretter flytdiagrammet til Python-kode.

📝Oppgave 9

Skriv et program som ber brukeren om et tall nn og skriver ut alle delere (faktorene) til nn.

📝Oppgave 10

Lag en algoritme (med flytdiagram eller pseudokode) og et Python-program som gjetter et hemmelig tall mellom 11 og 100100. Programmet skal bruke «halveringssøk»: det gjetter midt i intervallet og brukeren svarer om det hemmelige tallet er høyere, lavere eller riktig.

📝Oppgave D1
Drøftingsoppgave: Boblesortering og binærsøk er begge algoritmer, men de løser ulike problemer. Forklar med egne ord forskjellen mellom å sortere og å søke. Hvorfor er det nyttig å sortere en liste før man søker i den? Gi et praktisk eksempel fra hverdagen der du bruker begge prinsippene.

Oppsummering

Algoritmer


- En algoritme er en steg-for-steg-oppskrift for å løse et problem
- Kjennetegn: endelig, entydig, med inndata og utdata
- Vi har brukt algoritmer i matematikken i tusenvis av år

Flytdiagram


- Visuell fremstilling av en algoritme
- Ovaler = start/slutt, rektangler = handlinger, romber = beslutninger
- Nyttig for planlegging og kommunikasjon

Klassiske algoritmer


- Eratosthenes' sil: Finner primtall ved å stryke multipler systematisk
- Boblesortering: Sorterer tall ved å bytte naboer i feil rekkefølge
- Euklids algoritme: Finner største felles divisor (SFD) med gjentatt divisjon
- Binærsøk: Finner et tall ved å halvere søkeområdet for hvert steg

If-setninger


- if, elif, else lar programmet ta beslutninger
- Sammenligningsoperatorer: ==, !=, <, >, <=, >=

Lister


- Samling av verdier: tall = [3, 7, 2, 9]
- Indeksert fra 00: tall[0] gir 33
- len(tall) gir antall elementer

Problemløsning


1. Forstå problemet (hva er input og output?)
2. Beskriv algoritmen med ord
3. Tegn flytdiagram
4. Skriv kode
5. Test med ulike verdier
Repetisjonsoppgaver
Din fremgang
0deloppgaver0 / 6 oppgaver

Dette kapitlet er skrevet av Anthropics toppmodeller (Claude Opus og Claude Fable) og er foreløpig ikke manuelt gjennomgått — kvalitetskontrollen gjøres av uavhengige KI-agenter, og innmeldte feil rettes fortløpende. Funnet en feil? Meld fra, så retter vi den. Les mer om hvordan innholdet lages.