Registriert seit: 21. Jul 2004
Ort: Ostfildern
1.096 Beiträge
FreePascal / Lazarus
|
Re: Guter Algorithmus zum multiplizieren großer Zahlen gesuc
15. Nov 2008, 18:21
Hi,
ich multipliziere, die Unterprozedur @@multiply (welche sich an keinerlei Vereinbarungen hält...) multipliziert jeweils einen 32-Bit-Wert mit dem einen der 128-Bit-Werte, also 4 32-Bit-Multiplikationen, welche ja 64-Bit-Ergebnisse liefern, mit entsprechenden Additionen (Überträge). Das Ergebnis ist eine 160-Bit-Zahl, die erste wird gleich im Ergebnis gespeichert, die anderen drei Zwischenwerte werden in den bufX gespeichert. Zum Schluss werden die Ergebnisse versetzt zusammenaddiert. Das entspricht also der schriftlichen Multiplikation, und prinzipiell ist es deinem Verfahren ähnlich. Ich erwende zwar keine Shifts, aber ich addiere versetzt, und dass Versetzen ist ja der Sinn deiner Shifts.
Insbesondere, dass die Überträge aus dem CF und nicht verloren gehen hat mir Sorgen bereitet.
Insgesamt habe ich 16 mal multipliziert. Ich addiere ja nicht eine Zahl, die so groß ist, dass sie in keinen int64 mehr passt, in einer in dieselbe Größenordnung passenden Anzahl mit sich selbst, das dauert dann ja Jahre. Meine Tests, die unter anderem über 100000000 Multiplikationen enthalten, haben etwa 3,5 Minuten gebraucht (Pentium 4, kein HT, derzeit 2533 MHz). Ich will nicht wissen, was die Additionsvariante benötigen würde.
Mfg
FAlter
Felix Alter
|