حددات عدد صحيح غير موقّع صغير محمول في C ، للحساب بأعداد كبيرة.
يستخدم مجموعة من uint8_t أو uint16_t أو uint32_t كنوع من البيانات الأساسية باستخدام جميع البتات في كل كلمة.
قاعدة الرقم هي 0x100 أو 0x10000 أو 0x100000000 اعتمادًا على حجم الكلمات المختار-راجع ملف الرأس bn.h للتوضيح.
لا يتم استخدام أي إدارة ديناميكية للذاكرة ، ويتم استخدام stdio.h فقط لاختبار وظائف التحليل من وإلى سلاسل السداسي.
الحساب الأساسي (+، -، *، /، ٪) وعمليات bitwise (& ، | ، ^.
هدف التصميم الرئيسي لهذه المكتبة هو أن تكون صغيرة وصحيحة وذات ذاتي وتستخدم قليلة الموارد مع الحفاظ على الأداء المقبول واكتمال الميزات. وضوح الرمز هو أيضا قيمة عالية.
malloc / free ). هذا هو بنية البيانات المستخدمة ، حيث يكون dtype #define 'd إلى uint8_t ، uint16_t أو uint32_t .
struct bn
{
DTYPE array [ BN_ARRAY_SIZE ];
};هذا هو API الجمهور / المصدر:
/* Initialization functions: */
void bignum_init ( struct bn * n ); /* n gets zero-initialized */
void bignum_from_int ( struct bn * n , DTYPE_TMP i );
int bignum_to_int ( struct bn * n );
/* NOTE: The functions below are meant for testing mainly and expects input in hex-format and of a certain length */
/* See the implementation for details or the test-files for examples of how to use them. */
void bignum_from_string ( struct bn * n , char * str , int nbytes );
void bignum_to_string ( struct bn * n , char * str , int maxsize );
/* Basic arithmetic operations: */
void bignum_add ( struct bn * a , struct bn * b , struct bn * c ); /* c = a + b */
void bignum_sub ( struct bn * a , struct bn * b , struct bn * c ); /* c = a - b */
void bignum_mul ( struct bn * a , struct bn * b , struct bn * c ); /* c = a * b */
void bignum_div ( struct bn * a , struct bn * b , struct bn * c ); /* c = a / b */
void bignum_mod ( struct bn * a , struct bn * b , struct bn * c ); /* c = a % b */
void bignum_divmod ( struct bn * a , struct bn * b , struct bn * c , struct bn * d ); /* c = a/b, d = a%b */
/* Bitwise operations: */
void bignum_and ( struct bn * a , struct bn * b , struct bn * c ); /* c = a & b */
void bignum_or ( struct bn * a , struct bn * b , struct bn * c ); /* c = a | b */
void bignum_xor ( struct bn * a , struct bn * b , struct bn * c ); /* c = a ^ b */
void bignum_lshift ( struct bn * a , struct bn * b , int nbits ); /* b = a << nbits */
void bignum_rshift ( struct bn * a , struct bn * b , int nbits ); /* b = a >> nbits */
/* Special operators and comparison */
int bignum_cmp ( struct bn * a , struct bn * b ); /* Compare: returns LARGER, EQUAL or SMALLER */
int bignum_is_zero ( struct bn * n ); /* For comparison with zero */
void bignum_inc ( struct bn * n ); /* Increment: add one to n */
void bignum_dec ( struct bn * n ); /* Decrement: subtract one from n */
void bignum_pow ( struct bn * a , struct bn * b , struct bn * c ); /* Calculate a^b -- e.g. 2^10 => 1024 */
void bignum_isqrt ( struct bn * a , struct bn * b ); /* Integer square root -- e.g. isqrt(5) => 2 */
void bignum_assign ( struct bn * dst , struct bn * src ); /* Copy src into dst -- dst := src */ قم بتعيين BN_ARRAY_SIZE في bn.h لتحديد حجم الأرقام التي تريد استخدامها. الاختيار الافتراضي هو 1024 بت. اضبط WORD_SIZE على {1،2،4} لاستخدام uint8_t أو uint16_t أو uint32_t كهيكل بيانات أساسي.
قم بتشغيل make clean all test لأمثلة الاستخدام وللحصول على بعض الاختبارات العشوائية.
انظر tests/factorial.c للحصول على مثال على كيفية حساب العامل (100) أو 100! (رقم 150+ رقم).
س: ما الذي يميز هذه المكتبة عن تطبيقات C كبيرة أخرى؟
ج: الحجم الصغير لواحد. ~ 500 سطر من C-code يتجمع إلى 2-3 كيلو بايت من ROM ، باستخدام كميات متواضعة فقط من ذاكرة الوصول العشوائي. استخدام جميع البتات باستخدام قاعدة رقم 2^{8،16،32} بدلاً من 10 وهو خيار معتاد.
س: لماذا لا يوجد دعم لحجم الكلمات 64 بت؟
ج: تتم جميع الحسابات في متغير مؤقت ، والذي يجب أن يكون أكبر من حجم الكلمات (للكشف عن الفائض وما إلى ذلك). لذلك ستحتاج حجم الكلمات 64 بت إلى EG 128 بت temp-var. C99 يدعم فقط الأعداد الصحيحة المحمولة تصل إلى 64 بت.
جميع المواد في هذا المستودع موجودة في المجال العام.