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()
. في مثل هذه الحالات، إذا كانت النتيجة سلبية - فسيتم إضافة modulo إلى النتيجة لجعلها إيجابية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
(endian الصغير) أو be
(endian الكبير).
a.clone()
- رقم الاستنساخa.toString(base, length)
- تحويل إلى سلسلة أساسية ولوحة بأصفارa.toNumber()
- تحويل إلى رقم Javascript (يقتصر على 53 بت)a.toJSON()
- تحويل إلى سلسلة سداسية عشرية متوافقة مع JSON (الاسم المستعار لـ toString(16)
)a.toArray(endian, length)
- قم بالتحويل إلى byte 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)
- تحويل إلى تمثيل مكمل لاثنين، حيث width
هو عرض البتa.fromTwos(width)
- تحويل من التمثيل المكمل لاثنين، حيث 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)
- reduct ( 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)
- 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 ( ) ;
معظم التعليمات من بداية هذا الملف التمهيدي لها نظيراتها في السياق الأحمر:
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.