BigNum en javascript puro
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
Nota : esta biblioteca no admite decimales.
Mi trabajo de código abierto cuenta con el apoyo de Scout APM y otros patrocinadores.
Hay varios prefijos en las instrucciones que afectan la forma en que funcionan. Aquí está la lista de ellos en el orden de aparición en el nombre de la función:
i
: realizar la operación in situ, almacenando el resultado en el objeto host (en el que se invocó el método). Podría usarse para evitar costos de asignación de númerosu
: sin signo, ignora el signo de los operandos al realizar la operación o siempre devuelve un valor positivo. El segundo caso se aplica a operaciones de reducción como mod()
. En tales casos, si el resultado será negativo, se agregará un módulo al resultado para hacerlo positivo.n
: el argumento de la función debe ser un número de JavaScript simple. No se admiten decimales. El número pasado debe ser menor que 0x4000000 (67_108_864). De lo contrario, se genera un error.rn
: tanto el argumento como el valor de retorno de la función son números simples de JavaScript. No se admiten decimales.a.iadd(b)
: realiza la suma en a
y b
, almacenando el resultado en a
a.umod(b)
- reduce a
módulo b
, devolviendo un valor positivoa.iushln(13)
- desplaza los bits de a
la izquierda en 13 Los prefijos/postfijos se colocan entre paréntesis al final de la línea. endian
: podría ser le
(little-endian) o be
(big-endian).
a.clone()
- número de clonacióna.toString(base, length)
: convierte a cadena base y rellena con cerosa.toNumber()
- convertir a número Javascript (limitado a 53 bits)a.toJSON()
- convierte a una cadena hexadecimal compatible con JSON (alias de toString(16)
)a.toArray(endian, length)
: convertir a byte Array
y, opcionalmente, rellenar con ceros a longitud, arrojar si ya se excedea.toArrayLike(type, endian, length)
: convierte a una instancia de type
, que debe comportarse como una Array
a.toBuffer(endian, length)
: convierte a Node.js Buffer (si está disponible). length
en bytes. Para compatibilidad con browserify y herramientas similares, utilice esto en su lugar: a.toArrayLike(Buffer, endian, length)
a.bitLength()
- obtiene el número de bits ocupadosa.zeroBits()
- devuelve el número de bits cero consiguientes menos significativos (ejemplo: 1010000
tiene 4 bits cero)a.byteLength()
- devuelve el número de bytes ocupadosa.isNeg()
- verdadero si el número es negativoa.isEven()
- sin comentariosa.isOdd()
- sin comentariosa.isZero()
- sin comentariosa.cmp(b)
: compara números y devuelve -1
(a <
b), 0
(a ==
b) o 1
(a >
b) según el resultado de la comparación ( ucmp
, cmpn
).a.lt(b)
- a
menor que b
( n
)a.lte(b)
- a
menor o igual b
( n
)a.gt(b)
- a
mayor que b
( n
)a.gte(b)
- a
mayor o igual b
( n
)a.eq(b)
- a
es igual b
( n
)a.toTwos(width)
: convierte a representación en complemento a dos, donde width
es el ancho en bitsa.fromTwos(width)
: convierte desde la representación en complemento a dos, donde width
es el ancho en bitsBN.isBN(object)
: devuelve verdadero si el object
proporcionado es una instancia de BN.jsBN.max(a, b)
- devuelve a
si a
mayor que b
BN.min(a, b)
- devuelve a
si a
es menor que b
a.neg()
- signo negativo ( i
)a.abs()
- valor absoluto ( i
)a.add(b)
- suma ( i
, n
, in
)a.sub(b)
- resta ( i
, n
, in
)a.mul(b)
- multiplicar ( i
, n
, in
)a.sqr()
- cuadrado ( i
)a.pow(b)
- eleva a
a la potencia de b
a.div(b)
- dividir ( divn
, idivn
)a.mod(b)
- reducir ( u
, n
) (pero no umodn
)a.divmod(b)
- cociente y módulo obtenidos al dividira.divRound(b)
- división redondeadaa.or(b)
- o ( i
, u
, iu
)a.and(b)
- and ( i
, u
, iu
, andln
) (NOTA: andln
será reemplazado por andn
en el futuro)a.xor(b)
- xor ( i
, u
, iu
)a.setn(b, value)
: establece el bit especificado en value
a.shln(b)
- desplazamiento hacia la izquierda ( i
, u
, iu
)a.shrn(b)
- desplazamiento hacia la derecha ( i
, u
, iu
)a.testn(b)
- prueba si el bit especificado está establecidoa.maskn(b)
- borrar bits con índices superiores o iguales a b
( i
)a.bincn(b)
- suma 1 << b
al númeroa.notn(w)
- no (para el ancho especificado por w
) ( i
)a.gcd(b)
- MCDa.egcd(b)
- Resultados de GCD extendidos ( { a: ..., b: ..., gcd: ... }
)a.invm(b)
- inversa a
módulo b
Al realizar muchas reducciones utilizando el mismo módulo, puede resultar beneficioso utilizar algunos trucos: como la multiplicación de Montgomery o utilizar un algoritmo especial para Mersenne Prime.
Para habilitar este truco se debe crear un contexto de reducción:
var red = BN . red ( num ) ;
donde num
es solo una instancia de BN.
O:
var red = BN . red ( primeName ) ;
Donde primeName
es cualquiera de estos Mersenne Primes:
'k256'
'p224'
'p192'
'p25519'
O:
var red = BN . mont ( num ) ;
Reducir números con el truco de Montgomery. .mont()
es generalmente más rápido que .red(num)
, pero más lento que BN.red(primeName)
.
Antes de realizar cualquier cosa en el contexto de reducción, los números deben convertirse a él. Por lo general, esto significa que se debe:
Así es como se pueden convertir números a red
:
var redA = a . toRed ( red ) ;
Donde red
es un contexto de reducción creado siguiendo las instrucciones anteriores
A continuación se explica cómo volver a convertirlos:
var a = redA . fromRed ( ) ;
La mayoría de las instrucciones desde el principio de este archivo Léame tienen sus contrapartes en contexto rojo:
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()
- contexto principal de reducción de módulo de raíz cuadradaa.redInvm()
- inverso modular del númeroa.redNeg()
a.redPow(b)
- exponenciación modularOptimizado para curvas elípticas que funcionan con números de 256 bits. No hay limitación en el tamaño de los números.
Este software tiene la licencia MIT.