[Java] Priemgetallen genereren

Pagina: 1
Acties:
  • 2.484 views sinds 30-01-2008

  • MP83
  • Registratie: Januari 2000
  • Laatst online: 31-01 18:11
Ik wil graag de priemgetallen genereren tussen 0 en 20000 en dan laten zien. Het laten zien zal wel lukken maar hoe bereken ik ze :?

Ik heb de search al gebruikt maar niet echt iets kunnen vinden. Het moet wel heel basisch zijn, doe het namelijk pas 3 weken :P

Alvast bedankt! :)

Verwijderd

Op dinsdag 18 september 2001 21:09 schreef Mr.Blonde het volgende:
Ik wil graag de priemgetallen genereren tussen 0 en 20000 en dan laten zien. Het laten zien zal wel lukken maar hoe bereken ik ze :?

Ik heb de search al gebruikt maar niet echt iets kunnen vinden. Het moet wel heel basisch zijn, doe het namelijk pas 3 weken :P

Alvast bedankt! :)
http://www.win.tue.nl/~jessers/aansluiting/priemgetallen.htm

Verwijderd

Je weet toch zeker wat een priemgetal is?

Als je weet wat het is, dan kun je dus ook elk getal tussen 0 en 200.000 controleren erop.

Als het een priemgetal is, print het dan. Is het dat niet, print het dan niet.

Sim-pel.

  • MP83
  • Registratie: Januari 2000
  • Laatst online: 31-01 18:11
thx voor alle links.... :)

Ik weet ook wel wat een priemgetal is maar kan alleen geen simpele rekenregel verzinnen om ze uit te rekenen en weg te schrijven

Verwijderd

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
public class Primes
{
  public static void main(String[] args)
  {
    int nValues = 20000;
    boolean isPrime = true;
    for (int i = 2; i <= nValues; i++)
    {
    isPrime=true;
    for(int j = 2; j< i; j++)
    {
      if (i % j == 0)
      {
        isPrime = false;
        break;
      }
    }
    if(isPrime)
      System.out.println(i);
    }
  }
}

Dit is misschien een oplossing.

  • MP83
  • Registratie: Januari 2000
  • Laatst online: 31-01 18:11
thx x-terior.... :) Ik ken alleen dat boolean gebeuren niet, de rest kan ik redelijk volgen...iemand die dat kan uitleggen of is GoT daar niet de plaats voor :P

Alvast bedankt!

  • Killemov
  • Registratie: Januari 2000
  • Laatst online: 17-08 12:12

Killemov

Ik zoek nog een mooi icooi =)

Op dinsdag 18 september 2001 21:20 schreef Mr.Blonde het volgende:
thx voor alle links.... :)

Ik weet ook wel wat een priemgetal is maar kan alleen geen simpele rekenregel verzinnen om ze uit te rekenen en weg te schrijven
brute force: (voor als je ze snel wilt hebben ...)
code:
1
2
3
4
5
6
7
8
9
10
11
for (i = 1; i <= 200000; i++)
{
   boolean isprime = true;
   j = 2;
   while (j < i && isprime)
   {
    if (j%i == 0) isprime = false;
    j++;
   }
   if (isprime) println(i);
}

uiteraard zijn er veel snellere manieren ...

Hey ... maar dan heb je ook wat!


  • LuCarD
  • Registratie: Januari 2000
  • Niet online

LuCarD

Certified BUFH

Op dinsdag 18 september 2001 21:47 schreef Killemov het volgende:

[..]

brute force: (voor als je ze snel wilt hebben ...)
code:
1
2
3
4
5
6
7
8
9
10
11
for (i = 1; i <= 200000; i++)
{
   boolean isprime = true;
   j = 2;
   while (j < i && isprime)
   {
    if (j%i == 0) isprime = false;
    j++;
   }
   if (isprime) println(i);
}

uiteraard zijn er veel snellere manieren ...
Zoals? :)

enige versnelling die ik zie is
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
for (i = 1; i <= 200000; i++)
{
   boolean isprime = true;
   j = 2;
   if (j%i == 0) isprime = false;
   j++;
   while (j < i && isprime)
   {
    if (j%i == 0) isprime = false;
    j+=2; // Voor de niet oplettende personen alle even getallen zijn per definitie geen priemgetallen 
   }
   if (isprime) println(i);
}

* LuCarD is toevallig bezig met een c variant en een PHP variant... alleen werkt bij mij de modulo niet in c? bestaat die niet? of doe ik wat fout? (waarschijnlijk het laatste :P )

Programmer - an organism that turns coffee into software.


Verwijderd

Ok, ben in actieve bui.... (laatste keer is eel erg lang geleden ;) ;) )

Een boolean variabele kan of true of false zijn. Dat zijn de enigste 2 mogelijkheden. In dit voorbeeld wordt ie gebruikt om te testen of de waarde i inderdaad een priem is.
Hij gaat namelijk een hele hoop waarden na.

  • Killemov
  • Registratie: Januari 2000
  • Laatst online: 17-08 12:12

Killemov

Ik zoek nog een mooi icooi =)

Op dinsdag 18 september 2001 21:38 schreef Mr.Blonde het volgende:
thx x-terior.... :) Ik ken alleen dat boolean gebeuren niet, de rest kan ik redelijk volgen...iemand die dat kan uitleggen of is GoT daar niet de plaats voor :P

Alvast bedankt!
Sorry ?!?!?! Je kent geen booleans ?!?!?!

Zucht. Een boolean kan 2 waarden hebben nl true en false.

voorbeeld:
code:
1
2
3
4
5
6
7
8
boolean vergelijking = x < y;

x y vergelijking
1 0 false
0 1 true

maar dit kan natuurlijk ook:
boolean vergelijking = a && b || c && d;

wat je wel eens ziet in code is:
code:
1
2
3
4
if (eenboolean == true)
{
...
}

En da's FOUT!

het moet zijn:
code:
1
2
3
4
if (eenboolean)
{
...
}

kijk o.a. eens hier: http://java.sun.com/docs/books/tutorial/java/nutsandbolts/relational.html

Hey ... maar dan heb je ook wat!


  • MP83
  • Registratie: Januari 2000
  • Laatst online: 31-01 18:11
Bedankt voor alle uitleg.....jah, ik weet het, weet nog niet veel op dit gebied maar hoop het toch allemaal onder de knie te krijgen :P

  • Killemov
  • Registratie: Januari 2000
  • Laatst online: 17-08 12:12

