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

Algoritmar i matematikk

Du bruker algoritmar kvar dag utan å tenkje over det. Når du følgjer ei oppskrift for å lage mat, eller når du sorterer spelkorta dine, utfører du ein algoritme. Ein algoritme er rett og slett ei oppskrift – ein steg-for-steg-plan for å løyse eit problem.

I matematikken har algoritmar blitt brukte i tusenvis av år. Den greske matematikaren Euklid skildra ein algoritme for å finne den største felles divisoren allereie rundt 300 f.Kr. I dag bruker vi datamaskinar til å utføre algoritmar lynraskt.

I dette kapittelet skal du lære:
- Kva ein algoritme er og kva som kjenneteiknar ein god algoritme
- Å lage flytdiagram for å skildre algoritmar visuelt
- Å kode klassiske algoritmar: finne primtal og sortere tal

Algoritme

Ein algoritme er ei nøyaktig, steg-for-steg-skildring av korleis ein løyser eit problem eller utfører ei oppgåve.

Kjenneteikn på ein god algoritme:
1. Endeleg: Han må stoppe etter eit avgrensa tal steg
2. Eintydig: Kvart steg må vere klart og presist, utan rom for tolking
3. Inndata: Han kan ta imot informasjon (input)
4. Utdata: Han gir eit resultat (output)
5. Effektiv: Han bør løyse problemet utan unødvendige steg

Kvardagsdøme: Algoritme for å krysse vegen:
1. Gå til eit gangfelt
2. Sjå til venstre
3. Sjå til høgre
4. Dersom det ikkje kjem bilar: gå over
5. Dersom det kjem bilar: vent, og gå tilbake til steg 2

Flytdiagram

Eit flytdiagram er ei visuell framstilling av ein algoritme. Det bruker ulike former for å vise dei forskjellige delane:

- Oval (avrunda rektangel): Start og slutt
- Rektangel: Ei handling/instruksjon
- Rombe (diamant): Eit val (ja/nei-spørsmål)
- Piler: Viser retninga – kva som skjer neste

Døme: Flytdiagram for «er eit tal partal?»

Start → Les inn talet nn → Er n÷2n \div 2 utan rest? → Ja: «nn er partal» → Slutt
→ Nei: «nn er oddetal» → Slutt

Flytdiagram er nyttige fordi dei gir oss eit oversyn over heile algoritmen før vi byrjar å kode.

✏️Døme 1: Algoritme for å finne det største talet

Skildre ein algoritme som finn det største av tre tal aa, bb og cc.

Algoritme (med ord):
1. Les inn tala aa, bb og cc
2. Set storst = a
3. Dersom b>b > storst, set storst = b
4. Dersom c>c > storst, set 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)

Døme: 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 held fram som 1212
4. Svar: 1212

Denne algoritmen fungerer uansett kva tal vi set inn!

📝Oppgave S1
Sant eller usant?

«Ein algoritme må alltid skrivast som eit dataprogram for å kunne brukast.»

If-setningar (vilkår)

For å lage algoritmar som tek val, treng vi if-setningar. Dei lèt programmet velje ulike vegar basert på eit vilkår:

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

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

Forklaring:
- if sjekkar om vilkåret er sant
- Dersom det er sant, køyrer koden under if
- Dersom det er usant, køyrer koden under else

Vi kan òg sjekke fleire vilkår 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 sjekkar vilkåra frå toppen. Så snart eit vilkår er sant, køyrer den tilhøyrande koden, og resten blir hoppa over.

✏️Døme 2: Sjekke om eit tal er primtal

Skriv ein algoritme som sjekkar om eit gitt tal nn er eit primtal.

Kva er eit primtal? Eit tal større enn 11 som berre er deleleg med 11 og seg sjølv.

Algoritme:
1. Les inn talet nn
2. Dersom n<2n < 2: «Ikkje primtal»
3. For kvart tal ii frå 22 til n1n - 1:
- Dersom nn er deleleg med ii: «Ikkje primtal», stopp
4. Dersom vi kom gjennom heile løkka utan å finne ein delar: «Primtal»

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")

Døme:
- n=7n = 7: Vi sjekkar 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 eit primtal \checkmark
- n=12n = 12: Vi sjekkar 12÷2=612 \div 2 = 6 (rest 00!) – 1212 er ikkje eit primtal

Nøkkelord: break avsluttar løkka med ein gong. Når vi finn ein delar, treng vi ikkje sjekke fleire.

✏️Døme 3: Silen til Eratosthenes

Bruk silen til Eratosthenes til å finne alle primtal opp til 5050.

Silen til Eratosthenes er ein av dei eldste algoritmane vi kjenner til (ca. 240 f.Kr.). Han finn primtal ved å systematisk «sile bort» tal som ikkje er primtal.

Algoritme:
1. Skriv opp alle tal frå 22 til 5050
2. Start med det minste talet (22). Det er eit primtal.
3. Stryk alle multiplum av 22 (bortsett frå 22 sjølv): 4,6,8,10,4, 6, 8, 10, \ldots
4. Gå til neste tal som ikkje er strøke (33). Det er eit primtal.
5. Stryk alle multiplum av 33 (bortsett frå 33 sjølv): 6,9,12,15,6, 9, 12, 15, \ldots
6. Hald fram med 5,7,5, 7, \ldots til du har gått gjennom alle
7. Tala som står att er primtala

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 primtal mellom 22 og 5050.

