BigNum em 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 : decimais não são suportados nesta biblioteca.
Meu trabalho de código aberto é apoiado pelo Scout APM e outros patrocinadores.
Existem vários prefixos para instruções que afetam a maneira como funcionam. Aqui está a lista deles na ordem em que aparecem no nome da função:
i
- executa a operação in-loco, armazenando o resultado no objeto host (no qual o método foi invocado). Pode ser usado para evitar custos de alocação de númerosu
- sem sinal, ignora o sinal dos operandos ao realizar a operação, ou sempre retorna valor positivo. O segundo caso se aplica a operações de redução como mod()
. Nesses casos, se o resultado for negativo - o módulo será adicionado ao resultado para torná-lo positivon
- o argumento da função deve ser um número JavaScript simples. Decimais não são suportados. O número passado deve ser menor que 0x4000000 (67_108_864). Caso contrário, um erro será gerado.rn
- tanto o argumento quanto o valor de retorno da função são números JavaScript simples. Decimais não são suportados.a.iadd(b)
- realiza adição em a
e b
, armazenando o resultado em a
a.umod(b)
- reduz a
módulo b
, retornando valor positivoa.iushln(13)
- desloca bits à a
em 13 Prefixos/pós-fixos são colocados entre parênteses no final da linha. endian
- pode ser le
(little-endian) ou be
(big-endian).
a.clone()
- número do clonea.toString(base, length)
- converte para string base e preenche com zerosa.toNumber()
- converte para número Javascript (limitado a 53 bits)a.toJSON()
- converte para string hexadecimal compatível com JSON (alias de toString(16)
)a.toArray(endian, length)
- converte em byte Array
e, opcionalmente, zero pad em length, lançando se já excedera.toArrayLike(type, endian, length)
- converte para uma instância de type
, que deve se comportar como um Array
a.toBuffer(endian, length)
- converte para Node.js Buffer (se disponível). length
em bytes. Para compatibilidade com browserify e ferramentas semelhantes, use isto: a.toArrayLike(Buffer, endian, length)
a.bitLength()
- obtém o número de bits ocupadosa.zeroBits()
- retorna o número de zero bits consequentes menos significativos (exemplo: 1010000
tem 4 bits zero)a.byteLength()
- retorna o número de bytes ocupadosa.isNeg()
- verdadeiro se o número for negativoa.isEven()
- sem comentáriosa.isOdd()
- sem comentáriosa.isZero()
- sem comentáriosa.cmp(b)
- compare números e retorne -1
(a <
b), 0
(a ==
b) ou 1
(a >
b) dependendo do resultado da comparação ( ucmp
, cmpn
)a.lt(b)
- a
menor que b
( n
)a.lte(b)
- a
menor ou igual b
( n
)a.gt(b)
- a
maior que b
( n
)a.gte(b)
- a
maior ou igual b
( n
)a.eq(b)
- a
é igual b
( n
)a.toTwos(width)
- converte para representação de complemento de dois, onde width
é largura de bitsa.fromTwos(width)
- converte da representação em complemento de dois, onde width
é a largura em bitsBN.isBN(object)
- retorna verdadeiro se o object
fornecido for uma instância BN.jsBN.max(a, b)
- retorna a
se a
maior que b
BN.min(a, b)
- retorna a
se a
menor que b
a.neg()
- sinal de negação ( i
)a.abs()
- valor absoluto ( i
)a.add(b)
- adição ( i
, n
, in
)a.sub(b)
- subtração ( i
, n
, in
)a.mul(b)
- multiplique ( i
, n
, in
)a.sqr()
- quadrado ( i
)a.pow(b)
- eleva a
à potência de b
a.div(b)
- dividir ( divn
, idivn
)a.mod(b)
- reduct ( u
, n
) (mas não umodn
)a.divmod(b)
- quociente e módulo obtido pela divisãoa.divRound(b)
- divisão arredondadaa.or(b)
- ou ( i
, u
, iu
)a.and(b)
- and ( i
, u
, iu
, andln
) (NOTA: andln
será substituído por andn
no futuro)a.xor(b)
- xor ( i
, u
, iu
)a.setn(b, value)
- define o bit especificado como value
a.shln(b)
- deslocamento para a esquerda ( i
, u
, iu
)a.shrn(b)
- deslocar para a direita ( i
, u
, iu
)a.testn(b)
- testa se o bit especificado está definidoa.maskn(b)
- limpa bits com índices maiores ou iguais a b
( i
)a.bincn(b)
- adicione 1 << b
ao númeroa.notn(w)
- not (para a largura especificada por w
) ( i
)a.gcd(b)
- GCDa.egcd(b)
- Resultados GCD estendidos ( { a: ..., b: ..., gcd: ... }
)a.invm(b)
- inverso a
módulo b
Ao fazer muitas reduções usando o mesmo módulo, pode ser benéfico usar alguns truques: como a multiplicação de Montgomery ou usar um algoritmo especial para Mersenne Prime.
Para habilitar este truque deve-se criar um contexto de redução:
var red = BN . red ( num ) ;
onde num
é apenas uma instância de BN.
Ou:
var red = BN . red ( primeName ) ;
Onde primeName
é um destes Mersenne Primes:
'k256'
'p224'
'p192'
'p25519'
Ou:
var red = BN . mont ( num ) ;
Para reduzir números com o truque de Montgomery. .mont()
é geralmente mais rápido que .red(num)
, mas mais lento que BN.red(primeName)
.
Antes de realizar qualquer coisa no contexto de redução - os números devem ser convertidos para ele. Normalmente, isso significa que se deve:
Aqui está como se pode converter números em red
:
var redA = a . toRed ( red ) ;
Onde red
é um contexto de redução criado usando as instruções acima
Veja como convertê-los de volta:
var a = redA . fromRed ( ) ;
A maioria das instruções desde o início deste leia-me tem suas contrapartes no contexto vermelho:
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()
- raiz quadrada do contexto de redução do móduloa.redInvm()
- inverso modular do númeroa.redNeg()
a.redPow(b)
- exponenciação modularOtimizado para curvas elípticas que funcionam com números de 256 bits. Não há limitação quanto ao tamanho dos números.
Este software está licenciado sob a licença MIT.