Killemov

Ik zoek nog een mooi icooi =)

Op dinsdag 18 september 2001 21:51 schreef LuCarD het volgende:

[..]

Zoals? :)

enige versnelling die ik zie is
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
for (i = 1; i <= 200000; i++)
{
   boolean isprime = true;
   j = 2;
   if (j%i == 0) isprime = false;
   j++;
   while (j < i && isprime)
   {
    if (j%i == 0) isprime = false;
    j+=2; // Voor de niet oplettende personen alle even getallen zijn per definitie geen priemgetallen 
   }
   if (isprime) println(i);
}

* LuCarD is toevallig bezig met een c variant en een PHP variant... alleen werkt bij mij de modulo niet in c? bestaat die niet? of doe ik wat fout? (waarschijnlijk het laatste :P )
Hmmm ja, die +=2 is daarvan slechts het begin.
Er is een complexe methode waarbij als je een priem hebt gevonden deze elimineert van een tabel met stapgrootten.

p=2, => elimineer alle veelvouden van 2
p=3, => elimineer alle veelvouden van 3,
p=5, => ...

dus 4, 6, 8 en 9 worden dan niet meer geevalueerd en wat je overhoud zijn per definitie priemgetallen.

Hey ... maar dan heb je ook wat!


Verwijderd

Nog sneller is eerder gevonden priemgetallen in een array te zetten en alleen met die getallen proberen een hoger priemgetal te vinden.....

  • brammetje
  • Registratie: Oktober 2000
  • Laatst online: 12-01-2025
Op dinsdag 18 september 2001 21:51 schreef LuCarD het volgende:

[..]

Zoals? :)

enige versnelling die ik zie is
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
for (i = 1; i <= 200000; i++)
{
   boolean isprime = true;
   j = 2;
   if (j%i == 0) isprime = false;
   j++;
   while (j < i && isprime)
   {
    if (j%i == 0) isprime = false;
    j+=2; // Voor de niet oplettende personen alle even getallen zijn per definitie geen priemgetallen 
   }
   if (isprime) println(i);
}

* LuCarD is toevallig bezig met een c variant en een PHP variant... alleen werkt bij mij de modulo niet in c? bestaat die niet? of doe ik wat fout? (waarschijnlijk het laatste :P )
is modulo in C niet 'mod' ?
disclaimer: ik kan/ken geen C

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 29-08 03:21

.oisyn

Moderator Devschuur®

Demotivational Speaker

je hoeft ook maar te testen tot de wortel van het getal dat je wilt testen, dus zo:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
for (i = 1; i <= 200000; i++)
{
   boolean isprime = true;
   j = 2;
   if (j%i == 0) isprime = false;
   int max = (int)Math.sqrt (i);
   j++;
   while (j < max && isprime)
   {
    if (j%i == 0) isprime = false;
    j+=2; // Voor de niet oplettende personen alle even getallen zijn per definitie geen priemgetallen 
   }
   if (isprime) println(i);
}

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 29-08 03:21

.oisyn

Moderator Devschuur®

Demotivational Speaker

Op dinsdag 18 september 2001 22:39 schreef PlayR het volgende:

[..]

is modulo in C niet 'mod' ?
disclaimer: ik kan/ken geen C
dit is java hoor :), maar zowel in java als in c (is toch dezelfde syntax) is het %

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 06-11-2025
Hier gaat het ook over priemgetallen (staat ook een Java implementatie, weet niet of hij goed is).

[topic=231602/1/25]

Blog, Stratego/XT: Program Transformation, SDF: Syntax Definition, Nix: Software Deployment


  • TlighT
  • Registratie: Mei 2000
  • Laatst online: 22-03 10:40
Op dinsdag 18 september 2001 21:59 schreef Killemov het volgende:

wat je wel eens ziet in code is:
code:
1
2
3
4
if (eenboolean == true)
{
...
}

En da's FOUT!

het moet zijn:
code:
1
2
3
4
if (eenboolean)
{
...
}
Hoezo fout? De expressie 'eenboolean == true' geeft gewoon een boolean als resultaat net zoals 'eenboolean'. Dus allebei even goed als expressie in een if-statement. Ik gebruik trouwens altijd de 1e optie, dat vind ik persoonlijk duidelijkere code.

  • Killemov
  • Registratie: Januari 2000
  • Laatst online: 17-08 12:12

Killemov

Ik zoek nog een mooi icooi =)

Hey, van mij mag iedereen foute code proggen, zolang ik er maar niet in hoef te roeren. :) (Zeker (ook (een) haakjesfanaat)) ? >:)

En (eenboolaan == true) is echt fout omdat het echt een compleet nutteloze toevoeging is. Theoretisch: De uitkomst van deze gehele booleaanse expressie is enkel en alleen afhankelijk van eenboolean. Praktisch: == true wordt direct weggeggooid door de compiler.

Hey ... maar dan heb je ook wat!


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 29-08 03:21

.oisyn

Moderator Devschuur®

Demotivational Speaker

Op dinsdag 18 september 2001 23:46 schreef Killemov het volgende:
Hey, van mij mag iedereen foute code proggen, zolang ik er maar niet in hoef te roeren. :) (Zeker (ook (een) haakjesfanaat)) ? >:)

En (eenboolaan == true) is echt fout omdat het echt een compleet nutteloze toevoeging is. Theoretisch: De uitkomst van deze gehele booleaanse expressie is enkel en alleen afhankelijk van eenboolean. Praktisch: == true wordt direct weggeggooid door de compiler.
oh en omdat het weggegooid wordt door de compiler hoef je het zeker ook niet op te schrijven, zelfs als het de leesbaarheid bevordert? :?

en een compleet nutteloze toevoeging zoals jij dat noemt is niet per definitie FOUT, als iemand het prettig vindt om het erbij te zetten moet ie dat zelf weten, maar dan is het niet fout. Het is pas fout als het resultaat verkeerd is

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • Killemov
  • Registratie: Januari 2000
  • Laatst online: 17-08 12:12

Killemov

Ik zoek nog een mooi icooi =)

Ehm mr. optimizer@work ... bestudeer jij de theorie van de booleaanse algebra nog maar een keer ... Nogmaals, iedereen mag van mij proggen zoals ie wil, zolang ik er maar niet in hoef te duiken. (Spaghetti Bolognese anyone?)

