bn.js
v5.2.1
纯 JavaScript 中的 BigNum
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
注意:该库不支持小数。
我的开源工作得到了 Scout APM 和其他赞助商的支持。
指令有几个前缀会影响它们的工作方式。以下是按照函数名称中出现的顺序排列的列表:
i
- 就地执行操作,将结果存储在宿主对象(在其上调用该方法)中。可能用于避免号码分配成本u
- 无符号,执行运算时忽略操作数的符号,或始终返回正值。第二种情况适用于mod()
等归约操作。在这种情况下,如果结果为负 - 将向结果添加模以使其为正n
- 函数的参数必须是纯 JavaScript 数字。不支持小数。传递的数字必须小于 0x4000000 (67_108_864)。否则,会抛出错误。rn
- 函数的参数和返回值都是纯 JavaScript 数字。不支持小数。a.iadd(b)
- 对a
和b
执行加法,将结果存储在a
中a.umod(b)
- 减少a
模b
,返回正值a.iushln(13)
- 将a
的位左移 13 前缀/后缀放在行尾的括号中。 endian
- 可以是le
(little-endian) 或be
(big-endian)。
a.clone()
- 克隆号a.toString(base, length)
- 转换为基本字符串并用零填充a.toNumber()
- 转换为 Javascript 数字(限制为 53 位)a.toJSON()
- 转换为 JSON 兼容的十六进制字符串( toString(16)
的别名)a.toArray(endian, length)
- 转换为字节Array
,并且可以选择将零填充到长度,如果已经超过则抛出a.toArrayLike(type, endian, length)
- 转换为type
的实例,其行为必须类似于Array
a.toBuffer(endian, length)
- 转换为 Node.js 缓冲区(如果可用)。 length
(以字节为单位)。为了与 browserify 和类似工具兼容,请改用: a.toArrayLike(Buffer, endian, length)
a.bitLength()
- 获取占用的位数a.zeroBits()
- 返回不太重要的后续零位的数量(例如: 1010000
有 4 个零位)a.byteLength()
- 返回占用的字节数a.isNeg()
- 如果数字为负数则为 truea.isEven()
- 无评论a.isOdd()
- 无评论a.isZero()
- 无评论a.cmp(b)
- 比较数字并根据比较结果( ucmp
、 cmpn
)返回-1
(a <
b)、 0
(a ==
b) 或1
(a >
b)a.lt(b)
- a
小于b
( n
)a.lte(b)
- a
小于或等于b
( n
)a.gt(b)
- a
大于b
( n
)a.gte(b)
- a
大于或等于b
( n
)a.eq(b)
- a
等于b
( n
)a.toTwos(width)
- 转换为二进制补码表示形式,其中width
是位宽度a.fromTwos(width)
- 从二进制补码表示形式转换,其中width
是位宽度BN.isBN(object)
- 如果提供的object
是 BN.js 实例,则返回 trueBN.max(a, b)
- 如果a
大于b
则返回a
BN.min(a, b)
- 如果a
小于b
则返回a
a.neg()
- 负号 ( i
)a.abs()
- 绝对值 ( i
)a.add(b)
- 加法 ( i
, n
, in
)a.sub(b)
- 减法 ( i
, n
, in
)a.mul(b)
- 相乘 ( i
, n
, in
)a.sqr()
- 平方 ( i
)a.pow(b)
- a
的b
次方a.div(b)
- 除法 ( divn
, idivn
)a.mod(b)
- 约简 ( u
, n
) (但没有umodn
)a.divmod(b)
- 通过除法获得的商和模a.divRound(b)
- 舍入除法a.or(b)
- 或 ( i
, u
, iu
)a.and(b)
- and ( i
, u
, iu
, andln
) (注意: andln
将来将被andn
取代)a.xor(b)
- 异或 ( i
, u
, iu
)a.setn(b, value)
- 将指定位设置为value
a.shln(b)
- 左移 ( i
, u
, iu
)a.shrn(b)
- 右移 ( i
, u
, iu
)a.testn(b)
- 测试指定位是否已设置a.maskn(b)
- 清除索引高于或等于b
( i
) 的位a.bincn(b)
- 将1 << b
添加到数字中a.notn(w)
- not(对于w
指定的宽度) ( i
)a.gcd(b)
——GCDa.egcd(b)
- 扩展 GCD 结果 ( { a: ..., b: ..., gcd: ... }
)a.invm(b)
- a
以b
为模取逆当使用相同的模数进行大量归约时,使用一些技巧可能会有所帮助:例如蒙哥马利乘法,或使用梅森素数的特殊算法。
为了启用这个技巧,我们应该创建一个缩减上下文:
var red = BN . red ( num ) ;
其中num
只是一个 BN 实例。
或者:
var red = BN . red ( primeName ) ;
其中primeName
是以下梅森素数之一:
'k256'
'p224'
'p192'
'p25519'
或者:
var red = BN . mont ( num ) ;
用蒙哥马利技巧减少数字。 .mont()
通常比.red(num)
快,但比BN.red(primeName)
慢。
在减少上下文中执行任何操作之前 - 应该将数字转换为它。通常,这意味着人们应该:
以下是将数字转换为red
方法:
var redA = a . toRed ( red ) ;
其中red
是使用上面的说明创建的缩减上下文
以下是将它们转换回来的方法:
var a = redA . fromRed ( ) ;
本自述文件一开始的大多数说明都有红色上下文中的对应内容:
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()
- 平方根模归约上下文的素数a.redInvm()
- 数字的模逆a.redNeg()
a.redPow(b)
- 模幂针对使用 256 位数字的椭圆曲线进行了优化。数字的大小没有限制。
该软件根据 MIT 许可证获得许可。