2010-08-03 5 views
6

Ich habe gerade versucht, Fermat's kleinen Satz in JavaScript zu implementieren. Ich habe es auf beide Arten versucht, a^(p-1) mod p = 1 und a^p mod p = a mod p.Fermat's kleiner Satz in JS

function fermat(a, p) { 
    return (((a^(p - 1)) % p) === 1); 
} 

und

function fermat(a, p) { 
    return ((a^p) % p) === (a % p); 
} 

Es ist nicht in beiden Richtungen funktioniert, ist es eine Möglichkeit, das zu beheben?

Antwort

9

In Javascript verwenden ^ bedeutet XOR. Für exponentiation benötigen Sie Math.pow(x, y).

function fermat(a, p) { 
    return Math.pow(a, p - 1) % p === 1; 
} 
7

Statt ^, müssen Sie Math.pow

2

In Javascript ist der Karat (^) der XOR-Operator. Was Sie verwenden möchten, ist die Math.pow (x, y) -Funktion, die äquivalent zu x^y ist.

3

Zusätzlich zu dem^vs. Math.pow() Problem haben andere darauf hingewiesen, die nächste Hürde werden Sie wahrscheinlich Gesicht ist die begrenzte Genauigkeit der Javascript integrierten numerischen Typen. Sie werden sehr schnell den Bereich der genau darstellbaren Javascript Zahlen überschreiten, sobald die Exponenten beginnen, groß zu werden, wie sie sein werden, wenn Sie wollen, dass eine Routine wie diese als primity Test verwendet wird. Vielleicht möchten Sie in eine JavaScript-Bignum-Bibliothek (z. B. this one), die Exponentiation und Modul für beliebig große Ganzzahlen unterstützt.

+0

Ja, das weiß ich. Ich habe Fermats kleinen Satz bereits in Java implementiert und bekam eine extrem schnelle Antwort, aber als ich versuchte, alle Primzahlen auf 10k zu bringen, lief ich die Grenzen aus. Aber das ist nur für einen Test auf Jsperf (http://jsperf.com/prime-numbers/4), und es funktioniert fast so schnell wie einige Lösungen mit einem Cache (für eine halbe Million Operations-Schleifen). Mir geht es gut mit diesem Ergebnis ... – fb55