Over leesbaarheid valt ook zeker te twisten.
code:
1
if (isprime)

vind ik zeker niet minder leesbaar dan
code:
1
if (isprime == true)

.

Hey ... maar dan heb je ook wat!


  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 06-11-2025
Killemov: Ehm mr. optimizer@work ... bestudeer jij de theorie van de booleaanse algebra nog maar een keer ...
Er is maar weinig mis met de redenering van optimizer@work. Het is een feit dat beide oplossingen correct zijn en tot hetzelfde resultaat leiden. Dat jij die == true niet mooi vind, betekent niet dat het fout is.

* als b == true:
b == true;
(b == true) == true;

* als b == false:
b == false;
(b == true) == false;

Overigens ben ik het wel met je eens dat if(.....) zonder == true prettiger leest bij een goede keuze van methode en variabele namen :) .

Blog, Stratego/XT: Program Transformation, SDF: Syntax Definition, Nix: Software Deployment


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 29-08 03:21

.oisyn

Moderator Devschuur®

Demotivational Speaker

Op woensdag 19 september 2001 00:01 schreef Killemov het volgende:
Ehm mr. optimizer@work ... bestudeer jij de theorie van de booleaanse algebra nog maar een keer ...
ik hoef m niet te bestuderen, JIJ zegt dat het fout is terwijl het helemaal niet fout is :z
Nogmaals, iedereen mag van mij proggen zoals ie wil, zolang ik er maar niet in hoef te duiken. (Spaghetti Bolognese anyone?)
JUIST, maar omdat iemand het anders wilt zoals jij het mooi vindt betekent het nog niet dat het fout is (en dit zorgt echt totaal niet voor spaghetti code natuurlijk)
Over leesbaarheid valt ook zeker te twisten.
code:
1
if (isprime)

vind ik zeker niet minder leesbaar dan
code:
1
if (isprime == true)
dat vind ik ook niet, en ik gebruik ook de manier die jij hanteert (dus if (waarde) en if (!waarde)), maar dan is die andere manier nog niet gelijk fout


oh en mijn nick is OiSyN :)

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 29-08 03:21

.oisyn

Moderator Devschuur®

Demotivational Speaker

al schrijf je
code:
1
2
3
4
if (waarde == true == true == true == false == true == true == false == true)
{
    ...
}

dan is het NOG niet fout :)

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

Ik zie een fout die de meesten nog niet opgevallen is...

Er wordt begonnen met j=2;

en vervolgens j+=2 gedaan...

Oftewel, je zult geen priem getallen vinden ;)

Wat ik overigens ooit es gemaakt heb, is een vector met allemaal priemgetallen.
Die werd dan aangevuld met een nieuw gevonden getal.
Het voordeel is, dat je een te controleren getal alleen maar door alle (tot en met de laatste net voor de wortel) voorgaande priemgetallen deelt, ipv ook nog es getallen die niet eens priem zijn.

In het begin van de opbouw is het vrij sloom, maar ik bereikte er toch vrij snel enkele miljoenen mee ;)

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 29-08 03:21

.oisyn

Moderator Devschuur®

Demotivational Speaker

Op woensdag 19 september 2001 00:26 schreef ACM het volgende:
Ik zie een fout die de meesten nog niet opgevallen is...

Er wordt begonnen met j=2;

en vervolgens j+=2 gedaan...

Oftewel, je zult geen priem getallen vinden ;)
je leest niet goed :)

eerst wordt er idd j=2 gedaan, dan wordt er getest met die j, dan wordt j 1 verhoogd (j++), en DAARNA komt de loop pas :+

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

Op woensdag 19 september 2001 00:28 schreef OiSyN het volgende:
je leest niet goed :)

eerst wordt er idd j=2 gedaan, dan wordt er getest met die j, dan wordt j 1 verhoogd (j++), en DAARNA komt de loop pas :+
Kun je nagaan wat voor brakke code jullie schrijven :+

Het is zowiezo b*llshit om die 2 apart te checken, je weet toch wel dat dat priem is ;)

  • tomato
  • Registratie: November 1999
  • Niet online
Zoek eens iets op over de zeef van Eratostenes op te zoeken, dan begrijp je ook wat Killemov bedoelt met het elimineren van de veelvouden van elk gevonden priemgetal.
Je hoeft inderdaad ook maar tot de wortel van het getal te zoeken, want ook al is er een deler groter dan die wortel, deze heeft altijd een andere deler kleiner dan die wortel nodig (die je dan dus al gevonden zou hebben).
Verder beetje slim boekhouden kan het ook nog wat versnellen en als je echt snel wilt moet je maar naar andere methoden op zoek gaan en/of nadenken welke bewerkingen voor een computer veel tijd kosten en welke niet (denk aan dingen als delingen door 2, shifts).

Verwijderd

Via de andere topic (over C <-> VB snelheid) kom ik op dit algoritme, java-vertaling geleend van mbravenboer, thanks!

Met de volgende aanpassingen:
- array is nu boolean-array! De index geeft al aan, om welk (vermeend) priemgetal het gaat.
- De waarden in het array worden hooguit eenmaal gereset, er wordt telkens gechecked of het wel nodig is de boolean te schrijven, de performance-winst die hierdoor wordt geboekt is zeer aanzienlijk!
Deze java-code executeert in 2.6 seconde op een Duron@933MHz, Java 1.4.0 (beta2), compiler-optie -O .

[blockquote]
public class Priem
{
public static void main(String[] ps)
{
final int MAX = 10000000;
boolean[] numbers = new boolean[MAX];
int x;
int y;
long millis = System.currentTimeMillis();
for(x=0;x<MAX;x++) numbers[x] = true;

for(x=2;x<MAX;x++)
{
if(numbers[x])
{
for (y = 2*x; y < MAX; y+=x )
{
if (numbers[y]) numbers[y] = false;
}
}
}
System.out.println("Milli seconds: " + (System.currentTimeMillis() - millis));
// Print some of the first results to check if algorithm works
for (int j=0;j<100;j++)
{
if (numbers[j]) System.out.print(" "+j);
}
}
}
[/blockquote]

Verwijderd

Nu 2.5 seconde, sneaky java-truukje gebruikt: boolean-array is default initialized op FALSE, dus heb ik de betekenis van de inhoud omgedraaid (true = nu GEEN priemgetal, false = MOGELIJK WEL priemgetal) en dus kon de array-initialisatie verwijderd worden :P scheelt weer 0.1 seconde LOL

