eine ungerade long x
, Da ich suche long y
so dass ihr Produkt Modulo 2**64
(dh die normale überquell Arithmetik) gleich 1. Um deutlich zu machen, was ich meine: Das könnte sein in ein paar tausend Jahre auf diese Weise berechnet:Java inverse Modulo 2 ** 64
for (long y=1; ; y+=2) {
if (x*y == 1) return y;
}
ich weiß, dass dies den erweiterten euklidischen Algorithmus gelöst werden kann schnell mit, aber es erfordert die Fähigkeit, alle beteiligten Zahlen darzustellen (in einem Bereich bis zu 2**64
, so dass auch ohne Vorzeichen Arithmetik würde nicht helfen). Die Verwendung von BigInteger
würde sicherlich helfen, aber ich frage mich, ob es einen einfacheren Weg gibt, möglicherweise mit dem erweiterten euklidischen Algorithmus für positive Longs implementiert.
Hacker's Delight [schlägt vor] (http://www.hackersdelight.org/HDcode/mulinv.c.txt) ein Algorithmus für mod 2^32. Ich würde eine Variante davon ausprobieren, obwohl ich natürlich stark testen würde. (Vielleicht ist es das wert, in Guava eingeschlossen zu werden ...) –
@Louis Wasserman: Netter Link ... in der Zwischenzeit denke ich, dass ich etwas 3x schneller habe - ich werde meine Ergebnisse später veröffentlichen. Übrigens, ich brauchte 'pow (long, long)' (fehlt von 'LongMath') für einen Ansatz. – maaartinus
'pow (long, long)' wird absichtlich vermisst, weil das Übernehmen von irgendetwas zu einer Potenz, die nicht in ein "int" passt, im Wesentlichen garantiert überläuft. (Obwohl ich denke, das ist es, was Sie in Ihrem Fall wollen.) –