Programmering - maraton

Her kan du stille spørsmål vedrørende problemer og oppgaver i matematikk for videregående skole og oppover på høyskolenivå. Alle som føler trangen er velkommen til å svare.

Moderatorer: Aleks855, Gustav, Nebuchadnezzar, Janhaa, DennisChristensen, Emilga

Svar
Mattebruker
Cauchy
Cauchy
Innlegg: 208
Registrert: 26/02-2021 21:28

Viser til tidlegare ulikheit-maraton. Dette "løpet" gjekk over fleire månader før interessa slokna.
Inviterer hermed til eit tilsvarande løp i programmering.
Startar " kronerullinga" med å presentere dette problemet:
Lag eit dataprogram i Python-kode som plukkar ut og skriv ut alle primtal mindre enn 100.

Programvare: https://trinket.io/python3
Aleks855
Rasch
Rasch
Innlegg: 6746
Registrert: 19/03-2011 15:19
Sted: Trondheim
Kontakt:

Fint tiltak! Jeg hiver meg på.

Primtallsarbeid er løselig på mange måter, men jeg går for en forholdsvis enkel en. Jeg lager en funksjon som tar et heltall og sjekker at ingen tall under det, deler det.

Det finnes gradvis mindre naive måter å gjøre det på.

For $n$, sjekk at $2, 3, 4, \ldots, n-1$ ikke deler det. Dette er den enkleste å skrive, men vi sjekker veldig mange tall som ikke har mulighet til å dele $n$. Eksempelvis sjekker vi tall som er større enn $\frac n2$.

Vi kan begrense søket til tall mindre enn $\sqrt n$, siden hvis vi ikke har funnet noen faktorer før det, så vil vi heller ikke finne par-faktoren som må være større.

Videre vil vi helst ikke sjekke alle partall. Så fort vi har sjekket at 2 ikke deler $n$, så vet vi at ingen andre partall deler $n$ heller. Så vi sjekker i stedet $3, 5, 7, \ldots$.

Det finnes enda bedre måter. For eksempel, hvis 3 ikke er en faktor, så er heller ikke $9, 15, 21 \ldots$ faktorer. Men det er her jeg velger å gå for lettvint kode fremfor maksimal optimalisering. Dersom måltallet ikke hadde vært 100, men $10^{10}$ så hadde jeg nok valgt annerledes.

Kode: Velg alt

import math


def isPrime(n):
  if n == 2:
    return True
  if n % 2 == 0:
    return False

  for i in range(3, math.ceil(math.sqrt(n) + 1), 2):
    if n % i == 0:
        return False
  return True


print([n for n in range(2, 100) if isPrime(n)])

Oppfølger: Finn summen av arealene til sirklene med radius $1, 2, 3, \ldots, 100$. Avrund svaret til nærmeste heltall.
Bilde
Mattebruker
Cauchy
Cauchy
Innlegg: 208
Registrert: 26/02-2021 21:28

Problem: Lage eit dataprogram i Python-kode som reknar ut summen av areala til alle sirklar med radius f.o.m. r = 1 t.o.m. r = 100

Dette er eit relativt greitt problem utan vilkårtest ( ingen if-setningar ). Lagar ei FOR-løkke og summerer:

1) areal = 0 ; sum = 0 ; pi = 3.14
2) for i in range(1 , 101 ):
3) sum = sum + i*i
4) areal = sum * pi
5) print( " Samla areal: " , round(areal ) )

P.S. Greidde ikkje å kopiere programmet eg køyrde på PC-en. Skriv difor instruksjonane " for hand".

Oppfølgar: Legge inn n tal( element) i ei liste og sortere desse etter stigande verdi.
Aleks855
Rasch
Rasch
Innlegg: 6746
Registrert: 19/03-2011 15:19
Sted: Trondheim
Kontakt:

Mattebruker skrev: 21/05-2022 21:45 Problem: Lage eit dataprogram i Python-kode som reknar ut summen av areala til alle sirklar med radius f.o.m. r = 1 t.o.m. r = 100

Dette er eit relativt greitt problem utan vilkårtest ( ingen if-setningar ). Lagar ei FOR-løkke og summerer:

1) areal = 0 ; sum = 0 ; pi = 3.14
2) for i in range(1 , 101 ):
3) sum = sum + i*i
4) areal = sum * pi
5) print( " Samla areal: " , round(areal ) )
Når jeg kjører dette så får jeg verdien $1062419$ men det egentlige svaret er $1062958$.

Feilen er funnet, men feilsøking er en enormt viktig del av det å skrive kode, så du må få sjansen til å rette det opp :)
Bilde
Mattebruker
Cauchy
Cauchy
Innlegg: 208
Registrert: 26/02-2021 21:28

Kanskje ligg feilen her ? pi = 3.141592654 ( 9 siffer bak desimalkomma )
Aleks855
Rasch
Rasch
Innlegg: 6746
Registrert: 19/03-2011 15:19
Sted: Trondheim
Kontakt:

Det stemmer. En avrundingsfeil så tidlig i utregninga får en eksplosiv effekt når vi multipliserer det med så store tall som her.

Python har et innebygd "math"-bibliotek som blant annet har diverse viktige konstanter tilgjengelig.

Kode: Velg alt

from math import pi
lar deg hente denne, og deretter bare bruke "pi" som du får derfra.
Bilde
Svar