public class Priem
{
public static void main(String[] ps)
{
final int MAX = 10000000;
boolean[] numbers = new boolean[MAX];
int x;
int y;
long millis = System.currentTimeMillis();
for(x=2;x<MAX;x++)
{
if(!numbers[x])
{
for (y = 2*x; y < MAX; y+=x )
{
if (!numbers[y]) numbers[y] = true;
}
}
}
System.out.println("Milli seconds: " + (System.currentTimeMillis() - millis));
// Print some of the first results to check if algorithm works
for (int j=0;j<100;j++)
{
if (!numbers[j]) System.out.print(" "+j);
}
}
}

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 29-08 03:21

.oisyn

Moderator Devschuur®

Demotivational Speaker

overigens, het moet i % j zijn, en niet j % i :+

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 06-11-2025
Hier doet hij het aardig langzamer door die truc ;) . Die twee negaties hebben hier kennelijk een groter effect dan het wegvallen van de geheugen toegang (DDR geheugen :?).

Blog, Stratego/XT: Program Transformation, SDF: Syntax Definition, Nix: Software Deployment


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 29-08 03:21

.oisyn

Moderator Devschuur®

Demotivational Speaker

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
for (i = 1; i <= 200000; i++)
{
   if (i % 2 != 0)
    continue;

   int max = (int)Math.sqrt (i);

   boolean isPrime = true;
   for (int j = 3; j < max; j += 2)
   {
    if (i % j == 0)
    {
       isPrime = false;
       break;
    }
   }

   if (isPrime)
    println (i);
}

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Verwijderd

mbravenboer:
SCORES!

Die negaties zouden theoretisch geen extra tijd hoeven kosten, want de compiler kan er vast wel een geinverteerde conditionele jump van maken?

Mmmmz, ik zou toch es Java bytecode moeten gaan leren, de laatste keer dat ik asembly heb gedaan was nog op m'n Amiga (8MHz 68000 processor :p~ )

Heb je -O gebruikt om te compileren?

  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 06-11-2025
182x ms zonder negaties en met lijst op true zetten.
195x ms met boolean = false aanname en negaties.

Blog, Stratego/XT: Program Transformation, SDF: Syntax Definition, Nix: Software Deployment


Verwijderd

mbravenboer:

2690 Zonder negaties, met lijst op true zetten
2580 Met negaties, zonder lijst-initialisatie
Duron-750@933

Maar ik heb geen DDR, heeft de "geheugentruuk" bij jou wel effect dan?

(Sorry voor m'n Duron-933, m'n TBird-1333 staat beneden een DivX te maken ;) hehehe)

  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 06-11-2025
Bunny: 2690 - 2580
Hum das wel een grappig verschil dus :) .
Maar ik heb geen DDR, heeft de "geheugentruuk" bij jou wel effect dan?
Ja die wel (zie andere topic). Die truc scheelde behoorlijk :) .
Sorry voor m'n Duron-933, m'n TBird-1333 staat beneden een DivX te maken ;) hehehe
Tot voor kort had ik een PII-300 dus ik ken ut gevoel nog beter ;) .

Blog, Stratego/XT: Program Transformation, SDF: Syntax Definition, Nix: Software Deployment


Verwijderd

Ach ja, die "initialisatie-optimalisatie" is toch niet ideaal want hij hangt erg af van MAX; de initialisatie-tijd neemt slechts lineair toe als MAX groter wordt, maar de aantallen controles (en dus de extra negaties die blijkbaar toch niet helemaal weg-geoptimaliseerd kunnen worden) veel meer door de geneste FOR-lus, dus is er een grens waarboven je beter de array ff kunt initialiseren... hangt blijkbaar ook af van de snelheid van je processor en/of het type geheugen...

Heb ff getest, maar met MAX=50M hier nog hetzelfde effect (initialisatie duurt langer dan negaties) dus heeft vast iets met de hogere snelheid van DDR te maken waardoor het array sneller te initialiseren is....
/me wil ook DDR :9

Verwijderd

/me wordt even gek...

Heb een testje gedaan waarbij ik de initialisatie buiten beschouwing heb gelaten; MET negaties is ie een tikje sneller dan ZONDER ???
NEGA = 15270 (50M getallen)
NORM = 15370 (50M getallen)
:?

/me vindt dit een mooi moment om nu echt te gaan :Z

Verwijderd

Ik ben ook maar eens even gaan klooien. Resultaat is hier te downloaden.

Verwijderd

Ik heb nog wat extra gesleuteld aan het algoritme:

- De hoofdlus hoeft maar tot de helft van MAX te gaan, want veelvouden van hogere priemgetallen vallen buiten het bereik en hebben dus geen invloed meer.
- Alleen oneven waarden worden verwerkt. Ook de initialisatie van de array hoeft dus slechts voor de helft plaats te vinden! De waarden 0,1 en 2 die in het eerdere algoritme werden gegeven als priem-resultaten, worden nu aan het einde gewoon hardcoded toegevoegd.
- De write-reducing policy die ik eerder heb toegevoegd, is nu ook uitgebreid met een read-reducing policy: even waarden hoeven NIET te worden gelezen! Dit geeft nogmaals een flinke performance-winst!
- Ik druk ook even het aantal resultaten af, zodat duidelijk is dat de aanpassingen geen gevolg hebben voor de priem-berekeningen.

Resultaat: 1540 milliseconden op een Duron@933MHz!


public class Priem
{
public static void main(String[] ps)
{
final int MAX = 10000000;
final int MAXHALF = MAX/2;
boolean[] numbers = new boolean[MAX];
int x;
int y;

long millis = System.currentTimeMillis();

for (x=3;x<MAX;x+=2) numbers[x]=true;

for(x=3;x<MAXHALF;x+=2)
{
if(numbers[x])
{
for (y = 2*x; y < MAX; y+=x )
{
if (((y&1)==1) && numbers[y]) numbers[y] = false;
}
}
}
System.out.println("Milli seconds: " + (System.currentTimeMillis() - millis));
// Print the number of primes and the first results to check if algorithm works
int count=3; // correction for 0,1,2
System.out.print("0 1 2");
for (int j=3;j<MAX;)
{
if (numbers[j])
{
count++;
if (count<=20) System.out.print(" "+j);
}
j+=2;
}
System.out.println(" Aantal:"+count);
}
}

  • wasigh
  • Registratie: Januari 2001
  • Niet online

