Hackerboard Wiki HaboBlog
Hackerboard bei Facebook Hackerboard bei Google+ Hackerboard bei Twitter

[HaBo]

 
Programmieraufgaben Hier wird regelmäßig eine neue Programmieraufgabe gestellt, die dann gelöst werden soll und in Zusammenarbeit mit den Moderatoren auch besprochen werden kann.

Primzahlen mit versch. Tests

Diskussion: Primzahlen mit versch. Tests im Forum Programmieraufgaben, in der Kategorie Code Kitchen; Anzeige Zitat: Original von Elderan Bei deinem Schleifendurchlauf würde also 30000 mal neuer Speicher reserviert, und das Array würde 30000 ...

Antwort
Alt 11.04.07, 19:41   #16 (permalink)
Moderator
 
Benutzerbild von bitmuncher
 
Registriert seit: 30.09.06
bitmuncher Quadcorebitmuncher Quadcorebitmuncher Quadcorebitmuncher Quadcorebitmuncher Quadcorebitmuncher Quadcore
Likes: 442
Standard

Anzeige

Zitat:
Original von Elderan
Bei deinem Schleifendurchlauf würde also 30000 mal neuer Speicher reserviert, und das Array würde 30000 mal verschoben werden, was sehr Zeitintensiv ist.
Was auch immer man unter "zeitintensiv" versteht.
Code:
bitmuncher@deepthought:~$ cat test.php
<?
for($i=0; $i<=30000; $i++) {
  $meinarray[$i] = '';
}
?>
bitmuncher@deepthought:~$ time php test.php

real    0m0.093s
user    0m0.080s
sys     0m0.004s
__________________
Mein Blog - Mein Job - Diaspora

Der Ring uns zu knechten besteht aus 12 Sternen auf blauem Grund.

Neue Beiträge im Habo via Twitter - Das HaBo auf FB - Das HaBo bei G+
bitmuncher ist gerade online   Mit Zitat antworten
Alt 12.04.07, 15:18   #17 (permalink)
 
Registriert seit: 02.02.07
my2$/100 Leistung: Facit NTK
Likes: 0
Standard

Zitat:
Original von bitmuncher
Was auch immer man unter "zeitintensiv" versteht.
Vielleicht bedeutet es, dass die Ermittlung der Primzahlen von 1 bis 1 Mio. in PHP schneller geht, als ein ebenso großes Array anzulegen. :O

Code:
my2cent@hover:~$ nice -20 ./prim.php 
Leeres Array bis 1000000 erzeugt: : 2.400700 Sek. (2.400 ?s pro Element) 
Primzahlen bis 1000000 berechnet: : 2.077223 Sek. 
78498 Primzahlen gefunden
PHP-Code:
#!/usr/bin/php
<?php
# Anzahl der Arayelemente
$MAX 1000000;

###### 1. Zeitmessung #######
# Erzeuge ein leeres Array mit MAX Elementen

$zeitmessung1=microtime();

for(
$i=0$i<$MAX$i++)
   
$a[$i]='';

$zeitmessung2=microtime();

### ENDE ###

print_stats($zeitmessung1$zeitmessung2$MAX"Leeres Array bis ".$MAX." erzeugt: ");

####### 2. Zeitmessung ########
# Ermittle die Primzahlen bis MAX (Array ist vorhanden)

$zeitmessung1=microtime();

$grenze sqrt($MAX);
$a[0]=1;
$a[1]=1;

# Produkte als nicht-Primzahlen markieren
for($i=3$i<=$grenze$i+=2)
{
   
$a[$i] or $j $i*$i and $step $i<<1;
   while(
$j<$MAX)
   {
     
$a[$j] = 1;
     
$j+=$step;
   }
}

# gerade Zahlen als nicht-Primzahlen markieren
$i=4;
$j=$MAX-2;
while(
$i<$j)
{
  
$a[$i] = 1;
  
$a[$j] = 1;
  
$i+=2;
  
$j-=2;
}

$zeitmessung2=microtime();

### ENDE ###

