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)
- 比較數字並根據比較結果回傳-1
(a <
b)、 0
(a ==
b) 或1
(a >
b)( ucmp
、 cmpn
)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)
- 和 ( 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 許可證獲得許可。