Abteilung für große Zahlen - Stapelüberlauf

Ich brauche einige Divisions-Algorithmus, die große Zahlen (128 Bit) verarbeiten kann. Ich habe schon gefragt, wie es über Bitverschieben Betreiber zu tun. Allerdings ist meine aktuelle Implementierung scheint für einen besseren Ansatz zu fragen







Grundsätzlich ist speichern Zahlen als zwei long long unsigned int ‚s im Format

A * 2 ^ 64 + B mit B < 2 ^ 64 .

Diese Zahl ist teilbar durch 24 und ich möchte es teilen, um 24.

Mein aktueller Ansatz ist es zu transformieren, wie

Dies ist jedoch fehlerhaft.

(Beachten Sie, dass Boden A / 24 ist, und dass mod ist A% 24. Die Normalteilungen in long double gespeichert werden. Die ganzen Zahlen sind in long long unsigned int gespeichert.

Da 24-11.000 binär gleich ist, sollte der zweite Summand nicht etwas im Bereich des vierten Summanden ändern, da es 64 Bits nach links verschoben wird.







Also, wenn A * 2 ^ 64 + B durch 24 teilbar ist, und B ist nicht, es zeigt einfach, dass es Fehler, da es einige nicht-ganzzahlige Zahl zurückgibt.

Was ist der Fehler in meiner Implementierung?

Könnte dies möglicherweise mit inverser Multiplikation gelöst werden? Das erste, was zu beachten ist, dass 24 == 8 * 3 so das Ergebnis der

Sei x = (a >> 3) dann ist das Ergebnis der Division 8 * (x / 3). Nun bleibt den Wert von x / 3 zu finden.

Modularer arithmetische besagt, dass es eine Zahl n derart, dass n * 3 == 1 (mod 2 ^ 128). Das gibt:

Es bleibt die Konstante n zu finden. Es gibt eine Erklärung, wie diese auf Wikipedia zu tun. Sie müssen auch Funktionalität implementieren, um 128-Bit-Zahlen zu multiplizieren.

Hoffe das hilft.

Da 24-11.000 binär gleich ist, sollte der zweite Summand nicht etwas im Bereich des vierten Summanden ändern, da es 64 Bits nach links verschoben wird.

Die Eigenschaft, die Y * 2 ^ 64 nicht nur mit den unteren Gewicht Binärziffern in einer Additions interferieren funktioniert, wenn Y eine ganze Zahl ist.







In Verbindung stehende Artikel