Delphi-PRAXiS
Seite 2 von 3     12 3      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Primfaktorzerlegung läuft viel zu langsam... (https://www.delphipraxis.net/87408-primfaktorzerlegung-laeuft-viel-zu-langsam.html)

Nikolas 28. Feb 2007 12:39

Re: Primfaktorzerlegung läuft viel zu langsam...
 
Es würde mich wundern, wenn das der Fall wäre. Ich bin davon ausgegangen, dass der Compiler sieht, dass x innerhalb der Schleife nicht geändert wird und daher das floor(Sqrt(x)) nur einmal berechnet und sich merkt.
Inwiefern soll sqrt ungenau sein? Um ganz sicher zu gehen könnte man floor noch mit ceil austauschen, dann ist man auf der sicheren Seite, so lange sqrt keinen Fehler macht der größer als 1 ist :)
Und für Zahlen, bei denen ein so großer Fehler auftreten kann, sollte diese Art der Überprüfung auch nicht angewendet werden.

Chris P 28. Feb 2007 12:44

Re: Primfaktorzerlegung läuft viel zu langsam...
 
Ich bin mir nicht sicher ob der Compiler das weiß, ob x innerhalb der Schleife verändert wird.
Ich denke, es wird bei jedem Durchlauf erneut berechnet.

Auf jeden Fall sind meine und deine Variante möglich.
Nur ich persönlich versuche Fließkommazahlen zu vermeiden wo es geht.

fapsons 28. Feb 2007 12:46

Re: Primfaktorzerlegung läuft viel zu langsam...
 
Super ChrisP, bin begeistert. Deine Variante läuft einwandfrei.
Vielen Dank!!!

Jetzt hätte man nur noch das selber schaffen müssen...;) Aber ich bin leider noch ein blutiger Anfänger...*G*

fapsons 28. Feb 2007 12:49

Re: Primfaktorzerlegung läuft viel zu langsam...
 
Ein Problem habe ich noch, könnte allerdings zu nem größeren werden...;)

Was ist, wenn mein x ein int64 sein muss.
Dann kann ich doch keine For-Schleife benutzen, oder?

Gibt es dafür auch eine Lösung?

Chris P 28. Feb 2007 12:52

Re: Primfaktorzerlegung läuft viel zu langsam...
 
Freut mich!

Wenn du meine Variante einigermaßen nachvollziehen kannst, kannst du dich ja
mal an den Fermat versuchen. Das wäre dann die nächste Verbesserung.

P.S: Mit Int64 sollte es ebenfalls ohne Probleme gehen. Ersetze einfach Cardinal durch Int64.

fapsons 28. Feb 2007 13:10

Re: Primfaktorzerlegung läuft viel zu langsam...
 
Die Funktion läuft soweit bis zum Wert 3234846615.
Mit dem letzten Wert, den ich benötige, läuft es leider nicht mehr...:(
100280245065

Ne Idee, woran es liegt?


Delphi-Quellcode:
 primzahlen := Tintarray.Create;
 primzahlen := Factorize(3234846615);


function Factorize(const V: int64): TIntArray;
var
   t, x, Count: Cardinal;
begin
   result := TIntArray.Create;
   t := 2;
   x := V;

   Count := 0;

   while (t <= x) do
   begin
      if (x mod t = 0) then
      begin
         Count := Count + 1;
         Result.ints[Count] := t;
         x := x div t;
         t := 2;
      end
      else
         t := t + 1;
   end;
end;

Chris P 28. Feb 2007 13:21

Re: Primfaktorzerlegung läuft viel zu langsam...
 
Probier mal:
Delphi-Quellcode:
var
   t, x, Count: Int64;

fapsons 28. Feb 2007 13:53

Re: Primfaktorzerlegung läuft viel zu langsam...
 
Super ChrisP,

bist mein persönlicher Held des Tage...;)! Tausenddank!

Chris P 28. Feb 2007 13:57

Re: Primfaktorzerlegung läuft viel zu langsam...
 
Kein Problem :wink:

Freut mich wenn ich dir helfen konnte ...

Gruß
Chris P

MatWur 28. Feb 2007 14:04

Re: Primfaktorzerlegung läuft viel zu langsam...
 
also sortieren^^

@ Chris P: kein Problem :mrgreen:

@ all: der Compiler erkennt den Ausdruck floor(sqrt(x)) als Konstante und berechnet ihn nur einmal. Innerhalb von for-Schleifen sind *immer* Anfangs- und Endwert der Schleife vor Schleifenbeginn bekannt bzw. wurden (1 mal) berechnet.

@ fapsons: es gibt mehrere Lösungsmöglichkeiten für dein problem mit der Schleife.
1.) du kannst theoretisch die Schleife durch eine 'while' oder eine 'repeat' Schleife ersetzen (ist aber kompliziert)
2.) besser du schreibst deine Schleife mit einem normalen Integer und übergibst dessen Wert innerhalb der Schleife einfach an eine Variable vom Typ Int64. Bsp:

Delphi-Quellcode:
var
  i: integer;
  i_gross: int64;
begin
  for i := 0 to 10 do begin
    i_gross := i;
    {rechnen mit i_gross} end;
end;
mfg

Matthias


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:25 Uhr.
Seite 2 von 3     12 3      

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz