純粋な 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
- 符号なし。演算の実行時にオペランドの符号を無視するか、常に正の値を返します。 2 番目のケースは、 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
(リトルエンディアン) またはbe
(ビッグエンディアン) のいずれかになります。
a.clone()
- クローン番号a.toString(base, length)
- 基本文字列に変換し、ゼロを埋め込みますa.toNumber()
- Javascript Number に変換します (53 ビットに制限)a.toJSON()
- JSON 互換の 16 進文字列に変換します ( toString(16)
のエイリアス)a.toArray(endian, length)
- byte Array
に変換し、オプションで length にゼロ埋めし、すでに超えている場合はスローします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)
- 2 の補数表現に変換します。ここで、 width
はビット幅です。a.fromTwos(width)
- 2 の補数表現から変換しますwidth
はビット幅です。BN.isBN(object)
- 指定されたobject
が BN.js インスタンスの場合は true を返しますBN.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)
- reduct ( 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)
- xor ( 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 ( ) ;
この Readme の最初の手順のほとんどには、対応する部分が赤色のコンテキストで示されています。
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 ライセンスに基づいてライセンスされています。