wasigh

wasigh.blogspot.com

als je je code tussen code-tags zet [ code ] & [/ code]
(zonder spaties)
dan is het meer leesbaar :)

Verwijderd

Bedankt voor de tip, alleen kan ik geen aanpassingen meer maken want het systeem blijft beweren dat "een administrator het bericht al heeft aangepast"... :?
Dus jullie zullen het hiermee moeten doen :P

Verwijderd

Killemov:

Haha :P, comments zijn zeker ook
FOUT
aangezien de compiler ze meteen weggooit ?

  • MP83
  • Registratie: Januari 2000
  • Laatst online: 31-01 18:11
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
public class Priem
{
public static void main(String[] ps)
{
final int MAX = 10000000;
final int MAXHALF = MAX/2;
boolean[] numbers = new boolean[MAX];
int x;
int y;

long millis = System.currentTimeMillis();

for (x=3;x<MAX;x+=2) numbers[x]=true;

for(x=3;x<MAXHALF;x+=2)
{
if(numbers[x])
{
for (y = 2*x; y < MAX; y+=x )
{
if (((y&1)==1) && numbers[y]) numbers[y] = false;
}
}
}
System.out.println("Milli seconds: " + (System.currentTimeMillis() - millis));
// Print the number of primes and the first results to check if algorithm works
int count=3; // correction for 0,1,2
System.out.print("0 1 2");
for (int j=3;j<MAX;)
{
if (numbers[j])
{
count++;
if (count<=20) System.out.print(" "+j);
}
j+=2;
}
System.out.println(" Aantal:"+count);
}
}

de leesbare versie... :P (c) Bunny (8> ;)

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 29-08 03:21

.oisyn

Moderator Devschuur®

Demotivational Speaker

Op woensdag 19 september 2001 15:17 schreef Sneech het volgende:
Killemov:

Haha :P, comments zijn zeker ook
[.. FOUT ..]

aangezien de compiler ze meteen weggooit ?
whaahahaha LOL >:)

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • brammetje
  • Registratie: Oktober 2000
  • Laatst online: 12-01-2025
Op woensdag 19 september 2001 15:33 schreef Mr.Blonde het volgende:
code:
1
bluh

de leesbare versie... :P (c) Bunny (8> ;)
correctie, deze is enigszins leesbaar:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
public class Priem
{
  public static void main(String[] ps)
  {
    final int MAX = 10000000;
    final int MAXHALF = MAX/2;
    boolean[] numbers = new boolean[MAX];
    int x;
    int y;

    long millis = System.currentTimeMillis();

    for (x=3;x<MAX;x+=2) numbers[x]=true;

    for(x=3;x<MAXHALF;x+=2)
    {
    if(numbers[x])
    {
      for (y = 2*x; y < MAX; y+=x )
      {
        if (((y&1)==1) && numbers[y]) numbers[y] = false;
      }
    }
    }
    System.out.println("Milli seconds: " + (System.currentTimeMillis() - millis));
    // Print the number of primes and the first results to check if algorithm works
    int count=3; // correction for 0,1,2
    System.out.print("0 1 2");
    for (int j=3;j<MAX;)
    {
    if (numbers[j])
    {
      count++;
      if (count<=20) System.out.print(" "+j);
    }
    j+=2;
    }
    System.out.println(" Aantal:"+count);
  }
}

  • TlighT
  • Registratie: Mei 2000
  • Laatst online: 22-03 10:40
Op woensdag 19 september 2001 14:49 schreef Bunny het volgende:
Ik heb nog wat extra gesleuteld aan het algoritme:

- De hoofdlus hoeft maar tot de helft van MAX te gaan, want veelvouden van hogere priemgetallen vallen buiten het bereik en hebben dus geen invloed meer.
Je hoeft zelfs maar tot sqrt(MAX) te gaan. Deze was bij mij dus het snelste (+/- 945 ms op een 1200mhz) :
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
    int i, j;
    double l;

    long millis = System.currentTimeMillis();

    l = Math.sqrt(MAX);
    for(i=3; i<=l; i+=2) {
    if(!numbers[i]) {
      for (j = i*2; j < MAX; j+=i) {
        if (((j&1)==1) && !numbers[j]) numbers[j] = true;
      }
    }
    }

    System.out.println("Miliseconds: " + (System.currentTimeMillis() - millis));

    System.out.print("2 ");
    for (j=0, i=3; i<MAX; i+=2) {
    if (!numbers[i]) {
      if (j++<20) System.out.print(i + " ");
    }
    }

    System.out.println("\nTotaal: " + j);

0 en 1 zijn trouwens geen priemgetallen.

  • tomato
  • Registratie: November 1999
  • Niet online
Op woensdag 19 september 2001 16:03 schreef TlighT het volgende:
Je hoeft zelfs maar tot sqrt(MAX) te gaan.
Waarom heb ik het idee dat er al een thread lang over dit feit heen gekeken wordt?
0 en 1 zijn trouwens geen priemgetallen.
Klopt :)

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 29-08 03:21

.oisyn

Moderator Devschuur®

Demotivational Speaker

Op woensdag 19 september 2001 16:09 schreef tomato het volgende:

[..]

Waarom heb ik het idee dat er al een thread lang over dit feit heen gekeken wordt?
[..]

Klopt :)
1 wel toch? de definitie van een priemgetal is tenslotte een getal dat alleen door zichzelf en door 1 deelbaar is.

Bovendien is elk getal (in N) te schrijven als een combinatie priemgetallen, vermenigvuldigd met elkaar.
Bijv. 102 = 2 * 3 * 17
Als 1 er niet bij hoort dan kun je 1 dus ook niet schrijven met een combinatie van priemgetallen :)

(okee, je kunt natuurlijk ook zeggen: elk getal is te schrijven als:
p1k1 * p2k2 * p3k3 * ... * pnkn

waarbij p1 t/m pn priemgetallen zijn en k1 t/m kn positieve gehele getallen, dus dan is 1 te schrijven als bijvoorbeeld 20
't was maar een idee :))

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • TlighT
  • Registratie: Mei 2000
  • Laatst online: 22-03 10:40
Op woensdag 19 september 2001 16:54 schreef OiSyN het volgende:

1 wel toch? de definitie van een priemgetal is tenslotte een getal dat alleen door zichzelf en door 1 deelbaar is.
aar een idee :))
Nee, een priemgetal is een positief geheel getal dat precies 2 (positieve gehele) delers heeft, 1 en zichzelf.

