BigNum dalam javascript murni
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
Catatan : desimal tidak didukung di perpustakaan ini.
Pekerjaan Open Source saya didukung oleh Scout APM dan sponsor lainnya.
Ada beberapa awalan pada instruksi yang mempengaruhi cara kerjanya. Berikut daftarnya menurut urutan kemunculannya pada nama fungsi:
i
- melakukan operasi di tempat, menyimpan hasilnya di objek host (tempat metode dipanggil). Mungkin digunakan untuk menghindari biaya alokasi nomoru
- unsigned, abaikan tanda operan saat melakukan operasi, atau selalu kembalikan nilai positif. Kasus kedua berlaku untuk operasi reduksi seperti mod()
. Dalam kasus seperti ini jika hasilnya negatif - modulo akan ditambahkan ke hasilnya untuk menjadikannya positifn
- argumen fungsi harus berupa Nomor JavaScript biasa. Desimal tidak didukung. Angka yang dilewati harus lebih kecil dari 0x4000000 (67_108_864). Jika tidak, kesalahan akan terjadi.rn
- argumen dan nilai kembalian fungsi adalah Angka JavaScript biasa. Desimal tidak didukung.a.iadd(b)
- melakukan penambahan pada a
dan b
, menyimpan hasilnya di a
a.umod(b)
- mengurangi a
b
, mengembalikan nilai positifa.iushln(13)
- menggeser bit ke a
sebanyak 13 Awalan/postfiks diletakkan dalam tanda kurung di akhir baris. endian
- bisa berupa le
(little-endian) atau be
(big-endian).
a.clone()
- nomor klona.toString(base, length)
- konversikan ke string dasar dan pad dengan nola.toNumber()
- konversi ke Nomor Javascript (terbatas hingga 53 bit)a.toJSON()
- mengonversi ke string hex yang kompatibel dengan JSON (alias toString(16)
)a.toArray(endian, length)
- konversikan ke byte Array
, dan opsional zero pad menjadi length, lemparkan jika sudah melebihia.toArrayLike(type, endian, length)
- mengonversi ke instance type
, yang harus berperilaku seperti Array
a.toBuffer(endian, length)
- konversikan ke Node.js Buffer (jika tersedia). length
dalam byte. Untuk kompatibilitas dengan browserify dan alat serupa, gunakan ini sebagai gantinya: a.toArrayLike(Buffer, endian, length)
a.bitLength()
- dapatkan jumlah bit yang ditempatia.zeroBits()
- mengembalikan jumlah bit nol konsekuensi yang kurang signifikan (contoh: 1010000
memiliki 4 bit nol)a.byteLength()
- mengembalikan jumlah byte yang ditempatia.isNeg()
- benar jika angkanya negatifa.isEven()
- tidak ada komentara.isOdd()
- tidak ada komentara.isZero()
- tidak ada komentara.cmp(b)
- bandingkan angka dan kembalikan -1
(a <
b), 0
(a ==
b), atau 1
(a >
b) bergantung pada hasil perbandingan ( ucmp
, cmpn
)a.lt(b)
- a
kurang dari b
( n
)a.lte(b)
- a
kurang dari atau sama dengan b
( n
)a.gt(b)
- a
lebih besar dari b
( n
)a.gte(b)
- a
lebih besar dari atau sama dengan b
( n
)a.eq(b)
- a
sama dengan b
( n
)a.toTwos(width)
- mengonversi ke representasi komplemen dua, dengan width
adalah lebar bita.fromTwos(width)
- mengkonversi dari representasi komplemen dua, di mana width
adalah lebar bitBN.isBN(object)
- mengembalikan nilai true jika object
yang disediakan adalah instance BN.jsBN.max(a, b)
- kembalikan a
jika a
lebih besar dari b
BN.min(a, b)
- kembalikan a
jika a
kurang dari b
a.neg()
- tanda negasi ( i
)a.abs()
- nilai absolut ( i
)a.add(b)
- penjumlahan ( i
, n
, in
)a.sub(b)
- pengurangan ( i
, n
, in
)a.mul(b)
- kalikan ( i
, n
, in
)a.sqr()
- kotak ( i
)a.pow(b)
- naikkan a
ke pangkat b
a.div(b)
- membagi ( divn
, idivn
)a.mod(b)
- reduksi ( u
, n
) (tapi tidak ada umodn
)a.divmod(b)
- hasil bagi dan modulus diperoleh dengan membagia.divRound(b)
- pembagian bulata.or(b)
- atau ( i
, u
, iu
)a.and(b)
- and ( i
, u
, iu
, andln
) (CATATAN: andln
akan diganti dengan andn
di masa mendatang)a.xor(b)
- xor ( i
, u
, iu
)a.setn(b, value)
- menyetel bit tertentu ke value
a.shln(b)
- geser ke kiri ( i
, u
, iu
)a.shrn(b)
- geser ke kanan ( i
, u
, iu
)a.testn(b)
- menguji apakah bit tertentu disetela.maskn(b)
- menghapus bit dengan indeks lebih tinggi atau sama dengan b
( i
)a.bincn(b)
- tambahkan 1 << b
ke nomor tersebuta.notn(w)
- not (untuk lebar yang ditentukan oleh w
) ( i
)a.gcd(b)
- GCDa.egcd(b)
- Hasil GCD yang diperluas ( { a: ..., b: ..., gcd: ... }
)a.invm(b)
- kebalikan dari a
b
Saat melakukan banyak pengurangan menggunakan modulo yang sama, mungkin bermanfaat jika menggunakan beberapa trik: seperti perkalian Montgomery, atau menggunakan algoritma khusus untuk Mersenne Prime.
Untuk mengaktifkan trik ini kita harus membuat konteks pengurangan:
var red = BN . red ( num ) ;
di mana num
hanyalah contoh BN.
Atau:
var red = BN . red ( primeName ) ;
Dimana primeName
adalah salah satu dari bilangan prima Mersenne berikut:
'k256'
'p224'
'p192'
'p25519'
Atau:
var red = BN . mont ( num ) ;
Untuk mengurangi angka dengan trik Montgomery. .mont()
umumnya lebih cepat dari .red(num)
, tetapi lebih lambat dari BN.red(primeName)
.
Sebelum melakukan apa pun dalam konteks pengurangan - angka harus dikonversi ke dalamnya. Biasanya, ini berarti seseorang harus:
Berikut cara mengubah angka menjadi red
:
var redA = a . toRed ( red ) ;
Dimana red
adalah konteks reduksi yang dibuat menggunakan instruksi di atas
Berikut cara mengonversinya kembali:
var a = redA . fromRed ( ) ;
Sebagian besar instruksi dari awal readme ini memiliki padanannya dalam konteks merah:
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()
- bilangan prima konteks reduksi modulo akar kuadrata.redInvm()
- kebalikan modular dari angka tersebuta.redNeg()
a.redPow(b)
- eksponen modularDioptimalkan untuk kurva elips yang bekerja dengan angka 256-bit. Tidak ada batasan ukuran angka.
Perangkat lunak ini dilisensikan di bawah Lisensi MIT.