Небольшой портативный произвольный характер без знака целочисленной целочисленной арифметики в C, для расчета с большими числами.
Использует массив uint8_t , uint16_t или uint32_t в качестве основного типа данных, используя все биты в каждом словом.
Номерная база составляет 0x100, 0x10000 или 0x100000000 в зависимости от выбранного размера слова-см. Файл заголовка Bn.h для разъяснения.
Динамическое управление памятью не используется, и stdio.h используется только для тестирования функций, анализирующих и обратно.
Основные арифметические (+, -, *, /, %) и битвы (&, |, ^. <<, >>) плюс приращения, уменьшение и сравнения.
Основная цель дизайна этой библиотеки - быть маленькой, правильной, самоудерживаемой и использовать несколько ресурсов, сохраняя при этом приемлемую производительность и полноту. Ясность кода также высоко ценится.
malloc / free ). Это используемая структура данных, где dtype- #define 'd to 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+ цифр).
В: Что отличает эту библиотеку от других CIG Integer реализаций?
A: маленький размер для одного. ~ 500 линий C-кода, компилирующего 2-3 КБ ПЗУ, используя только скромные количества ОЗУ. Используя все биты с использованием численной базы 2^{8,16,32} вместо 10, что является обычным выбором.
В: Почему нет поддержки 64-битного размера слова?
A: Все расчеты выполняются во временной переменной, которая должна быть больше, чем размер слова (для обнаружения переполнения и т. Д.). Таким образом, 64-битный размер слова потребуется, например, 128-битный температуру. C99 поддерживает только портативные целые числа до 64-битных.
Все материалы в этом хранилище находятся в общественном доступе.