1 hoort daar dus niet bij.

Edit:

Elk natuurlijk getal kan op precies 1 manier als een product van priemgetallen geschreven worden. Bijv: 12 = 2*2*3. Als 1 ook een priemgetal zou zijn, gaat dit niet meer op, dan geldt 12=1*2*2*3, 12=1*1*2*2*3, etc.

Een andere reden: de som van de delers van een priemgetal x is altijd x+1. Dit gaat niet op voor het getal 1. 1 is dus geen priemgetal.

  • tomato
  • Registratie: November 1999
  • Niet online
Op woensdag 19 september 2001 16:54 schreef OiSyN het volgende:
1 wel toch? de definitie van een priemgetal is tenslotte een getal dat alleen door zichzelf en door 1 deelbaar is.
De definitie van een priemgetal:
Een getal p (positief geheel getal groter dan of gelijk aan 2), heet priemgetal (of kort 'priem') als het alleen deelbaar is door het getal 1 en door zichzelf.
Hier valt 1 dus niet onder :)
Bovendien is elk getal (in N) te schrijven als een combinatie priemgetallen, vermenigvuldigd met elkaar.
N? Z+ (gehele getallen groter dan 0) bedoel je?
Bijv. 102 = 2 * 3 * 17
Als 1 er niet bij hoort dan kun je 1 dus ook niet schrijven met een combinatie van priemgetallen :)
Volgens de definitie is heeft een ontbinding in priemgetallen de volgende vorm:

n = p1r1 p2r2 ... pkrk

Zoals je hierna al stelt dus ;)

  • Grum
  • Registratie: Juni 2001
  • Niet online
als je nou zei:
Nee, een priemgetal is een positief geheel getal dat precies 2 VERSCHILLENDE (positieve gehele) delers heeft, 1 en zichzelf.
dan had je verhaaltje geklopt ;)

btw 0/2/4/5/6/8 hoeven nooit gecontroleerd te worden
en zo is er ook nog een rekenregeltje voor 3 >:) (maar dat kost way 2 much time om dat te doen (als je niet gewoon % 3 doet :P )) en daarom kan je toch ook gewoon (mits je %3 gebruikt) als begin-modulo-getal 7 nemen (aangezien 2/3/5 al geelimineerd zijn)

scheelt je ook weer 2 stapjes :)

het is toch ook veilig om als max de sqrt(MAX) minus 1 te doen en em te 'floor'-en ? :)

of denk ik dan scheef ? :)

my brains hurt ;) ... en ik moet zo naar school :)

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 29-08 03:21

.oisyn

Moderator Devschuur®

Demotivational Speaker

euh Z+ ja idd

ben een beetje slordig deze week geloof ik :)

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 29-08 03:21

.oisyn

Moderator Devschuur®

Demotivational Speaker

Op woensdag 19 september 2001 17:15 schreef Grum_ het volgende:
als je nou zei:
[..]
het is toch ook veilig om als max de sqrt(MAX) minus 1 te doen en em te 'floor'-en ? :)

of denk ik dan scheef ? :)
ja :)

je test TOT sqrt (MAX), en niet tot en MET sqrt (MAX)
bovendien wordt er bij een cast naar (int) automatisch gefloored :)

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Verwijderd

Op woensdag 19 september 2001 16:03 schreef TlighT het volgende:
Je hoeft zelfs maar tot sqrt(MAX) te gaan. Deze was bij mij dus het snelste (+/- 945 ms op een 1200mhz)
Ik krijg hem nog sneller:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
final int MAXHALF = (MAX - 1)/2;
boolean[] numbers = new boolean[MAXHALF];
int i, j, l, a;

long millis = System.currentTimeMillis();

l = (Math.sqrt(MAX) - 1.0) / 2.0;
for(i= 1; i <= l; ++i) {
  if(!numbers[i]) {
    a= i * 2 + 1;
    for(j= i + a; j < MAXHALF; j+= a) {
    if(!numbers[j]) numbers[j]= true;
    }
  }
}

System.out.println("Miliseconds: " +
    (System.currentTimeMillis() - millis));

System.out.print("2 ");
for(j= 0, i= 1; i < MAXHALF; ++i) {
  if (!numbers[i]) {
    if (j++<20) System.out.print((i * 2 + 1) + " ");
  }
}

System.out.println("\nTotaal: " + j);

Nog sneller (slaat alle even getallen echt over) en met de helft van het geheugen, dus beter voor de caching.

  • tomato
  • Registratie: November 1999
  • Niet online
Op woensdag 19 september 2001 17:00 schreef TlighT het volgende:
Een andere reden: de som van de delers van een priemgetal x is altijd x+1. Dit gaat niet op voor het getal 1. 1 is dus geen priemgetal.
Hmmm, da's een beetje het paard achter de wagen spannen (je argument van de enige priemdeling trouwens ook) ;)
Deze eigenschap hebben priemgetallen omdat 1 er niet bij hoort. Het is niet andersom, dus dat 1 er niet bij hoort omdat het deze eigenschap niet heeft ;)

  • TlighT
  • Registratie: Mei 2000
  • Laatst online: 22-03 10:40
Op woensdag 19 september 2001 17:22 schreef tomato het volgende:

[..]

Hmmm, da's een beetje het paard achter de wagen spannen (je argument van de enige priemdeling trouwens ook) ;)
Deze eigenschap hebben priemgetallen omdat 1 er niet bij hoort. Het is niet andersom, dus dat 1 er niet bij hoort omdat het deze eigenschap niet heeft ;)
Tsja, maar dat is zeggen dat 1 geen priemgetal is omdat de definitie van een priem het getal 1 uitsluit, ook. De voorbeelden die ik gaf, geven juist aan waarom de definitie van een priem zo is opgesteld dat deze het getal 1 uitsluit.

Edit: En bovendien was dit argument niet van mij, maar van Euler (dacht ik) :P

  • Marcj
  • Registratie: November 2000
  • Laatst online: 28-08 17:56
Als je alle 2 én 3-tallen overslaat heb je nog 25% snelheidswinst en het is makkelijk te berekenen. Dit is mijn code (c++, moet je zelf maar converten ;)):
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
UINT priem(UINT testgetal)
{
    if(testgetal % 2 == 0)
        return 2;
    if(testgetal % 3 == 0)
        return 3;
    if(testgetal % 5 == 0)
        return 5;
    int top = (int)sqrt(testgetal);
    int j = 2;
    for(int i = 7; i <= top; i += j)
    {
        if(testgetal % i == 0)
            return i;
        j = 6 - j;
    }
    return 0;
}

