Ik had vandaag weer eens een leuke bui, en bedacht: laat ik eens een programmaatje maken om priemgetallen uit te rekenen.
Na enig nadenken kwam ik op de volgende oplossing:
1) Ik maak een bestand waarin ik alle priemgetallen opsla. Daar zet ik alvast de eerste 2 (n.l. 2 en 3) in. Het veld noem ik 'PRIME', en dat is tevens de sleutel van het bestand
2) Ik maak een programma met de volgende code:
-positioneer op het hoogste priemgetal in het bestand
-Lees dit getal en stop het resultaat in N
-Oneindige loop
| -Tel 2 op bij N (we slaan de even getallen over, want dat zijn
| nooit priemgetallen)
| -positioneer bestand op het 2e priemgetal
| (ik sla 2 als deler over omdat ik toch alleen maar oneven getallen test)
| -Zet variable D op 1
| -Zet variable P op N
| -Doe zolang D niet 0 is en P groter is dan PRIME
| |(als D=0 dan is het getal deelbaar; als het resultaat P groter wordt
| | dan de deler (PRIME) dan heeft verder testen ook geen zin)
| | -Lees priemgetal uit bestand
| | -Deel N door PRIME en stop het resultaat in P
| | -Stop het 'overblijfsel' (remainder) in D
| -Einde doe-loop
| -Als D niet 0 is
| | -Stop N in PRIME
| | -Voeg toe aan bestand
| -Einde Als
-Einde oneindige loop (
)
In dit programma zijn alle variabelen (zeer grote) integers zonder decimalen.
Ik heb dit dus geprogrammeerd in RPG op een AS/400 (720 - single processor), en binnen 2 minuten had ik al alle priemgetallen tussen de 0 en 250.000 (dat zijn er 22.044).
Nu is een AS/400 geen rekenwonder, maar ik vond het toch best snel gaan.
Ook weet ik dat er betere rekenmethoden zijn waarbij je minder hoeft te testen, maar ik wou een zo kort mogelijk programma hebben.
In DDS en RPG ziet dit er als volgt uit (voor de AS/400 freaks):
DDS:
RPG:
Helaas gebruikt GoT voor de code-tag geen courier, en type ik dit nu uit mijn hoofd, dus de positionering laat te wensen over...
Nu ben ik benieuwd of iemand dit kan porten naar een pc-programma, en eens wil kijken hoe snel een pc erover doet om de eerste 22.000 priemgetallen te bereken. Wie durft?
Verders is mijn keuze om dit in DPC te posten bewust:
1) PRIME is een bestaand distributed project (hoewel los hiervan)
2) Wij houden er niet van onze processor niks te laten doen
3) Ook hier zwerven programmeurs rond
4) Misschien kunnen wij ooit zelf eens een mooie client bakken en er een distributed project van maken (al is het alleen maar om geldprijzen te winnen) - de meeste clients van bestaande projecten zijn nl nogal brak
5) Anders wordt 'ie toch wel gemoved naar DPC (toch?)
Na enig nadenken kwam ik op de volgende oplossing:
1) Ik maak een bestand waarin ik alle priemgetallen opsla. Daar zet ik alvast de eerste 2 (n.l. 2 en 3) in. Het veld noem ik 'PRIME', en dat is tevens de sleutel van het bestand
2) Ik maak een programma met de volgende code:
-positioneer op het hoogste priemgetal in het bestand
-Lees dit getal en stop het resultaat in N
-Oneindige loop
| -Tel 2 op bij N (we slaan de even getallen over, want dat zijn
| nooit priemgetallen)
| -positioneer bestand op het 2e priemgetal
| (ik sla 2 als deler over omdat ik toch alleen maar oneven getallen test)
| -Zet variable D op 1
| -Zet variable P op N
| -Doe zolang D niet 0 is en P groter is dan PRIME
| |(als D=0 dan is het getal deelbaar; als het resultaat P groter wordt
| | dan de deler (PRIME) dan heeft verder testen ook geen zin)
| | -Lees priemgetal uit bestand
| | -Deel N door PRIME en stop het resultaat in P
| | -Stop het 'overblijfsel' (remainder) in D
| -Einde doe-loop
| -Als D niet 0 is
| | -Stop N in PRIME
| | -Voeg toe aan bestand
| -Einde Als
-Einde oneindige loop (
In dit programma zijn alle variabelen (zeer grote) integers zonder decimalen.
Ik heb dit dus geprogrammeerd in RPG op een AS/400 (720 - single processor), en binnen 2 minuten had ik al alle priemgetallen tussen de 0 en 250.000 (dat zijn er 22.044).
Nu is een AS/400 geen rekenwonder, maar ik vond het toch best snel gaan.
Ook weet ik dat er betere rekenmethoden zijn waarbij je minder hoeft te testen, maar ik wou een zo kort mogelijk programma hebben.
In DDS en RPG ziet dit er als volgt uit (voor de AS/400 freaks):
DDS:
code:
1
2
3
4
| A UNIQUE
A R PRREC
A PRIME 15P 0 COLHDG('Priem getal')
A K PRIME |
RPG:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
| FPRIMEF IF E K DISK A C *HIVAL SETGTPRIMEF C READPPRIMEF 03 C Z-ADDPRIME N 150 C TAG LOOP C ADD 2 N C 2 SETGTPRIMEF C Z-ADD1 D 150 C Z-ADDN P 150 C DIFF DOWNE0 C P ANDGTPRIME C READ PRIMEF 03 C N DIV PRIME P C MVR D C ENDDO C D IFNE 0 C Z-ADDN PRIME C WRITE PRREC C ENDIF C GOTO LOOP C SETON LR |
Helaas gebruikt GoT voor de code-tag geen courier, en type ik dit nu uit mijn hoofd, dus de positionering laat te wensen over...
Nu ben ik benieuwd of iemand dit kan porten naar een pc-programma, en eens wil kijken hoe snel een pc erover doet om de eerste 22.000 priemgetallen te bereken. Wie durft?
Verders is mijn keuze om dit in DPC te posten bewust:
1) PRIME is een bestaand distributed project (hoewel los hiervan)
2) Wij houden er niet van onze processor niks te laten doen
3) Ook hier zwerven programmeurs rond
4) Misschien kunnen wij ooit zelf eens een mooie client bakken en er een distributed project van maken (al is het alleen maar om geldprijzen te winnen) - de meeste clients van bestaande projecten zijn nl nogal brak
5) Anders wordt 'ie toch wel gemoved naar DPC (toch?)
Intentionally left blank