David Steinsland – informatikkstudent og webutvikler

Innlegg fra kategorien «Generelt»

Java: Primtallgenerering og -faktorisering

| Ingen kommentarer »

Javaprat

Hvordan kan man finne alle primtall mindre enn k? Hvordan sjekke om et gitt heltall n er primtall? Hvordan kan vi primtallsfaktorisere ethvert tall?

Først av alt må man etablere et par matematiske sannheter:

  1. Et primtall er et helt tall større enn 1 som bare er delelig med seg selv og med 1
  2. Et heltall k er også primtall dersom det ikke er delelig med andre primtall mindre enn eller lik kvadratrota til k.
  3. Et hvert heltall større enn 1 kan skrives som produktet av ett eller flere primtall.

Så, hvordan kan man finne et primtall?

  1.  Gitt et heltall k, begynner vi å sjekke om tallet er delelig med det minste primtallet, 2.
  2. Om det er delelig, kan vi trekke konklusjonen om at tallet ikke er primtall.
  3. Dersom det ikke er delelig, går vi videre til 3. Dette gjentar vi for alle primtall \leq \sqrt{k}.
  4. Om ingen tall er delelige, er tallet et primtall.

Vi kan nå begynne å skrive Java-koden vår, og en kan for eksempel ende opp med noe slikt:


public boolean isPrime (int n)
{
	int q = (int) Math.sqrt (n);

	boolean isPrime = true;

	for (int i = 2; i < q; i++)
 	{
		if (n % i == 0)
		{
			return false;
		}
	}

	return true;
}

Det første vi gjør er å ta kvadratrota til heltallet vårt. Deretter kjører vi gjennom alle heltall 2 \leq i \leq \sqrt{n}. Dersom tallet skulle være delelig med et annet, da er det ikke et primtall. Når løkken er gjennomført, vet vi at ingen tall er delelige og at heltallet vårt er primtall.

Primtallsfaktorisering

Ved aritmetikkens fundamentalteorem vet vi at et heltall større enn 1 er enten et primtall, eller et produkt av ett eller flere primtall.

For eksempel er: 7007 = 7 \cdot 7 \cdot 11 \cdot 13


public Integer[] primeFactorization (int a)
{
	ArrayList factors = new ArrayList();

	// fetch primes less than or equal to sqrt(a).
	// if no primes are returned, the number itself is a prime.
	Integer[] primes = primes ((int)Math.sqrt(a));

	int i = 0;
	while (i < primes.length)
 	{
 		int p = primes[i];
 		if (Arrays.asList (primes).contains(a) || isPrime (a))
 		{
 			// the remaining number is now a prime.
 			break;
 		}
 		if (a % p == 0)
 		{
 			// add the prime to our list, and execute the division
 			factors.add (p);
 			a = a / p;
 		}
 		else
 		{
 			// Continue to next prime, if the current one does not
 			// divide
 			i++;
 		}
 	}
 	// The number than remains should be a prime itself.
 	if (a > 1)
	{
		factors.add (a);
	}

	return (Integer[]) factors.toArray(new Integer[factors.size()]);
}

Her ble det kanskje litt komplisert med det første, men prosessen er igrunn ganske enkel:

  1. primes() til å gi oss et int-array med primtall (bruker funksjonen isPrime())
  2. Deretter går vi gjennom alle primtallene, og sjekker om tallet a er delelig med p. Dersom det er delelig, så legger vi primtallet p i samlingen vår og utfører divisjonen \frac{a}{p}.
  3. I neste runde tester vi enten det samme primtallet som i forrige runde, eller så tester vi det neste primtallet. Det er først når det gjeldende primtallet ikke er delelig, at vi går til neste.
  4. Til slutt skal det resterende tallet selv være et primtall, men vi ønsker ikke å inkludere tallet 1 som faktor.

Eksempel

Om vi bruker tallet 7007 om igjen, så vil vi i Java-funksjonen få følgende primtall:

{2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83}. Det er alle primtall som er mindre enn kvadratroten til 7007.

Deretter tester vi først om 2 er delelig med 7007. Det er det ikke, så vi går videre til neste primtall. Det er først når vi kommer til 7 at vi finner et primtall som er delelig med 7007.

Vi legger da til tallet 7 i listen vår, og utfører divisjonen \frac{7007}{7} = 1001. I neste runde tester vi tallet 7 en gang til, og igjen så er det delelig. Vi utfører da \frac{1001}{7} = 143.

Når vi i påfølgende runde tester 7 igjen, finner vi ut at det ikke lengre er delelig. Men det er primtallet 11! Det siste primtallet vil da være 13.

Dette gir oss følgende i resultat: {7, 7, 11, 13} som forteller oss hvilke primtallsfaktorer som gir 7007.

Hjelp Fysikk- og matematikkstudenter til CERN

| Ingen kommentarer »

I fjor arrangerte fysikk-, matematikk- og samfunnsøkonomistudentene ved avgangsklassene på skolen min tur til det internasjonale forskningssenteret CERN. Turen gikk over circa én uke, inkludert en busstur frem/tilbake til Frankrike.

Dette har vi — avgangselevene 2010/2011 — også svært lyst til å gjennomføre. Uheldigvis for oss, har det kommet nye strenge regler som gjør turen svært vanskelig for oss økonomisk sett. Vi får blant annet ikke lov til å samle inn penger til en felles pott, siden «skolen skal være gratis».

Men da vi oppdaget konkurransen Klassekassen, såg vi et glimt av håp. For at vi skal være blant de som kan vinne konkurransen, er vi avhengige av å være blant topp 10. Selv om denne konkurransen trekker til seg endel useriøse bidrag, håper vi at formålet vårt er såpass bra at folk vil stemme oss frem.