:P

edit: het getal 1234567891 (is een priemgetal) duurt bij mij 5,7 sec op een TB 900 :)

Verwijderd

Je slaat alleen 2 over, omdat de check op even getallen zeer eenvoudig en dus snel is (alleen 1 bitje checken).
Als je ook 3 (en alle veelvouden daarvan) wilt overslaan, kost de check daarop (voor ELKE waarde zul je moeten checken of het een veelvoud van 3 is!), oftewel de modulo die je hierboven zo achteloos neerzet maar die (relatief) nogal tijdrovend is, je zeer waarschijnlijk meer tijd dan het basis-algoritme van veelvouden-eliminatie...
De routine die je hierboven geeft, checkt slechts voor EEN getal of het een veelvoud van 3 is, maar als je deze functie gaat aanroepen voor alle getallen tussen 0 en 10.000.000 kan ik me niet voorstellen dat dit je winst gaat opleveren maar eerder een zeer zware penalty...

Ook het halveren van het geheugengebruik leverde mij niets op voor de performance, omdat er een extra operator nodig was om de teller weer kloppend te krijgen. Wel leuk natuurlijk zodra geheugengebruik een issue wordt, en het zou inderdaad kunnen schelen doordat er ook minder pagina's hoeven te worden gecached, maar ook daar zag ik geen meetbare verbetering van terug?

Verder levert het geen meetbare extra snelheid op om de tellers met -1 enzo aan te passen, dus staat wel leuk maar is zonde van de moeite vind ik.

Alleen die wortel van MAX, ja, dat was dom van me |:( ik had het idee dat dat bij dit algoritme niet werkte maar het klopt dus WEL omdat de veelvouden van het priemgetal waarbij de factor lager is dan het priemgetal zelf ook al zijn gecheckt, en het scheelt ook nogal in snelheid! :9

Nadeel is nu wel dat ie ZO SNEL is dat het meten met milliseconden wat beperkt begint te worden, moeten we over op nano's? >:) OF gaan we tot de 100.000.000? :P

Verwijderd

Volgens mij moet dit ook werken:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
public class PrimeGenerator {

  int[] primes = new int[2000];
  int primesFound = 0;

  public PrimeGenerator() {}

  public void findPrimes()
  {
    long millis = System.currentTimeMillis();
    primes[0]=2;
    primesFound++;
    int currentNumber = 3;
    while (primesFound < primes.length)
    {
    boolean prime = true;
    for (int i = 0; i < primesFound; i++)
    {
      int p = primes[i];
// edit: dit er bij gezet:
        if (p > Math.sqrt((double)currentNumber))
        break;
// end edit.
      if (currentNumber % p == 0)
      {
        prime = false;
        break;
      }
    }
    if (prime)
    {
      primes[primesFound] = currentNumber;
      primesFound ++;
    }
    currentNumber++;
    }
    long time = System.currentTimeMillis()-millis;
    // printprimes
    for (int i = 0; i < primes.length; i++)
    {
    System.out.println(primes[i]);
    }
    System.out.println(time);
  }

  public static void main(String[] args)
  {
    PrimeGenerator pg = new PrimeGenerator();
    pg.findPrimes();
  }
}

runtime op een AMD K6-2 450, met een array van 2000 getallen -> 5160 ms in debug mode, 280 ms in normale run mode.
hoogste priemgetal: 17389
4000 getallen: runtime 1040, hoogste getal: 37813
edit:
Met de toevoeging erbij had ik een runtime van 880 ms bij een array van 20.000 getallen. (was eerst meer dan 23 seconde!)

  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

Mja:
http://vulcanus.its.tudelft.nl/~acm2/got/priem.phps

Dit stukje C-code dat ik als een van mijn eerste dingetjes van Java naar C had geporteerd (:+)

En dat doet de eerste 10.000 priemen vanaf 11 in 0.09 cpu-seconden.

Voor degenen die het willen checken, het 100.000ste priem is dan: 1296557 (dus eigenlijk de 100.005e ;)) 2.41 cpu-seconden.

En de eerste 20.000 in 0.21 cpu-seconde

Op een "redelijk zwaar belastte dual p3-800" met een load van 0.64 op moment van testen.

(edit, 10.000 != 100.000 :) )

Verwijderd

/me wil dat zijn code gebenched wordt :)

(Het kan zijn dat die "l =" expressie naar een int gecast moet worden, ik ben niet zo'n java-held, het is overgezet uit c maar zou voor de rest moeten werken)

  • TlighT
  • Registratie: Mei 2000
  • Laatst online: 22-03 10:40
Op donderdag 20 september 2001 02:38 schreef mietje het volgende:
/me wil dat zijn code gebenched wordt :)

(Het kan zijn dat die "l =" expressie naar een int gecast moet worden, ik ben niet zo'n java-held, het is overgezet uit c maar zou voor de rest moeten werken)
Mietje wil bevestiging dat zijn code (tot nu toe) de beste is >:).
Die kunnen we wel geven:

Mietje's code is de beste!!!!!!!!!!!!!! (hoera :))

Om precies te zijn: 630ms op mijn Athlon@1200 vergeleken met het oude "record" 945ms.

Edit:
1. TlighT begrijpt niet waarom er nu nog steeds code komt die niet gebaseerd is op de zeef.
2. TlighT heeft artikels voor zich liggen die de zeef optimaliseren (althans in termen van code complexiteit), maar heeft tot nu toe geen zin gehad ze door te nemen.

Verwijderd

Op donderdag 20 september 2001 09:12 schreef TlighT het volgende:
Om precies te zijn: 630ms op mijn Athlon@1200 vergeleken met het oude "record" 945ms.
Hoi Hoi! :)
2. TlighT heeft artikels voor zich liggen die de zeef optimaliseren (althans in termen van code complexiteit), maar heeft tot nu toe geen zin gehad ze door te nemen.
Hmm, leuk. Ook iets online?

  • TlighT
  • Registratie: Mei 2000
  • Laatst online: 22-03 10:40
Op donderdag 20 september 2001 12:41 schreef mietje het volgende:

[..]

