Primtal på hjernen...

Tags:    c++

<< < 123 > >>
Jeg har sat min computer og mit uforlignelige intellekt på prøve. ;-)

Skriv et program i c++, der udregner primtal.
Så mange som muligt, så hurtigt som muligt.
De omtale tal skal skrives til en fil på harddisken ikke på skærmen.
Gør koden så kort som mulig.
Der må kun bruges standard liberys/headers ect.

Her er hvad jeg er nået frem til:
Fold kodeboks ind/udKode 


Det vigtigste man bør lægge mærke til her er at vectoren er af typen unsigned long (32 bit), men variablen test er af typen unsigned long long (64 bit), dette har naturligvis en årsag.
Når man tester om en tal er et primtal, tester man som bekendt (medmindre man bruger mystiske algoritmer og den slags) om de primtal der er mindre en tallet går op i, dog er det ikke nødvengidt at teste primtal størrer end kvardratroden at primtalet op i test tallet (det her kunne formuleres bedre)
en unsigned long long kan max indeholde værdien 2^64-1 og en unsigned long værdien 2^32-1.
Kvardratroden af førstnævnte er lig med
4294967295,9999999998835846781731
det er lige 0,9999999998835846781731 mere end en unsigned long kan indeholde, detter er naturligvis ikke et problem, da vi ikke regner med kommatal her, vi tester kun med primtal der er mindre eller er lig med kvardratroden af tallet der skal testes, så vi kan med fordel runde ned, hvilket vil sige at vi ikke har brug for at gemme primtal størrer en typen unsigned long.
Det er hvad jeg kalder effektivitet ;-)

Nuvel, jeg lod mig vist rive lidt med, hvad jeg egenlig ville hvar at udfordre alle genierne herinde til at gøre det bedre og hvis ingen skulle have lyst til at gøre et forsøg, er jeg stadig lidt utilfreds med strukturen, men hvis jeg gør som jeg gerne vil, brokker kompileren sig over at en eller anden iso standard ikke bliver overholdt.

[Redigeret d. 08/02-06 22:57:39 af Felix Nielsen]

[Redigeret d. 08/02-06 22:58:42 af Felix Nielsen]

[Redigeret d. 09/02-06 00:53:14 af Felix Nielsen]



Jeg kan se på det hele at der ikke er mange andre end mig der har interesse for primtal, ikke desto mindre udspringer der jo også andre spændende ting fra denne slags forsøg.

Jeg kan orientere om at mit program crashede efter at have skrevet primtallet 2.777.105.131 til filen "primes.txt" som "kun" nåede en størrelse af 1.44 GB.
Da jeg gerne skulle kunne have filer af størelsen 4 GB liggende, går jeg ikke ud fra at det er det der er problemet.
Disse 1.44 GB primtal har computerenjo også haft liggende i hukkommelsen, så jeg tror ikke at der kan sås tvivl om at det er der problemet ligger.

Personligt kan jeg se 2 løsnings modeller.
Den første er at istedet for at lade programmet læse og skrive til en vector hele tiden, kunne man jo bruge filen, derved kan man spare en hel del på hukkommelsen, jeg er dog ikke helt sikker på hvordan det kan gøres.

Den anden "løsningsmodel" er at optimere endnu mere ;-)
Det er jo ikke første gang at jeg har skrevet et sådan program, men sidste gang nåede jeg altså kun en fil ca. halv så stor som den nuværende.
Jeg er selv ret sikker på at det ikke kan optimeres meget mere, men der er altid et eller andet man kan gøre.
Noget har jeg da også gjort.
Jeg synes selv det er ret cool, men det er vist desværer ikke nok.

Fold kodeboks ind/udKode 




Jeg har også selv prøvet det :) Meget sjovt. Kan dog ikke huske mit største tal andet end at jeg kørte den over 7 dage på en 800 mhz. Ang. dit program. Har du prøvet at få din primtals algoritme ned? Så den fx. ikke kører over 2 for løkker?

Slot - All your base are belong to us
http://www.sigsys.dk



