GMP常用函数及说明

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;
}

注意事项

  1. 使用前必须初始化变量,使用后必须清理
  2. GMP函数通常不检查参数的有效性,需自行确保参数合法
  3. 对于大数运算,内存管理尤为重要
  4. 在多线程环境中使用时,需注意随机数生成器的状态管理
  5. 使用字符串转换函数时,注意内存分配和释放
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值