AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi Primfaktorzerlegung läuft viel zu langsam...
Thema durchsuchen
Ansicht
Themen-Optionen

Primfaktorzerlegung läuft viel zu langsam...

Ein Thema von fapsons · begonnen am 28. Feb 2007 · letzter Beitrag vom 3. Mär 2007
Antwort Antwort
Seite 2 von 3     12 3      
Benutzerbild von Nikolas
Nikolas

Registriert seit: 28. Jul 2003
1.528 Beiträge
 
Delphi 2005 Personal
 
#11

Re: Primfaktorzerlegung läuft viel zu langsam...

  Alt 28. Feb 2007, 13:39
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.
Erwarte das Beste und bereite dich auf das Schlimmste vor.
  Mit Zitat antworten Zitat
Chris P

Registriert seit: 8. Mär 2004
230 Beiträge
 
Delphi 7 Enterprise
 
#12

Re: Primfaktorzerlegung läuft viel zu langsam...

  Alt 28. Feb 2007, 13:44
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.
  Mit Zitat antworten Zitat
fapsons

Registriert seit: 29. Jan 2007
Ort: Berlin
65 Beiträge
 
#13

Re: Primfaktorzerlegung läuft viel zu langsam...

  Alt 28. Feb 2007, 13:46
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*
  Mit Zitat antworten Zitat
fapsons

Registriert seit: 29. Jan 2007
Ort: Berlin
65 Beiträge
 
#14

Re: Primfaktorzerlegung läuft viel zu langsam...

  Alt 28. Feb 2007, 13:49
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?
  Mit Zitat antworten Zitat
Chris P

Registriert seit: 8. Mär 2004
230 Beiträge
 
Delphi 7 Enterprise
 
#15

Re: Primfaktorzerlegung läuft viel zu langsam...

  Alt 28. Feb 2007, 13:52
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.
  Mit Zitat antworten Zitat
fapsons

Registriert seit: 29. Jan 2007
Ort: Berlin
65 Beiträge
 
#16

Re: Primfaktorzerlegung läuft viel zu langsam...

  Alt 28. Feb 2007, 14:10
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;
  Mit Zitat antworten Zitat
Chris P

Registriert seit: 8. Mär 2004
230 Beiträge
 
Delphi 7 Enterprise
 
#17

Re: Primfaktorzerlegung läuft viel zu langsam...

  Alt 28. Feb 2007, 14:21
Probier mal:
Delphi-Quellcode:
var
   t, x, Count: Int64;
  Mit Zitat antworten Zitat
fapsons

Registriert seit: 29. Jan 2007
Ort: Berlin
65 Beiträge
 
#18

Re: Primfaktorzerlegung läuft viel zu langsam...

  Alt 28. Feb 2007, 14:53
Super ChrisP,

bist mein persönlicher Held des Tage...! Tausenddank!
  Mit Zitat antworten Zitat
Chris P

Registriert seit: 8. Mär 2004
230 Beiträge
 
Delphi 7 Enterprise
 
#19

Re: Primfaktorzerlegung läuft viel zu langsam...

  Alt 28. Feb 2007, 14:57
Kein Problem

Freut mich wenn ich dir helfen konnte ...

Gruß
Chris P
  Mit Zitat antworten Zitat
MatWur

Registriert seit: 22. Feb 2007
Ort: Spessart
26 Beiträge
 
Delphi 7 Enterprise
 
#20

Re: Primfaktorzerlegung läuft viel zu langsam...

  Alt 28. Feb 2007, 15:04
also sortieren^^

@ Chris P: kein Problem

@ 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
Matthias
Es gibt drei verschiedene Arten von Mathematikern: die, die bis 3 zählen können und die, die das nicht können.
Ich gehöre zur mittleren Gruppe.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 3     12 3      


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 04:11 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