Førstepremien er 50,000 NOK, mens andre- og tredjeplass for hver sine 25,000. Uansett hvilke summer vi vinner så kommer dette godt med. Turen er tross alt ikke billig…

Hva du kan gjøre for oss

Klikk deg innom vårt bidrag på Klassekassen og stem via din Facebook-konto. Du kan også stemme per e-post.

Ved å gjøre dette enkle bidraget, så kan du faktisk sørge for at vi kommer oss på tur!

Hvorfor CERN?

Med tanke på forskningen som utføres på CERN innebærer, bidrar dette i stor grad til inspirasjon for videre utdanning. Siden vi er en gruppe realfagstudenter, så kommer flesteparten til å gå videre på universitet på en-eller-en-annen ingeniørlinje. Vi har tidligere vært innom blant annet Universitet i Bergen ved Fysisk Institutt, og det er klart at slike turer bidrar faglig!

Privatisteksamen Informasjonsteknologi (IT-2), del 2

| 26 kommentarer »

I dag — 25. november — var dagen for min aller siste eksamen i IT-programfaget! På mandag hadde jeg skriftlig eksamen og i dag var det tur for muntlig-praktisk i Bergen

Oppgaven

Oppgaven fikk jeg tilsendt per e-post på tirsdag klokken 1500, da det skulle være 48 timer forberedelse.

Last ned PDF kan lastes ned her [53 KB]

Det var oppgitt totalt 3 oppgaver, én til hver hoveddel i faget. Disse er da Multimediautvikling, Programmering og Dokumentasjon.

Jeg hadde fått i oppdrag av et nytt togselskap (Noash) å

  • designe et banner som skulle integreres i applikasjonen, preferabelt med en animasjon
  • programmere et billettsystem, med følgende kriterier:
    • Bruker skal kunne velge avgangssted og reisested (Oslo, Bergen og Voss)
    • Bruker skal kunne velge billettype, herunder Økonomi eller Komfort
    • Bruker skal kunne skrive inn fornavnet og etternavnet
    • Når bruker har trykket på «Bestill», skal det vises en kvittering med: stasjon til og fra, billettype, pris, referansenummer, for- og etternavn

Siste oppgaven handlet om dokumentasjon, og her skulle jeg egentlig bare sørge for at koden min var kommentert godt og at jeg forklarte applikasjonen min for sensor og eksaminator.

Utførelse

Det første jeg gjorde var å designe banneret til den fiktive nettsiden. Størrelsen jeg valgte var 768×150 piksler, som er en uformell standardisert størrelse for banner. Jeg laget meg en liten logo for togselskapet, og tegnet et enkelt vinterlandskap.

Jeg tok meg også friheten til å slenge på noen togskinner, slik at jeg kunne animere et tog som kjørte på dem (i Flash).

Når det kommer til oppgave 2, så løste jeg denne ganske slavisk. Jeg la inn banneret på toppen av applikasjonen, og laget meg en liten innholdsdel under.

Innholdet var et eget MovieClip med to nøkkelbilder:

  • nøkkelbilde én inneholdt skjemaet for bestilling, med de nødvendige komponentene (ComboBox for valg av stasjon, Radiobuttons for valg av billettype, etc.)
  • nøkkelbilde to var tomt, da jeg skulle bruke dette området til å skrive kvitteringen på (dynamisk)

Når jeg hadde fått designet mitt på plass, så gikk jeg løs på programmeringen.  Stasjonene hadde jeg lagret i en matrise, og skrev dem til Comboboxene med DataProvider. Videre så la jeg en lytter på Bestill-knappen, slik at jeg kunne behandle bestillingen.

Jeg ønsker ikke å gå i så utrolig stor detalj, men kan påpeke at jeg la stor vekt på programmeringen og god kommentering (om det er ønskelig kan jeg laste opp eksamensbesvarelsen min).

Eksamen

Jeg hadde 15 minutt til presentasjon av besvarelsen min, og gikk rett på hvorfor jeg valgte den størrelsen på banneret jeg gjorde og hvordan denne ble designet. Den delen gikk rimelig fort unna, da banneret egentlig ble laget på 10 minutter.

Deretter åpnet jeg opp flashprosjektet, og viste frem designet på applikasjonen. Dette var bare for å forberede sensor og eksaminator på det neste jeg skulle ta opp, nemlig kildekoden.

Jeg gikk trinnvis gjennom programmeringen, og forklarte hva den spesifikke koden gjorde og hvorfor jeg hadde valgt en slik fremgangsmåte. Jeg snakket også litt om hvorfor jeg hadde valgt de datatypene jeg gjorde.

Som et siste steg, tok jeg opp applikasjonen og demonstrerte hvordan den fungerte.

Deretter var det tid til spørsmål, og jeg skulle blant annet si noen ord om lytterfunksjoner og hvordan disse fungerte; og utviklingsmodeller og hvordan jeg tilpasset meg dem når jeg jobbet.

Det var faktisk de samme personene som eksaminerte meg i dag som det var under privatisteksamen i IT-1.

Til slutt ble jeg bedt om å gå ut på gangen, mens de bestemte seg for hvilken karakter de skulle gi meg.

Det gikk ikke lange tiden før jeg ble kalt tilbake, hvor jeg fikk beskjed om at dersom de ikke hadde gitt meg toppkarakter, så burde de blitt innlagt på mentalsykehus. Dette betydde altså at jeg hadde fått en sekser, og jeg kunne fornøyd snu nesen min hjemover!

Besvarelse

Her kan du se den endelige besvarelsen min.

Skal du ha eksamen eller vurderer å ta IT-2?

Om det er noe du lurer på, så skriv i kommentarfeltet! Jeg besvarer mer enn gjerne!