In 32-Bit-Integer-Mathematik, grundlegende mathematische Operationen von add und multiplizieren implizit mod 2^32 berechnet, was bedeutet, dass Ihre Ergebnisse die niedrigste Reihenfolge sein wird Bits addieren oder multiplizieren.Rechnen (a * b) mod c schnell für c = 2^N + -1
Wenn Sie das Ergebnis mit einem anderen Modulo berechnen möchten, könnten Sie sicherlich eine beliebige Anzahl von BigInt-Klassen in verschiedenen Sprachen verwenden. Und für Werte a, b, c < 2^32 könnten Sie die Zwischenwerte in 64 Bit langen Ints berechnen und integrierte% Operatoren verwenden, um nach rechts zu verkleinern.
Aber mir wurde gesagt, dass es spezielle Tricks gibt zum effizienten Berechnen von a * b mod C, wenn C die Form (2^N) -1 oder (2^N) +1 hat, die keine 64-Bit-Mathematik oder eine BigInt-Bibliothek verwenden und ziemlich effizient sind, mehr als eine willkürliche Modul-Bewertung, und auch richtig berechnen Fällen, die normalerweise ein 32-Bit-Int überlaufen würden, wenn Sie die Zwischen-Multiplikation enthalten.
Leider habe ich trotz der Tatsache, dass solche Spezialfälle eine schnelle Auswertungsmethode haben, keine Beschreibung der Methode gefunden. "Ist das nicht in Knuth?" "Ist das nicht irgendwo auf Wikipedia?" sind die Murmeltiere, die ich gehört habe.
Es ist anscheinend eine allgemeine Technik in Zufallszahlengeneratoren, die Multiplikationen von a * b Mod 2147483647 machen, da 2147483647 eine Primzahl gleich 2^31 -1 ist.
Also werde ich die Experten fragen. Was ist das für eine clevere Sonderfall-Multiply-mit-Mod-Methode, über die ich keine Diskussion habe?
Und immer noch nicht verstehen, die Mathematik dahinter ist, warum ich das Mathe-Minor in der Schule fallen lassen ... –
Nun, es ist eine Art wie den Rest zu bekommen dividiert durch 9 (10-1). Sie addieren nur die Ziffern. In diesem Fall sind Sie statt Base 10 oder Base 2 "Base" 2^N – FryGuy