![]() |
Faktorisierung von Zahlen
Jede ganze Zahl, die keine Primzahl ist, lässt sich als ein Produkt von endlich vielen Primzahlen darstellen. In der Schule lernt man das unter dem Namen Primfaktorzerlegung kennen. In diesem Beitrag möchte ich ein paar
![]() Brute-Force-Methode Die Haudrauf-Methode besteht nur daraus alle ganzen Zahlen von 2 bis n/2 zu durchlaufen und ihre Teilbarkeit zu überprüfen. Hier bei ist es nicht nötig diese Zahlen auf Primalität zu überprüfen, da die Vielfachen der Primzahlen automatisch herausfallen. Ich habe einfach mal diese Brute Force-Methode zusammengehackt:
Delphi-Quellcode:
Zu Bemerken ist, dass diese Algorithmus relativ langsam ist und nur mit kleinen Zahlen arbeiten kann (Innerhalb der Grenzen von Longint).
type
TPFactor = record Base: longint; Power: integer; end; TPFactors = array of TPFactor; function Factorize(const n: longint): TPFactors; var idx: longint; iCount: longint; iTemp: longint; begin SetLength(Result, 0); iCount := 0; iTemp := n; idx := 2; while (idx <= (n div 2)) do begin if (iTemp mod idx = 0) then begin if (iCount > 0) and (Result[iCount-1].Base = idx) and (iCount <> 0) then begin inc(Result[iCount-1].Power); end else begin inc(iCount); SetLength(Result, iCount); Result[iCount-1].Base := idx; Result[iCount-1].Power := 1; end; iTemp := iTemp div idx; end else inc(idx); end; end; Demo: ![]() alzaimar hat noch eine alternative Brute-Force-Methode:
Delphi-Quellcode:
Pollard-Rho-Methode
Procedure Factorize (aNumber : Integer);
Var p, aStop :Integer; f : Boolean; Procedure AddFactor (aFactor : Integer); Begin While (aNumber > 1) And (aNumber mod aFactor = 0) Do Begin form1.memo1.lines.add (IntToStr (aFactor)); aNumber := aNumber div aFactor; aStop := Trunc (Sqrt (aNumber)); End; End; Begin AddFactor (2); AddFactor (3); p := 5; f := True; aStop := Trunc (Sqrt (aNumber)); While p <= aStop do begin AddFactor (p); if f then inc (p,2) else inc (p,4); f := Not f; End; If aNumber > 1 then AddFactor (aNumber); End; Die ![]() ![]() Ansonsten ist noch anzumerken, dass die Pollard-Rho-Methode nur einen ganzzahligen Faktor findet und dieser nicht unbedingt prim sein muss. D.h. um eine komplette Primfaktorzerlegung zu erhalten muss dieser Algorithmus mehrmals hintereinander durchgeführt werden. Rest (u.a. Source) Folgt... |
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:40 Uhr. |
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