✏️Døme 4: Sortere tal (boblesortering)

Skildre og programmer ein algoritme som sorterer ei liste med tal frå minst til størst.

Boblesortering er ein enkel sorteringsalgoritme. Han samanliknar to og to naboar og byter dei dersom dei er i feil rekkjefølgje. Vi gjentek prosessen til lista er sortert.

Algoritme:
1. Gå gjennom lista frå start til slutt
2. Samanlikn kvart element med neste element
3. Dersom dei er i feil rekkjefølgje, byt dei
4. Gjenta steg 1–3 til ingen byter trengst

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] → byt: [25,64,12,22,11][25, 64, 12, 22, 11]
- [25,64,12,22,11][25, \mathbf{64}, \mathbf{12}, 22, 11] → byt: [25,12,64,22,11][25, 12, 64, 22, 11]
- [25,12,64,22,11][25, 12, \mathbf{64}, \mathbf{22}, 11] → byt: [25,12,22,64,11][25, 12, 22, 64, 11]
- [25,12,22,64,11][25, 12, 22, \mathbf{64}, \mathbf{11}] → byt: [25,12,22,11,64][25, 12, 22, 11, 64]

Etter første gjennomgang er det største talet (6464) «bobla» til slutten. Vi treng fleire gjennomgangar for å sortere resten.

✏️Døme 5: Algoritmen til Euklid for SFD

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

Algoritmen til Euklid finn den største felles divisoren (SFD) av to tal. Han byggjer 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)

Døme:

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

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

Lage flytdiagram

Eit flytdiagram hjelper oss å planleggje ein algoritme visuelt før vi skriv kode. La oss lage eit flytdiagram for «sjekk om eit tal er deleleg 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 å teikne flytdiagram:
- Start alltid med ein oval «Start»
- Bruk rektangel for handlingar (utrekningar, utskrift)
- Bruk rombar for ja/nei-spørsmål
- Sørg for at alle vegar fører til «Slutt»
- Piler viser retninga gjennom algoritmen

📝Oppgave 1

Forklar med eigne ord kva ein algoritme er. Gi eit døme frå kvardagen som ikkje handlar om datamaskinar.

📝Oppgave 2

Kva skriv dette programmet ut? Er 1515 eit primtal?

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

Teikn eit flytdiagram for ein algoritme som avgjer om eit tal er positivt, negativt eller null.

📝Oppgave 4

Bruk algoritmen til Euklid (med penn og papir) til å finne SFD av følgjande talpar.

a

SFD(24,36)(24, 36)

b

SFD(56,21)(56, 21)

c

SFD(100,75)(100, 75)

Løs oppgavenTren
📝Oppgave 5

Bruk silen til Eratosthenes med penn og papir til å finne alle primtal opp til 3030.

📝Oppgave 6

Skriv eit program som finn alle primtal mellom 11 og 100100 ved å bruke silen til Eratosthenes.

📝Oppgave 7

Vis steg for steg korleis boblesortering sorterer lista [5,3,8,1,4][5, 3, 8, 1, 4].

📝Oppgave 8

Teikn eit flytdiagram for algoritmen til Euklid (finne SFD av to tal). Set deretter om flytdiagrammet til Python-kode.

📝Oppgave 9

Skriv eit program som ber brukaren om eit tal nn og skriv ut alle delarar (faktorane) til nn.

📝Oppgave 10

Lag ein algoritme (med flytdiagram eller pseudokode) og eit Python-program som gjettar eit hemmeleg tal mellom 11 og 100100. Programmet skal bruke «halveringssøk»: det gjettar midt i intervallet og brukaren svarar om det hemmelege talet er høgare, lågare eller rett.

📝Oppgave D1
Drøftingsoppgåve: Boblesortering og binærsøk er begge algoritmar, men dei løyser ulike problem. Forklar med eigne ord skilnaden mellom å sortere og å søkje. Kvifor er det nyttig å sortere ei liste før ein søkjer i ho? Gi eit praktisk døme frå kvardagen der du bruker begge prinsippa.

Oppsummering

Algoritmar


- Ein algoritme er ei steg-for-steg-oppskrift for å løyse eit problem
- Kjenneteikn: endeleg, eintydig, med inndata og utdata
- Vi har brukt algoritmar i matematikken i tusenvis av år

Flytdiagram


- Visuell framstilling av ein algoritme
- Ovalar = start/slutt, rektangel = handlingar, rombar = val
- Nyttig for planlegging og kommunikasjon

Klassiske algoritmar


- Silen til Eratosthenes: Finn primtal ved å stryke multiplum systematisk
- Boblesortering: Sorterer tal ved å byte naboar i feil rekkjefølgje
- Algoritmen til Euklid: Finn største felles divisor (SFD) med gjentatt divisjon
- Binærsøk: Finn eit tal ved å halvere søkjeområdet for kvart steg

If-setningar


- if, elif, else lèt programmet ta val
- Samanlikningsoperatorar: ==, !=, <, >, <=, >=

Lister


- Samling av verdiar: tall = [3, 7, 2, 9]
- Indekserte frå 00: tall[0] gir 33
- len(tall) gir talet på element

Problemløysing


1. Forstå problemet (kva er input og output?)
2. Skildre algoritmen med ord
3. Teikn flytdiagram
4. Skriv kode
5. Test med ulike verdiar
Repetisjonsoppgåver
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.