Hmm, leuk. Ook iets online?
Wel wat gevonden:
- Improved Incremental Prime Number Sieves
- Prime Sieves Using Binary Quadratic Forms
- Lazy wheel sieves and spirals of primes.
- A Space-Efficient Fast Prime Number Sieve

In ACM staan ook nog wat artikelen, maar die zijn niet vrij verkrijgbaar :( (dat wordt een trip naar de uni-bibliotheek). Het is imo nog maar de vraag of ze in ons geval daadwerkelijk sneller zijn.

  • Confusion
  • Registratie: April 2001
  • Laatst online: 01-07 21:46

Confusion

Fallen from grace

Nu zit ik zo even de priemen t/m 106, 107 en 108 te berekenen en daar komt uit:
78497 in 36 ms. voor 106,
664578 in 441 ms. voor 107 en
5761454 in 5761 ms voor 108.

Qua aantallen is dit waarschijnlijk, omdat de priemdichtheid steeds kleiner wordt, maar waarom gaat hij er meer dan een factor 10 langer over doen om minder dan een factor 3 (wegens wegstrepen 2, 3, 5, 7, etc.) etcetera getallen te checken, waarvan er ook nog relatief veel meer worden weggestreept (waarbij dat wegstrepen dan natuurlijk wel weer een factor tien meer tijd kost)?

Bij 107 zouden er toch nog geen schijfoperaties moeten zijn (althans, een array of boolean lijkt me toch in 16 + 4 byte *107 is ongeveer 40 MB moeten kunnen en ik mag hopen dat ik dat vrij heb (KDE2, mozilla, emacs, newsreader).

Betreft de code van mietje: waarom wordt hij trager als je de if(!numbers[j]) weghaalt uit
code:
1
 if(!numbers[j]) numbers[j]= true;
? Gokje: te testen getal zit nog in register en testen kost dan weinig tijd; veel minder tijd dan getal in geheugen stoppen?

Wie trösten wir uns, die Mörder aller Mörder?


  • Woudloper
  • Registratie: November 2001
  • Niet online

Woudloper

« - _ - »

Zow hé ga jij even een topic van meer dan een jaar omhoog schoppen :?

  • Confusion
  • Registratie: April 2001
  • Laatst online: 01-07 21:46

Confusion

Fallen from grace

Nou èn? Ik heb toch een relevante opmerking, die er eventueel voor kan zorgen dat mensen hun berekeningen kunnen versnellen. Moet ik dan een nieuwe draad beginnen, waarin ik naar deze link? Da's minder handig; kost mensen meer muisclicks. Trouwens, deze draad is van betere kwaliteit dan veel andere draadjes hier.

Er is niet noodzakelijk iets mis met een oud topic omhoog schoppen. Er is wel iets mis met het roepen van UTFS-achtige opmerkingen.

Wie trösten wir uns, die Mörder aller Mörder?


Verwijderd

Killemov schreef op 18 september 2001 @ 21:59:
[...]


Sorry ?!?!?! Je kent geen booleans ?!?!?!

Zucht. Een boolean kan 2 waarden hebben nl true en false.

voorbeeld:
code:
1
2
3
4
5
6
7
8
boolean vergelijking = x &lt; y;

x y vergelijking
1 0 false
0 1 true

maar dit kan natuurlijk ook:
boolean vergelijking = a &amp;&amp; b || c &amp;&amp; d;

wat je wel eens ziet in code is:
code:
1
2
3
4
if (eenboolean == true)
{
...
}

En da's FOUT!

het moet zijn:
code:
1
2
3
4
if (eenboolean)
{
...
}

kijk o.a. eens hier: [url="http://java.sun.com/docs/books/tutorial/java/nutsandbolts/relational.html"]http://java.sun.com/docs/books/tutorial/java/nutsandbolts/relational.html[/url]
Kwestie van smaak ik zet er altijd == true achter omdat het de leesbaarheid verhoogt, maar om het nu meteen als FOUT te bestempelen vindt ik te ver gaan.

Verwijderd

Fused schreef op 29 oktober 2002 @ 21:32:
Qua aantallen is dit waarschijnlijk, omdat de priemdichtheid steeds kleiner wordt, maar waarom gaat hij er meer dan een factor 10 langer over doen om minder dan een factor 3 (wegens wegstrepen 2, 3, 5, 7, etc.) etcetera getallen te checken, waarvan er ook nog relatief veel meer worden weggestreept (waarbij dat wegstrepen dan natuurlijk wel weer een factor tien meer tijd kost)?

Bij 107 zouden er toch nog geen schijfoperaties moeten zijn (althans, een array of boolean lijkt me toch in 16 + 4 byte *107 is ongeveer 40 MB moeten kunnen en ik mag hopen dat ik dat vrij heb (KDE2, mozilla, emacs, newsreader).
CPU caching is verantwoordelijk voor de snelheid, of het ontbreken daarvan. Een groot deel van de boolean array moet telkens weer doorlopen worden om composieten weg te strepen, en als die array veel groter is dan de cache vinden er dus veel trage geheugenoperaties plaats.
Betreft de code van mietje: waarom wordt hij trager als je de if(!numbers[j]) weghaalt uit
code:
1
 if(!numbers[j]) numbers[j]= true;
? Gokje: te testen getal zit nog in register en testen kost dan weinig tijd; veel minder tijd dan getal in geheugen stoppen?
Exact.

  • Confusion
  • Registratie: April 2001
  • Laatst online: 01-07 21:46

Confusion

Fallen from grace

mietje schreef:
CPU caching is verantwoordelijk voor de snelheid, of het ontbreken daarvan. Een groot deel van de boolean array moet telkens weer doorlopen worden om composieten weg te strepen, en als die array veel groter is dan de cache vinden er dus veel trage geheugenoperaties plaats.
Maar van 107 naar 108 neemt het aantal trage geheugenoperaties vrijwel lineair toe zou ik denken (cache grootte is dan véél kleiner dan arraygrootte). Waarom neemt de tijd dan toch niet lineair toe?

Wie trösten wir uns, die Mörder aller Mörder?


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 29-08 03:21

.oisyn

Moderator Devschuur®

Demotivational Speaker

hmm sorry maar er gaan nu 2 topics over precies hetzelfde onderwerp.. de taal doet er verder ook weinig toe, en aangezien deze topic oud is en omhoog is geschopt doe ik deze op slot

je kunt in [rml][ C++] Priemgetallen berekenen[/rml] verder discussieren

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.

Pagina: 1

Dit topic is gesloten.