GMP 是一个用于高精度数学运算的库,支持整数、有理数和浮点数运算。以下是其主要函数分类及说明:
1. 初始化与内存管理函数
整数(mpz_t)函数
void mpz_init(mpz_t x); // 初始化整数变量
void mpz_clear(mpz_t x); // 清除并释放整数变量内存
void mpz_init_set(mpz_t rop, const mpz_t op); // 初始化并设置为另一个mpz_t的值
浮点数(mpf_t)函数
void mpf_init(mpf_t x); // 初始化浮点数变量
void mpf_clear(mpf_t x); // 清除浮点数变量内存
有理数(mpq_t)函数
void mpq_init(mpq_t x); // 初始化有理数变量
void mpq_clear(mpq_t x); // 清除有理数变量内存
2. 赋值与转换函数
赋值函数
void mpz_set(mpz_t rop, const mpz_t op); // mpz赋值
void mpz_set_ui(mpz_t rop, unsigned long op); // 从无符号长整型赋值
void mpz_set_si(mpz_t rop, signed long op); // 从有符号长整型赋值
void mpz_set_d(mpz_t rop, double op); // 从双精度浮点数赋值
void mpz_set_str(mpz_t rop, const char *str, int base); // 从字符串赋值
转换函数
unsigned long mpz_get_ui(const mpz_t op); // 转换为无符号长整型
signed long mpz_get_si(const mpz_t op); // 转换为有符号长整型
double mpz_get_d(const mpz_t op); // 转换为双精度浮点数
char *mpz_get_str(char *str, int base, const mpz_t op); // 转换为字符串
3. 算术运算函数
基本算术运算
void mpz_add(mpz_t rop, const mpz_t op1, const mpz_t op2); // 加法
void mpz_sub(mpz_t rop, const mpz_t op1, const mpz_t op2); // 减法
void mpz_mul(mpz_t rop, const mpz_t op1, const mpz_t op2); // 乘法
void mpz_add_ui(mpz_t rop, const mpz_t op1, unsigned long op2); // 加无符号整数
void mpz_sub_ui(mpz_t rop, const mpz_t op1, unsigned long op2); // 减无符号整数
void mpz_mul_ui(mpz_t rop, const mpz_t op1, unsigned long op2); // 乘无符号整数
除法与模运算
void mpz_div(mpz_t q, const mpz_t n, const mpz_t d); // 除法
void mpz_mod(mpz_t r, const mpz_t n, const mpz_t d); // 取模
void mpz_divmod(mpz_t q, mpz_t r, const mpz_t n, const mpz_t d); // 同时计算商和余数
void mpz_fdiv_q(mpz_t q, const mpz_t n, const mpz_t d); // 向下取整除法
void mpz_cdiv_q(mpz_t q, const mpz_t n, const mpz_t d); // 向上取整除法
4. 数论函数
void mpz_gcd(mpz_t rop, const mpz_t op1, const mpz_t op2); // 最大公约数
int mpz_probab_prime_p(const mpz_t n, int reps); // 素性测试(概率性)
void mpz_powm(mpz_t rop, const mpz_t base, const mpz_t exp, const mpz_t mod); // 模幂运算
void mpz_pow_ui(mpz_t rop, const mpz_t base, unsigned long exp); // 幂运算
5. 比较函数
int mpz_cmp(const mpz_t op1, const mpz_t op2); // 比较两个mpz_t
int mpz_cmp_ui(const mpz_t op1, unsigned long op2); // 比较mpz_t和无符号长整型
int mpz_cmp_si(const mpz_t op1, signed long op2); // 比较mpz_t和有符号长整型
int mpz_sgn(const mpz_t op); // 返回符号: 1(正), 0(零), -1(负)
6. 位操作函数
void mpz_and(mpz_t rop, const mpz_t op1, const mpz_t op2); // 按位与
void mpz_ior(mpz_t rop, const mpz_t op1, const mpz_t op2); // 按位或
void mpz_xor(mpz_t rop, const mpz_t op1, const mpz_t op2); // 按位异或
void mpz_com(mpz_t rop, const mpz_t op); // 按位取反
void mpz_setbit(mpz_t rop, unsigned long bit_index); // 设置特定位
void mpz_clrbit(mpz_t rop, unsigned long bit_index); // 清除特定位
int mpz_tstbit(const mpz_t op, unsigned long bit_index); // 测试特定位
7. I/O函数
size_t mpz_out_str(FILE *stream, int base, const mpz_t op); // 输出到文件流
size_t mpz_inp_str(mpz_t rop, FILE *stream, int base); // 从文件流读取
void gmp_printf(const char *fmt, ...); // 格式化输出(类似printf)
void gmp_scanf(const char *fmt, ...); // 格式化输入(类似scanf)
8. 随机数生成
void gmp_randinit_default(gmp_randstate_t state); // 初始化随机状态
void mpz_urandomb(mpz_t rop, gmp_randstate_t state, mp_bitcnt_t n); // 生成均匀分布的随机数
void mpz_urandomm(mpz_t rop, gmp_randstate_t state, const mpz_t n); // 生成0到n-1的随机数
使用示例
#include <gmp.h>
#include <stdio.h>
int main() {
mpz_t a, b, c;
// 初始化变量
mpz_init(a);
mpz_init(b);
mpz_init(c);
// 赋值
mpz_set_ui(a, 12345);
mpz_set_str(b, "6543210", 10);
// 计算
mpz_add(c, a, b);
// 输出结果
gmp_printf("Result: %Zd\n", c);
// 清理
mpz_clear(a);
mpz_clear(b);
mpz_clear(c);
return 0;
}
注意事项
- 使用前必须初始化变量,使用后必须清理
- GMP函数通常不检查参数的有效性,需自行确保参数合法
- 对于大数运算,内存管理尤为重要
- 在多线程环境中使用时,需注意随机数生成器的状态管理
- 使用字符串转换函数时,注意内存分配和释放
2014

被折叠的 条评论
为什么被折叠?