Jeg ser ikke umiddelbart nogen mulighed for kun at bruge én løkke, dog kunne jeg godt tænke mig at få de to variabler i og is_prime inkooporeret i disse løkker, det har dog ikke vist sig muligt da kompileren brokker sig overat ISO90 standarden (hvad det så end er) ikke bliver overholdt og kommer med besked om div. variabel lockups¿

Jeg kunne godt tænke mig en anden løsning end struct til at holde styr på hvor meget de enkelte celler i vectorerne fylder. Måden jeg gør det på nu fylder meget og er i det hele taget lidt besværlig.

Sidst men ikke mindst kunne jeg godt tænke mig at prøve idéen med at droppe den store vector og bruge en fil på harddisken, men jeg har ingen idé om hvordan jeg fx. får fat i linie 37 i filen uden at det kræver en masse recourser og jeg kunne også forestille mig at det giver visse vanskeligheder når man kommer op i filstørelsen på en eller flere GB.



Jeg ser ikke umiddelbart nogen mulighed for kun at bruge én løkke, dog kunne jeg godt tænke mig at få de to variabler i og is_prime inkooporeret i disse løkker, det har dog ikke vist sig muligt da kompileren brokker sig overat ISO90 standarden (hvad det så end er) ikke bliver overholdt og kommer med besked om div. variabel lockups¿

Jeg kunne godt tænke mig en anden løsning end struct til at holde styr på hvor meget de enkelte celler i vectorerne fylder. Måden jeg gør det på nu fylder meget og er i det hele taget lidt besværlig.

Sidst men ikke mindst kunne jeg godt tænke mig at prøve idéen med at droppe den store vector og bruge en fil på harddisken, men jeg har ingen idé om hvordan jeg fx. får fat i linie 37 i filen uden at det kræver en masse recourser og jeg kunne også forestille mig at det giver visse vanskeligheder når man kommer op i filstørelsen på en eller flere GB.


Hvis du tror at dit program crasher fordi det bruger for meget hukommelse, så øg da bare størrelsen på pagefilen, så er du fri for at tænke på at håndtere det med filerne, det gør windows for dig.

Mvh
Kaare



det er naturligvis en løsningsmodel ;-)
Pointen er dog lidt at ved at stille sig selv sådanne opgaver lærer uværgeligt en hel masse...



Denne gang nåede jeg så til 2.800.551.821 og en filstørrelse på 1.45 GB så det er jo ikke den stpre forskel.



Denne gang nåede jeg så til 2.800.551.821 og en filstørrelse på 1.45 GB så det er jo ikke den stpre forskel.


Hvor lang tid tager det for din computer at nå det tal ?




Denne gang nåede jeg så til 2.800.551.821 og en filstørrelse på 1.45 GB så det er jo ikke den stpre forskel.


Hvor lang tid tager det for din computer at nå det tal ?

Ved ikke, omkring 8 timer hvis den ikke er belastet af andre ting vil jeg tro.

[Redigeret d. 12/02-06 00:19:34 af Felix Nielsen]



Denne gang nåede jeg så til 2.800.551.821 og en filstørrelse på 1.45 GB så det er jo ikke den stpre forskel.


Hvor lang tid tager det for din computer at nå det tal ?

Ved ikke, omkring 8 timer hvis den ikke er belastet af andre ting vil jeg tro.

[Redigeret d. 12/02-06 00:19:34 af Felix Nielsen]


Så er jeg gået igang med en omgang til.
ændringer er:
Størrer sidefil.
'int i' er nu 'unsigned long long i' jeg tror nøppe at det er det der har været skyld i fejlen, men under alle omstændigheder er en int ikke nok når man når op i de størrer tal.



Med størrer sidefil og 'unsigned long long i' nåede jeg kun til 1.44 Gb ligesom tidligere, det bekræfter jo at det ikke er manglene hukkommelse.
Jeg tænker at der måske er en begrænsning på størrelsen at vectorer, men jeg er ivrig effter at høre jeres mening...



<< < 123 > >>
t