AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Projekte Sehr schneller Primzahl-Finder
Thema durchsuchen
Ansicht
Themen-Optionen

Sehr schneller Primzahl-Finder

Ein Thema von GTA-Place · begonnen am 28. Nov 2004 · letzter Beitrag vom 28. Apr 2007
Antwort Antwort
Seite 3 von 9     123 45     Letzte »    
GTA-Place
Registriert seit: 5. Apr 2004
Auch euch will ich meinen Source nicht vorbehalten:

Delphi-Quellcode:
function Prim(Zahl: Cardinal): Boolean;
var
  Teiler: PCardinal;
  Wurzel: Cardinal;
begin
  Result := True; // Result = True
  if not odd(Zahl) OR (Zahl <= 5) then // Ist die Zahl nich ungerade oder kleiner als 5, dann
  begin
    if (Zahl <> 2) AND (Zahl <> 3) AND (Zahl <> 5) then // Ist die Zahl nicht 2 und nicht 3 und nicht 5, dann
      Result := False; // Result = False
    Exit; // Exit
  end;
  Teiler := @PrimS[0]; // Teiler = @PrimS[0]
  Wurzel := Trunc(sqrt(Zahl)); // Wurzel aus der Zahl
  while Teiler^ <= Wurzel do // Solange Teiler^ <= Wurzel ist, mache
  begin
    if Zahl mod Teiler^ = 0 then // Ist Zahl / Teiler^ = Rest 0, dann
    begin
      Result := False; // Result = False
      Break; // Break
    end;
    Inc(Teiler); // Teiler erhöhen um 1
  end;
end;
Delphi-Quellcode:
procedure TMainForm.StartButClick(Sender: TObject);
var
  Start, Ende: Real;
  Z: PCardinal;
  X, LPrim: Cardinal;
  PrimF: TStringList;
begin
  try
    Von := StrToInt(VonEdit.Text); // Start
    Bis := StrToInt(BisEdit.Text); // Endwert

 
    if Bis > 10 then
      SetLength(PrimS, Trunc(0.4*Bis-(Bis/4))) // Größe des Array: 0.4*Bis-(Bis/4)
    else
      SetLength(PrimS, 4);

 
    LPrim := 0; // Letze Prim = 0
    Z := @PrimS[0]; // Gefundene Prims = 0

 
    if (Von >= 0) AND (Bis >= 0) AND (Von < Bis) then // Von >= 0; Bis >= 0; Von < Bis;
    begin
      Start := GetTickCount; // Start-Zeit

 
      for X := Von to Bis do // Schleife: Startwert -> Endwert
      begin
        if Prim(X) then // Funktion ausführen, wenn Prim dann
        begin
          Z^ := X; // Prim in Array schreiben
          Inc(Z); // Z erhöhen um 1
          LPrim := X; // Letze Prim = X
        end;
        if X mod 20000 = 0 then // Wenn X : 20.000 = Rest 0, dann
        begin
          Application.ProcessMessages; // Anwendung aktualisieren
          PrimLab.Caption := 'Aktuelle Primzahl: ' + IntToStr(LPrim); // Akt. Primzahl anzeigen
        end;
      end;

 
      Ende := GetTickCount; // End-Zeit
      DauerLab.Caption := 'Diese Überprüfung hat ' + FloatToStr((Ende - Start) / 1000) + ' Sekunden gedauert.'; // Dauer anzeigen

 
      PrimLab.Caption := 'Speichern...'; // "Speichern..." anzeigen

 
      Z := @PrimS[0]; // Z auf 0 stellen
      PrimF := TStringList.Create; // Stringlist erzeugen

 
      for X := 0 to Length(PrimS)-1 do // Von 0 bis Größe des Array
      begin
        if Z^ = 0 then // Wenn Z^ = 0, dann
          Break; // Break
        PrimF.Add(IntToStr(Z^)); // Prim in Stringlist schreiben
        Inc(Z); // Z erhöhen um 1
      end;

 
      PrimF.SaveToFile('Prim.txt'); // Stringlist speichern
      PrimF.Free; // Stringlist freigeben

 
      PrimLab.Caption := 'Aktuelle Primzahl: ' + IntToStr(LPrim); // Akt. Primzahl anzeigen
    end
    else
      ShowMessage('Ungültige Eingabe(n)!'); // Bei falschen Eingaben, Nachricht anzeigen
  except
    ShowMessage('Es ist ein Fehler aufgetreten!'); // Wenn Fehler auftritt, Nachricht anzeigen
  end;
