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)
- แปลงเป็น base-string และ pad ด้วยเลขศูนย์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
เป็นไบต์ เพื่อให้เข้ากันได้กับ browserify และเครื่องมือที่คล้ายกัน ให้ใช้สิ่งนี้แทน: a.toArrayLike(Buffer, endian, length)
a.bitLength()
- รับจำนวนบิตที่ถูกครอบครองa.zeroBits()
- ส่งกลับจำนวนศูนย์บิตที่ตามมาซึ่งมีนัยสำคัญน้อยกว่า (ตัวอย่าง: 1010000
มี 4 บิตเป็นศูนย์)a.byteLength()
- ส่งคืนจำนวนไบต์ที่ถูกครอบครองa.isNeg()
- เป็นจริงหากตัวเลขเป็นลบ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)
- แปลงเป็นตัวแทนเสริมของ two โดยที่ width
คือความกว้างบิตa.fromTwos(width)
- แปลงจากการเป็นตัวแทนเสริมของ two โดยที่ width
คือความกว้างบิตBN.isBN(object)
- คืนค่าเป็นจริงหาก object
ที่ให้มาเป็นอินสแตนซ์ BN.jsBN.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)
- และ ( 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)
- ไม่ใช่ (สำหรับความกว้างที่ระบุโดย 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 Primes เหล่านี้:
'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