순수 자바스크립트의 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
(리틀 엔디안) 또는 be
(빅 엔디안)일 수 있습니다.
a.clone()
- 클론 번호a.toString(base, length)
- 기본 문자열로 변환하고 0으로 채웁니다.a.toNumber()
- Javascript 숫자로 변환(53비트로 제한)a.toJSON()
- JSON 호환 16진수 문자열( toString(16)
의 별칭)로 변환합니다.a.toArray(endian, length)
- 바이트 Array
로 변환하고 선택적으로 길이를 0으로 채웁니다. 이미 초과하면 던집니다.a.toArrayLike(type, endian, length)
- Array
처럼 동작해야 하는 type
인스턴스로 변환합니다.a.toBuffer(endian, length)
- Node.js 버퍼로 변환합니다(사용 가능한 경우). length
(바이트)입니다. browserify 및 유사한 도구와의 호환성을 위해 대신 다음을 사용하십시오: a.toArrayLike(Buffer, endian, length)
a.bitLength()
- 점유된 비트 수를 가져옵니다.a.zeroBits()
- 덜 중요한 결과 0 비트 수를 반환합니다(예: 1010000
에는 4개의 0 비트가 있음)a.byteLength()
- 점유된 바이트 수를 반환합니다.a.isNeg()
- 숫자가 음수이면 참a.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
비트 너비인 2의 보수 표현으로 변환합니다.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
역으로 적용 동일한 모듈로를 사용하여 많은 감소를 수행할 때 몽고메리 곱셈이나 Mersenne Prime용 특수 알고리즘을 사용하는 것과 같은 몇 가지 트릭을 사용하는 것이 도움이 될 수 있습니다.
이 트릭을 활성화하려면 축소 컨텍스트를 만들어야 합니다.
var red = BN . red ( num ) ;
여기서 num
BN 인스턴스입니다.
또는:
var red = BN . red ( primeName ) ;
여기서 primeName
은 다음 Mersenne 소수 중 하나입니다.
'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 라이선스에 따라 라이선스가 부여됩니다.