大数高精度计算库gmp简介

时间:2022-05-04 03:26:47

1、编译安装,我用的ubuntu18.04

$sudo apt-get install m4  //默认没安装,gmp用这个
$tar -jvxf gmp-6.1..tar.bz2 //解压
$cd gmp-6.1.
$./configure --enable-cxx //开启c++支持
$make
$make check //注意必须检测一下,gmp官方特别提醒的
$sudo make install

主要函数:

初始化函数:

mpz_t a, b, c;
mpz_init(a);
mpz_init_set_str(b, "", );
mpz_init_set_str(c, "", );

输出函数:

gmp_printf("%Zd\n", b);

加法,减法,乘法:

mpz_add(a, b, c);
mpz_sub(a, b, c);
mpz_mul(a, b, c);

除法:

/*求商,向上取整*/
mpz_cdiv_q (a, b, c);
/*求余数,由于求商是向上取整,所以余数为0或者负数*/
mpz_cdiv_r (a, b, c); /*求商,向下取整*/
mpz_fdiv_q (a, b, c);
/*求余数,由于求商是向下取整,所以余数为0或者正数*/
mpz_fdiv_r (a, b, c);

比较:

/*b大于c,返回1;b等于c,返回0;b小于c,返回-1*/
mpz_cmp(b, c);

求平方根:

/*结果向下取整*/
mpz_sqrt(a, b);

最大公约数:

mpz_gcd(a, b, c);

判断是否是一个质数的次幂:

mpz_perfect_power_p(b);

幂运算:

mpz_pow_ui(a, b, );

2、例子:

#include <gmpxx.h>
#include <iostream>
#include <stdio.h>
using namespace std;
int main()
{
mpz_t a,b,c;
mpz_init(a);
mpz_init(b);
mpz_init(c);
gmp_scanf("%Zd%Zd",a,b);
mpz_add(c,a,b);
gmp_printf("c= %Zd\n",c);
return ;
}

编译:

$g++ test.cpp -o test -lgmp -lgmpxx结果: 

输入两个数,得到c为2数之和。

附录:一篇高质量应用gmp的文章:https://www.cnblogs.com/y3w3l/p/5947450.html