print_stats($zeitmessung1$zeitmessung2, -1"Primzahlen bis ".$MAX." berechnet: ");

count_prim($a$MAX);

# Funktion gibt Laufzeitinformtionen aus
function print_stats($z1$z2$count$comment)
{
  
$temp=explode(" ",$z1);
  
$zeit1=$temp[0]+$temp[1];

  
$temp=explode(" ",$z2);
  
$zeit2=$temp[0]+$temp[1];

  
$zeit=$zeit2-$zeit1;
  
$ratio=$zeit/$count*1E6;

  
$ratio=substr($ratio,0,5);
  
$zeit=substr($zeit,0,8);

  if(
$count>0)
    print(
"$comment: $zeit Sek. ($ratio ?s pro Element) \n");
  else
    print(
"$comment: $zeit Sek. \n");
}

# Funktion gibt Anzahl gefundener Primzahlen aus 
function count_prim($a$MAX)
{
   for(
$i=3$c=1$i<$MAX$i++)
      
$a[$i] or $c++;

   print (
"$c Primzahlen gefunden\n");
}
?>
Wenn man sich noch drauf einigt, dass gerade Zahlen (außer der 2) keine Primzahlen sein können und die 2te Schleife weg lässt, geht's nochmal 30% schneller. Hoffentlich sind da keine groben Schnitzer drin - hatte nicht die Zeit 78498 Zahlen zu prüfen.
my2$/100 ist offline   Mit Zitat antworten
Alt 12.04.07, 16:54   #18 (permalink)
Moderator
Themenstarter
 
Benutzerbild von Elderan
 
Registriert seit: 30.03.04
Elderan Leistung: 8086
Likes: 14
Standard

Hallo,
mal zum vergleich:
Leeres Array in C# mit 1 Mio. Elementen: Zeitspanne nicht messbar bei höchster Genauigkeit unter Windows (also unter 0,01 Sekunden)

Array mit Zahlen 0 - 1 Mio: 0 Ticks oder 156250 Ticks was ca. 0,015 Sek entspricht*. Genauer gings leider nicht.


* Durch 1000 mal ausführen des Tests kam ich auf 0,013 Sekunden pro Erstellung des Arrays mit Zahlen von 0 - 1 Mio..
Elderan ist offline   Mit Zitat antworten
Alt 06.05.07, 22:36   #19 (permalink)
 
Registriert seit: 10.04.07
Tara Leistung: Facit NTK
Likes: 0
Standard

Hi!

@ Indi und andere:

Hat jemand von euch mal so einen 8/30-Eratosthenes implementiert? Das Auslassen der geraden Zahlen ist ja noch einfach (mein Delphi-Sieb schafft damit Primzahlen bis 1 Mio in 7 ms, ich verwende TBits), aber wenn ich versuche, Vielfache von 3 und 5 zu überspringen, gibt es beim Ausstreichen immer Murks oder die Rechnung wird so umständlich, daß das Programm langsamer wird.

Einen hübschen Algo hierzu würde ich gern mal sehen!
Tara ist offline   Mit Zitat antworten
Alt 07.05.07, 01:27   #20 (permalink)
CDW
Moderator
 
Benutzerbild von CDW
 
Registriert seit: 20.07.05
CDW Leistung: OpteronCDW Leistung: OpteronCDW Leistung: OpteronCDW Leistung: OpteronCDW Leistung: OpteronCDW Leistung: Opteron
Likes: 202
Standard

hier gibt es was:
[link] Project Euler - Programmieraufgaben
(zusammenzählen aller Primzahlen bis 1Mio mit Erastotheles-Algorithmus: ca. 85ms auf einem alten P4).
Ob diese Umsetzung in der vorhandenen Form Dir was bringt, sei aber dahingestellt
Allerdings, wenn Du den Code postest, könnte man nach dem Fehler suchen
__________________
Noch mal, für alle Pseudo-Geeks: 1+1=0. -> 10 wäre Überlauf!
Selig, wer nichts zu sagen hat und trotzdem schweigt.
CDW ist offline   Mit Zitat antworten
Alt 07.05.07, 12:28   #21 (permalink)
Moderator
Themenstarter
 
