BigNum на чистом JavaScript
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
(с прямым порядком байтов), либо be
(с прямым порядком байтов).
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 Buffer (если доступен). length
в байтах. Для совместимости с браузером и подобными инструментами используйте вместо этого: a.toArrayLike(Buffer, endian, length)
a.bitLength()
— получить количество занятых битовa.zeroBits()
— возвращает количество младших последовательных нулевых битов (пример: 1010000
имеет 4 нулевых бита)a.byteLength()
— возвращает количество занятых байтовa.isNeg()
— true, если число отрицательноеa.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)
— возвращает true, если предоставленный object
является экземпляром BN.js.BN.max(a, b)
— возвращает a
если a
больше b
BN.min(a, b)
— вернуть a
если a
меньше b
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)
- 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)
— НОДa.egcd(b)
— расширенные результаты НОД ( { 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.