![]() |
FFT für schnelle Multiplikation
Hallo,
ich beschäftige mich derzeit mit der Implementation schneller Algorithmen auf meinem Computer, dazu wäre eine schnelle Multiplikation erforderlich. Nun gibt es den Schönhagen-Strasse Algorithmus der eine Schnelle Fourier Transformation (FFT) beschreibt, um 2 Zahlen in Binärdarstellung mit einem besserem Laufzeitverhalten zu multiplizieren als dies die Schulmethode oder das Verfahren nach Karazuba können. Diesen FFT-Algorithmus (eine gute Beschreibung kann man hier finden: ![]() Hmmm, so wird das nix mit der schnellen Multiplikation und mir... Ich weiss nun, das es bereits sehr gute Implementierungen dieser FFT gibt, z. Bsp. in GIMPS (einem Projekt zur Suche grosser Primzahlen, evtl. mal nach googeln). Und diese Implementierungen sind nicht nur schnell sondern auch Speicherschonend. Dr. Woltman (der Programmierer der meisten Routinen des GIMPS-Projektes) hat nun den Quellcode seiner Implementation veröffentlicht (kann auf der GIMPS Homepage runtergeladen werden), leider kann ich mit diesem C++ Code gar nichts anfangen :wall: Deswegen nun meine Frage: kann mir jemand der sich mit diesem FFT-Algorithmus auskennt den entscheidenden Hinweis geben, wie ich auf einen erträglichen Speicherbedarf komme? Bzw. (was fast noch besser wäre) gibt es einen öffentlich zugänglichen Quellcode in Pascal/Assembler, der diesen Algorithmus speicherschonend und schnell implementiert (an Beispielen lernt sich's bekanntermaßen am einfachsten :D)? Vielen Dank schon im vorraus für jede Lösungshife Matthias |
Re: FFT für schnelle Multiplikation
Hallo MatWur und willkommen bei dp...
Ich habe mich mal kurz umgeschaut auf der Seite aber jetzt nicht direkt den C-Algo gefunden. Vielleicht kannst ja mal einen Direktlink raussuchen. Gibt hier sicher einige Leute die auch ne menge Spaß am "übersetzen" von C->Delphi haben. Die Jungs werden dir sicher unter die Arme greifen :-) Hast du mal drüber nachgedacht den Algo in eine dll auszulagern? also in c zu kompilieren und in dein delphi projekt zu laden? wäre vielleicht auch noch ein ansatz. Gruß Reli |
Re: FFT für schnelle Multiplikation
ja, Danke Schön erst einmal und noch ein Hallo in die Runde ;)
den GIMPS Source-Code gibt es hier: ![]() zu der anderen Webpage gibt es keinen Source-code, nur das Progrämmchen in Pseudo-code am Ende der Seite. Ich selber habe keinen C++ Compiler, bisher kam ich mit meiner alten Delphi-Version eigentlich immer aus. Ich habe versucht aus einigen der Codes schlau zu werden, aber welcher Delphi-Programmierer versteht schon sowas wie k-==++! (oder so ähnlich...ich mag kein C++ ;) ) :mrgreen: Mir geht es darum selber eine brauchbare FFT-Multiplikation in Pascal/Assembler zu schreiben, ich möchte mir da ein kleines Paket (evtl. in einer DLL, aber wohl eher in einer Delphi-Unit) zusammenschreiben mit schnellen Routinen für sehr grosse Ganzzahlen um ein paar Zahlentheoretische Probleme anzugehen. Aber solch eine FFT-Multiplikation ist dazu zwingende Voraussetzung, den die traditionellen Verfahren werden bei Zahlen dieser Grössenordnung einfach zu langsam. Und mein bisheriges Wissen erfordert bei der Implementation viel zu viel Speicher während der Multiplikation. Ich weiss von GIMPS das die bei der Multiplikation (respektive dort wird quadriert, was mir prinzipiell auch reichen würde) lediglich das doppelte des Speicherplatzbedarfes der Ausgangszahl brauchen, wie das gemacht wird, genau das müsste ich wissen :gruebel: mfg Matthias |
Re: FFT für schnelle Multiplikation
Zitat:
Stop ;) du implementierst da den falschen Algortihmus. In der Zahlentheorie bzw. den dazu nötigen Bibliotheken wird der modulare Fermat Schönhage Strassen benutzt. Dieser arbeitet nicht mit komplexen Zahlen sondern modular zu Fermat'schen Zahlen -> die sind praktisch gesehen vergleichbar mit Primzahlen (aus Sicht ihrer Eigenschaften für diese FFT) Je nach Implementierung benötigt man Ln2(A) + Ln2(B) an Speicher minimal (A * B), d.h. wenn man inplaced multipliziert und den Speicher der Multiplikanten überschreibt. Das ist unpraktisch und meistens wird man die doppelte Menge an Speicher benötigen (alleine schon weil man für das Resulat die beiden separaten Speicherbereiche für A und B ja in einem linearen Speicherbereich für das Resultat bringen muß, und meistens liegen A und B nicht lückenlos hintereinander im Speicher). Aber auch dies dürfte noch sehr optimistisch sein da man unter Umständen die Multiplikanten expandieren muß, dh. Nullen dranhängen. Meine eigene Implementierung der "modularen Fermat Schönhage Strassen FFT" benötigt im schlechtesten Falle 3 mal mehr Speicher als die Multiplikanten an Speicher belegen. Dies liegt daran das alle meine LowLevel Routinen meistens nicht Inplaced arbeiten bei solch komplexen Berechnungen. Dh. diese Routinen kopieren quasi Speicherbereiche in einen neuen Speicherbereich und erledigen nebenbei die mathematische Operation. Dies hat sich aus Sicht der Gesamtperformance als am besten heraus gestellt. Was eben zu Folge hat das man zb. in der FFT mehr an Speicher benötigt als theoretisch minimal notwendig. Du solltest unbedingt zu Vergleichszwecken während deiner Entwicklung eine funktionsfähige Fremdbibliothek benutzen. Ich hatte zb. lange Zeit mit meinem DecMath gearbeitet und erst sehr spät festgestellt das bei der Berechnung der Konstante Pi mit mehr als 16 Millionen Stellen in meinen FFT Funktionen ein "hinterfo..iger" Bit-Überlauf-Fehler auftrat. Finden konnte ich ihn nur weil ich eine "Fremdbibliothek" (meine alten TBigNums ;) ) zum Vergleich heranzog. Gruß Hagen |
Re: FFT für schnelle Multiplikation
Zitat:
Zitat:
Zitat:
Zitat:
Mit TBigNums habe ich schon vor Jahren mal ein bischen rumgespielt. Das war also quasi die Vorgängerversion von DecMath. Hochinteressant einmal soche Info's aus erster Hand zu beziehen :-D Herzlichen Dank noch einmal an dich Hagen :kiss: , diese Informationen nützen mir definitiv was. Ich muss jetzt erst mal ein wenig Theorie wälzen und rumgurgeln (...ehhh rumkugeln.... ne, rumgoogeln, jetzt habsch's :mrgreen: ). Für jeden weiteren Hinweis, insbesondere zum modularen Fermat Schönhage Strassen Algorithmus, wäre ich selbstverständlich auch weiterhin sehr dankbar. bis denne Matthias |
Re: FFT für schnelle Multiplikation
Zitat:
Die Zahl 2^(2^27)-1 benötigt exakt 2^27 Bits im Speicher und Ln2(2^2^27) ist nach meinem Wissen 2^27. Die Multiplikation von 2 Zahlen mit 2^27 Bits jeweils ergibt also ein Resulat mit 2^(27*2) Bits. Ln2(A) + Ln2(B) = Ln2(Resulat) -> Result := A * B; Ln2(A) = Anzahl Bits die die Zahl A benötigt. Ich weiß nicht, aber ich wäre total am Boden zerstört wenn das falsch sein sollte ;) Gruß Hagen |
Re: FFT für schnelle Multiplikation
jau (rotwerd :duck: ), ich bau' mir jetzt ein Vogelhäuschen aus dem Brett vor meinem Kopf... siehe meine Signatur :mrgreen: nenene, manomanoman... :wall:
bis denne, ich muss wohl erst mal schlafen gehen Matthias |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:24 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 by Thomas Breitkreuz