Benutzerbild von Elderan
 
Registriert seit: 30.03.04
Elderan Leistung: 8086
Likes: 14
Standard

Hallo,
für das Sieb findest du hier grundlegende Überlegungen, aber hier werden weitere Überlegungen zur Optimierung angestellt.

Wie du am Diagramm ganz unten sehen kannst, dauert das Außlassen von z.B. 2 und 3 länger als alle Zahlen zu verwenden. Erst ab den Zahlen 2-7 bekommst du einen Geschwindigkeitsvorteil, der bei 2-13 maximal ist (zumindest dort).
Elderan ist offline   Mit Zitat antworten
Alt 07.05.07, 16:34   #22 (permalink)
Member of Honour
 
Registriert seit: 02.10.01
Indi Leistung: Z3
Likes: 0
Standard

@Tara:
Ja, hatte ich implementiert. Allerdings nicht mit einem speziellen Algorithmus. Das Schema wiederholt sich praktisch immer nach allen 30 Zahlen. Einmal ist es die zweitfolgende Zahl die geprüft werden soll, dann die drittfolgende Zahl oder ähnlich. Kann man sich ganz leicht für einen 30er-Block raussuchen, welche Reihenfolge man verwenden muss. Kann man dann in ein Array speichern zb.
Indi ist offline   Mit Zitat antworten
Alt 07.05.07, 17:53   #23 (permalink)
 
Registriert seit: 10.04.07
Tara Leistung: Facit NTK
Likes: 0
Standard

Hi!

Diese Informatikjahr-Seite ist ja wirklich toll, nicht nur zum Thema Eratosthenes. Alles schön genau erklärt, und auch Nicht-Informatiker-kompatibel!

Nur gut daß ich sie zu Beginn meiner Überlegungen noch nicht kannte, das hätte ja jegliches Nachdenken meinerseits abgewürgt!

Mein eigenes Delphi-Programm sieht so aus:

Code   
Code:
const
  PrimeMax = 1000000;
var
  i, j, n, HalfPrimeMax: Integer;
  Sum: Int64;
  IsComposite: TBits;
begin
  HalfPrimeMax := PrimeMax div 2;
  IsComposite := TBits.Create;
  IsComposite.Size := HalfPrimeMax+1;
  for i := 1 to Trunc(Sqrt(HalfPrimeMax)) do
    if not IsComposite.Bits[i] then
    begin
      j := i+i+1;
      n := j*j shr 1;
      while n <= HalfPrimeMax do
      begin
        IsComposite.Bits[n] := True;
        Inc(n,j)
      end;
    end;
  Sum := 2;
  for i := 1 to HalfPrimeMax do
    if not IsComposite.Bits[i] then
      Inc(Sum,2*i+1);
end;


Mit den Infos von dieser Seite versuche ich mal, was besseres draus zu machen. Danke!

@ Indi:
Das Schema ist ja wirklich überichtlich, habe es mir gerade aufgemalt.

edit: Hab noch schnell den Zugriff auf die Zahlen ergänzt, so daß es Euler10 rechnet. Primzahl 2 muß separat behandelt werden.
Tara ist offline   Mit Zitat antworten
Antwort
   
- Anzeige -

Werbung ist gerade online    

[HaBo] » Software Home » Code Kitchen » Programmieraufgaben » Primzahlen mit versch. Tests
Themen-Optionen
Ansicht

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks sind aus
Pingbacks sind aus
Refbacks sind aus


Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Primzahlen T1G3R Cryptography & Encryption 3 31.10.08 13:08
[c++] Primzahlengenerator: Ganzzahlige primzahlen _fux_ Code Kitchen 15 17.09.08 21:47
Script für automatische Tests erstellen?? ecologys Code Kitchen 0 29.06.04 13:46
2 versch. versionen von md5? immado Cryptography & Encryption 5 18.04.04 17:06
Tests von Testreich.com kressi Umfragen 12 18.12.03 15:42


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 52 53 54 55 56 57 58 59 60 61