Bignum Computing
Header file
#include "mln_bignum.h"
Module
bignum
Structures
typedef struct {
mln_u32_t tag;//positive and negative flag
mln_u32_t length;//The number of elements of data used by the current large number value
mln_u64_t data[M_BIGNUM_SIZE];//value of big number
} mln_bignum_t;
#define M_BIGNUM_POSITIVE 0 //positive
#define M_BIGNUM_NEGATIVE 1 //negative
#define M_BIGNUM_SIZE 257
The implementation of large numbers in Melon is fixed-length, that is, large numbers have an upper limit, and currently supports a maximum of 2048 bits.
Functions/Macros
mln_bignum_new
mln_bignum_t *mln_bignum_new(void);
Description: Create and initialize the big number structure mln_bignum_t allocated by malloc.
Return value: If successful, return a pointer to a big number structure, otherwise return NULL
mln_bignum_pool_new
mln_bignum_t *mln_bignum_pool_new(mln_alloc_t *pool);
Description: Create and initialize the big number structure mln_bignum_t, which is allocated from the memory pool specified by pool.
Return value: If successful, return a pointer to a big number structure, otherwise return NULL
mln_bignum_free
void mln_bignum_free(mln_bignum_t *bn);
Description: Free the big number structure bn, which should have been allocated by mln_bignum_new.
Return value: none
mln_bignum_pool_free
void mln_bignum_pool_free(mln_bignum_t *bn);
Description: Free the big number structure bn, which should have been allocated by mln_bignum_pool_new.
Return value: none
mln_bignum_dup
mln_bignum_t *mln_bignum_dup(mln_bignum_t *bn);
Description: Completely copy a large number structure bn, the copy is allocated by malloc.
Return value: If successful, return a pointer to a big number structure, otherwise return NULL
mln_bignum_pool_dup
mln_bignum_t *mln_bignum_pool_dup(mln_alloc_t *pool, mln_bignum_t *bn);
Description: Make a complete copy of the large number structure bn, and the copy allocates memory on the memory pool specified by pool.
Return value: If successful, return a pointer to a big number structure, otherwise return NULL
mln_bignum_assign
int mln_bignum_assign(mln_bignum_t *bn, mln_s8ptr_t sval, mln_u32_t len);
Description: Assign a big number in string form represented by sval and len to the big number structure bn.
Return value: return 0 if successful, otherwise return -1
mln_bignum_add
void mln_bignum_add(mln_bignum_t *dest, mln_bignum_t *src);
Description: Add big numbers, the result will be put into dest.
Return value: none
mln_bignum_sub
void mln_bignum_sub(mln_bignum_t *dest, mln_bignum_t *src);
Description: Large number subtraction, minuend dest, subtrahend src, the calculation result will be put into dest.
Return value: none
mln_bignum_mul
void mln_bignum_mul(mln_bignum_t *dest, mln_bignum_t *src);
Description: Multiplication of big numbers, the result of the calculation will be put into dest.
Return value: none
mln_bignum_div
int mln_bignum_div(mln_bignum_t *dest, mln_bignum_t *src, mln_bignum_t *quotient);
Description: Large number division, the dividend dest, the divisor src, the remainder will be put in dest, if quotient is not empty, the quotient will be put in it.
Return value: return 0 if successful, otherwise return -1
mln_bignum_pwr
int mln_bignum_pwr(mln_bignum_t *dest, mln_bignum_t *exponent, mln_bignum_t *mod);
Description: Big number exponentiation, computes the exponent power of dest. If mod is not empty, the result is modulo mod. The final calculation result is put into dest.
Return value: return 0 if successful, otherwise return -1
mln_bignum_compare
int mln_bignum_compare(mln_bignum_t *bn1, mln_bignum_t *bn2);
Description: The comparison of signed numeric values.
return value:
1-bn1>bn2-1-bn1<bn20-bn1=bn2
mln_bignum_abs_compare
int mln_bignum_abs_compare(mln_bignum_t *bn1, mln_bignum_t *bn2);
Description: Absolute value comparison.
return value:
1-bn1>bn2-1-bn1<bn20-bn1=bn2
mln_bignum_bit_test
int mln_bignum_bit_test(mln_bignum_t *bn, mln_u32_t index);
Description: Check if the bit is 1 in the big number bn specified by index.
Return value: return 1 if it is 1, otherwise return 0
mln_bignum_left_shift
void mln_bignum_left_shift(mln_bignum_t *bn, mln_u32_t n);
Description: Shift a large number bn left by n bits.
Return value: none
mln_bignum_right_shift
void mln_bignum_right_shift(mln_bignum_t *bn, mln_u32_t n);
Description: Shift a large number bn right by n bits.
Return value: none
mln_bignum_prime
int mln_bignum_prime(mln_bignum_t *res, mln_u32_t bitwidth);
Description: Computes a big prime number of bitwidth bits and writes the result to res.
Return value: return 0 if successful, otherwise return -1
mln_bignum_extend_eulid
int mln_bignum_extend_eulid(mln_bignum_t *a, mln_bignum_t *b, mln_bignum_t *x, mln_bignum_t *y);
Description: A version of the Extended Euclidean Algorithm for big numbers.
Return value: return 0 if successful, otherwise return -1
mln_bignum_i2osp
int mln_bignum_i2osp(mln_bignum_t *n, mln_u8ptr_t buf, mln_size_t len);
Description: Write the binary value of n to the memory specified by buf and len.
Return value: return 0 if successful, otherwise return -1
mln_bignum_os2ip
int mln_bignum_os2ip(mln_bignum_t *n, mln_u8ptr_t buf, mln_size_t len);
Description: Assigns n the binary value in memory pointed to by buf and len. Opposite to mln_bignum_i2osp.
Return value: return 0 if successful, otherwise return -1
mln_bignum_tostring
mln_string_t *mln_bignum_tostring(mln_bignum_t *n);
Description: Convert a big number n to a decimal string format. Do not forget to free the returned string by mln_string_free.
Return value: return the string if successful, otherwise return NULL
mln_bignum_positive
mln_bignum_positive(pbn)
Description: Set the big number pbn of mln_bignum_t* to a positive number.
Return value: none
mln_bignum_negative
mln_bignum_negative(pbn)
Description: Set the big number pbn of mln_bignum_t* to a negative number.
Return value: none
mln_bignum_is_positive
mln_bignum_is_positive(pbn)
Description: Determine whether the big number pbn of mln_bignum_t * is positive.
Return value: return non-0 for regular, otherwise return 0
mln_bignum_is_negative
mln_bignum_is_negative(pbn)
Description: Determine whether the big number pbn of mln_bignum_t * is negative.
Return value: if negative, return not 0, otherwise return 0
mln_bignum_get_length
mln_bignum_get_length(pbn)
Description: Get the number of array elements in data that the value of the big number pbn of mln_bignum_t * occupies.
Return value: the number of elements
mln_bignum_zero
mln_bignum_zero()
Description: Returns a big number with a value of 0.
Return value: constant with a big value of 0
Example
#include "mln_bignum.h"
int main(int argc, char *argv[])
{
mln_string_t *s;
mln_bignum_t n1, n2 = mln_bignum_zero();
mln_bignum_init(n1); //same as mln_bignum_zero
mln_bignum_assign(&n1, "10", 2);
mln_bignum_assign(&n2, "30", 2);
mln_bignum_pwr(&n1, &n2, NULL);
s = mln_bignum_tostring(&n1);
write(STDOUT_FILENO, s->data, s->len);
write(STDOUT_FILENO, "\n", 1);
mln_string_free(s);
return 0;
}