BigNum in reinem Javascript
npm install --save bn.js
const BN = require ( 'bn.js' ) ;
var a = new BN ( 'dead' , 16 ) ;
var b = new BN ( '101010' , 2 ) ;
var res = a . add ( b ) ;
console . log ( res . toString ( 10 ) ) ; // 57047
Hinweis : Dezimalzahlen werden in dieser Bibliothek nicht unterstützt.
Meine Open-Source-Arbeit wird von Scout APM und anderen Sponsoren unterstützt.
Es gibt mehrere Präfixe für Anweisungen, die sich auf deren Funktionsweise auswirken. Hier ist die Liste in der Reihenfolge ihres Auftretens im Funktionsnamen:
i
– Führen Sie den Vorgang direkt aus und speichern Sie das Ergebnis im Hostobjekt (für das die Methode aufgerufen wurde). Kann verwendet werden, um Kosten für die Nummernvergabe zu vermeidenu
– ohne Vorzeichen, ignoriert das Vorzeichen der Operanden bei der Ausführung der Operation oder gibt immer einen positiven Wert zurück. Der zweite Fall gilt für Reduktionsoperationen wie mod()
. Wenn das Ergebnis in solchen Fällen negativ ist, wird Modulo zum Ergebnis addiert, um es positiv zu machenn
– das Argument der Funktion muss eine einfache JavaScript-Zahl sein. Dezimalzahlen werden nicht unterstützt. Die übergebene Zahl muss kleiner als 0x4000000 (67_108_864) sein. Andernfalls wird ein Fehler ausgegeben.rn
– Sowohl das Argument als auch der Rückgabewert der Funktion sind einfache JavaScript-Zahlen. Dezimalzahlen werden nicht unterstützt.a.iadd(b)
– Addition von a
und b
durchführen und das Ergebnis in a
speicherna.umod(b)
– a
modulo b
reduzieren und einen positiven Wert zurückgebena.iushln(13)
– Bits von a
um 13 nach links verschieben Präfixe/Postfixe werden am Ende der Zeile in Klammern gesetzt. endian
– kann entweder le
(Little-Endian) oder be
(Big-Endian) sein.
a.clone()
– Klonnummera.toString(base, length)
– in Basis-String konvertieren und mit Nullen auffüllena.toNumber()
– in Javascript-Nummer konvertieren (begrenzt auf 53 Bit)a.toJSON()
– in einen JSON-kompatiblen Hex-String konvertieren (Alias von toString(16)
)a.toArray(endian, length)
– in Byte- Array
konvertieren und optional mit Nullen auf die Länge auffüllen, auslösen, wenn bereits überschrittena.toArrayLike(type, endian, length)
– konvertiert in eine Instanz von type
, die sich wie ein Array
verhalten mussa.toBuffer(endian, length)
– in Node.js-Puffer konvertieren (falls verfügbar). length
in Bytes. Aus Gründen der Kompatibilität mit browserify und ähnlichen Tools verwenden Sie stattdessen Folgendes: a.toArrayLike(Buffer, endian, length)
a.bitLength()
– Anzahl der belegten Bits ermittelna.zeroBits()
– gibt die Anzahl der weniger signifikanten aufeinanderfolgenden Nullbits zurück (Beispiel: 1010000
hat 4 Nullbits)a.byteLength()
– Anzahl der belegten Bytes zurückgebena.isNeg()
– wahr, wenn die Zahl negativ ista.isEven()
– keine Kommentarea.isOdd()
– keine Kommentarea.isZero()
– keine Kommentarea.cmp(b)
– Zahlen vergleichen und -1
(a <
b), 0
(a ==
b) oder 1
(a >
b) zurückgeben, abhängig vom Vergleichsergebnis ( ucmp
, cmpn
)a.lt(b)
– a
kleiner als b
( n
)a.lte(b)
– a
kleiner oder gleich b
( n
)a.gt(b)
– a
größer als b
( n
)a.gte(b)
– a
größer oder gleich b
( n
)a.eq(b)
– a
ist gleich b
( n
)a.toTwos(width)
– Konvertieren in die Zweierkomplementdarstellung, wobei width
die Bitbreite ista.fromTwos(width)
– Konvertieren aus der Zweierkomplementdarstellung, wobei width
die Bitbreite istBN.isBN(object)
– gibt true zurück, wenn das bereitgestellte object
eine BN.js-Instanz istBN.max(a, b)
– a
zurückgeben, wenn a
größer als b
BN.min(a, b)
– a
zurückgeben, wenn a
kleiner als b
ista.neg()
– Vorzeichen negieren ( i
)a.abs()
– absoluter Wert ( i
)a.add(b)
– Addition ( i
, n
, in
)a.sub(b)
- Subtraktion ( i
, n
, in
)a.mul(b)
– multiplizieren ( i
, n
, in
)a.sqr()
- Quadrat ( i
)a.pow(b)
– a
mit b
potenzierena.div(b)
– dividieren ( divn
, idivn
)a.mod(b)
- reduct ( u
, n
) (aber kein umodn
)a.divmod(b)
– Quotient und Modul, erhalten durch Divisiona.divRound(b)
– gerundete Divisiona.or(b)
- or ( i
, u
, iu
)a.and(b)
– and ( i
, u
, iu
, andln
) (HINWEIS: andln
wird in Zukunft durch andn
ersetzt)a.xor(b)
- xor ( i
, u
, iu
)a.setn(b, value)
– spezifiziertes Bit auf value
setzena.shln(b)
– nach links verschieben ( i
, u
, iu
)a.shrn(b)
– nach rechts verschieben ( i
, u
, iu
)a.testn(b)
– Testen Sie, ob das angegebene Bit gesetzt ista.maskn(b)
– Bits mit Indizes größer oder gleich b
( i
) löschena.bincn(b)
– 1 << b
zur Zahl hinzufügena.notn(w)
– nicht (für die durch w
angegebene Breite) ( i
)a.gcd(b)
– GCDa.egcd(b)
– Erweiterte GCD-Ergebnisse ( { a: ..., b: ..., gcd: ... }
)a.invm(b)
– a
modulo b
umkehren Wenn Sie viele Reduktionen mit demselben Modulo durchführen, kann es von Vorteil sein, einige Tricks anzuwenden: wie die Montgomery-Multiplikation oder die Verwendung eines speziellen Algorithmus für Mersenne-Primzahl.
Um diesen Trick zu ermöglichen, sollte man einen Reduktionskontext erstellen:
var red = BN . red ( num ) ;
wobei num
nur eine BN-Instanz ist.
Oder:
var red = BN . red ( primeName ) ;
Wobei primeName
eine dieser Mersenne-Primzahlen ist:
'k256'
'p224'
'p192'
'p25519'
Oder:
var red = BN . mont ( num ) ;
Zahlen mit Montgomery-Trick reduzieren. .mont()
ist im Allgemeinen schneller als .red(num)
, aber langsamer als BN.red(primeName)
.
Bevor Sie etwas im Reduktionskontext durchführen, sollten Zahlen in diesen konvertiert werden. Normalerweise bedeutet dies, dass man:
So kann man Zahlen in red
umwandeln:
var redA = a . toRed ( red ) ;
Dabei ist red
ein Reduktionskontext, der mithilfe der obigen Anweisungen erstellt wurde
So konvertieren Sie sie zurück:
var a = redA . fromRed ( ) ;
Die meisten Anweisungen vom Anfang dieser Readme-Datei haben ihre Gegenstücke im roten Kontext:
a.redAdd(b)
, a.redIAdd(b)
a.redSub(b)
, a.redISub(b)
a.redShl(num)
a.redMul(b)
, a.redIMul(b)
a.redSqr()
, a.redISqr()
a.redSqrt()
– Primzahl des Quadratwurzel-Modulo-Reduktionskontextsa.redInvm()
– modulare Umkehrung der Zahla.redNeg()
a.redPow(b)
– modulare PotenzierungOptimiert für elliptische Kurven, die mit 256-Bit-Zahlen arbeiten. Es gibt keine Beschränkung hinsichtlich der Größe der Zahlen.
Diese Software ist unter der MIT-Lizenz lizenziert.