end;
Das Programm überprüft 10.000.000 Zahlen in erstaunlichen 6 Sekunden.
Und das Speichern geht so schnell, dass man "Speichern..." gar nicht sieht.
 
Benutzerbild von fkerber
fkerber

 
Delphi XE Professional
 
#21
  Alt 28. Nov 2004, 19:22
Hi!

Bei mir kommt mit D7 aber auch ein hässlicher Fehler:
Out of Memory

Dann passiert nichts mehr.


Mit D2005 geht es.



Ciao Frederic
Frederic Kerber
  Mit Zitat antworten Zitat
Benutzerbild von MagicAndre1981
MagicAndre1981

 
Delphi 7 Enterprise
 
#22
  Alt 28. Nov 2004, 20:11
@sakura

bei mir stürtzt Delphi auch mit der Fehlermeldung "Out of memory" ab. Dabei habe ich doch 1,25GB RAM.


Hast du eine Ahnung woran das liegt?



MagicAndre
André
  Mit Zitat antworten Zitat
Benutzerbild von MagicAndre1981
MagicAndre1981

 
Delphi 7 Enterprise
 
#23
  Alt 28. Nov 2004, 20:21
@fkerber und alle mit dem D7 Fehler.

Ich habe einfach die dsk und cfg - Datei gelöscht und schon konnte ich es öffnen.

Gruß MagicAndre
André
  Mit Zitat antworten Zitat
Benutzerbild von fkerber
fkerber

 
Delphi XE Professional
 
#24
  Alt 28. Nov 2004, 20:29
Hi!

Zitat von MagicAndre1981:
Ich habe einfach die dsk und cfg - Datei gelöscht und schon konnte ich es öffnen.
Stimmt!
Sieht man sich die Dateien mal an, ist es wohl kein Wunder - ein Haufen absoluter Pfade auf D2005 und sonstige D2005-spezifische Sachen, anscheinend hat D7 dann da ein paar Probleme.


Ciao Frederic


P.S.: Das D7-Kompilat war bei mir 0,04 Sekunden schneller als das von D2005
Frederic Kerber
  Mit Zitat antworten Zitat
Benutzerbild von mirage228
mirage228

 
Delphi 2010 Professional
 
#25
  Alt 28. Nov 2004, 20:35
Hi,

ich hatte bei D7 auch erst:
Zitat von D7:
---------------------------
Fehler
---------------------------
Zu wenig Arbeitsspeicher.
---------------------------
OK
---------------------------
wonach die ganzen IDE Fenster "maximiert" waren. Danach hagelte es Zugriffsverletzung, aber ich konnte das Programm doch noch starten (Scheint so, als würde D7 nicht mit den Fenstergrößen-Einstellungen von D2005 zurechtkommen).

mfG
mirage228

Edit: Bei Delphi 3 sind ganzen IDE Fenster beim Start auch "maximiert" - Das Projekt lässt sich dort aber nicht kompilieren.
(TLargeInteger wird zwar als Int64 ersatz akzeptiert, aber ich weiss nicht, wie ich mit dem Record rechnen soll :-\)

mfG
mirage228
David F.
  Mit Zitat antworten Zitat
supermuckl

 
FreePascal / Lazarus
 
#26
  Alt 28. Nov 2004, 20:36
solche speedtests würd ich eh sehr oft machen und dann einen mittelwert ziehen.. und das bei jedes mal gleichen einstellungen des zu testenden algos

sonst kommen da die "einsteuungen" von windows mit rein, die andere prozesse verursachen usw
  Mit Zitat antworten Zitat
Nicodius

 
Delphi 2006 Architect
 
#27
  Alt 28. Nov 2004, 20:44
jap ohne die zwei gehts!


1,72 sec wow
Nico Müller
  Mit Zitat antworten Zitat
Nicodius

 
Delphi 2006 Architect
 
#28
  Alt 28. Nov 2004, 20:46
wäre super qürdest du den code erklären sakura ..
Nico Müller
  Mit Zitat antworten Zitat
Benutzerbild von stoxx
stoxx
 
#29
  Alt 28. Nov 2004, 21:27
darf man mal fragen, wozu man die Primzahlen in der Praxis gebrauchen könnte ?
Ist zwar schön, sie zu berechnen, habe sie aber mein ganzes Leben lang noch nicht gebraucht.
Danke ! .. vielleicht tun sich ja ganz neue Möglichkeiten für mich auf !
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

 
Delphi 2006 Professional
 
#30
  Alt 28. Nov 2004, 21:47
In der Kryptologie spielen sie eine große Rolle zum Beispiel.
Michael
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 3 von 9     123 45     Letzte »    


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

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

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:59 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz