GMP大数库VC使用入门教程
来源:互联网 发布:testok java 编辑:程序博客网 时间:2024/06/10 04:22
Winxos 2009-9-29
GMP是GUN的一套大数库,提供了数百个基础函数,执行效率比较高,但是网上相对来说详细的教程比较少,本教程为大家介绍如何在windows ,vc6.0开发环境下,配置和使用GMP库。
附件下载地址:http://d.namipan.com/sd/929339
附件包括gmp编译好的静态库文件gmp.h gmp.lib 以及一份word文档和gmp函数手册
一、 编译GMP库
直接从GMP主页上下载到的GMP源代码,在windows环境下编译起来相对比较麻烦,所以我还是推荐大家直接使用我已经编译好的库,附件中已经包含。
(使用我编译好的库与你们自己编译的库就是一些参数不同,可能效率有点不一样,但是我们不用管这些细微的差异,主要是看看如何使用GMP库吧)
二、 配置库
编译好的库文件包含gmp.h, gmp.lib两个文件,为了以后编程的方便,建议将这两个文件放到VC系统库目录,这样以后编程的时候就可以具体调用了。
具体的做法:
将gmp.h文件放置到VC头文件目录中,在我电脑中对应的目录为
E:\Program Files\Microsoft Visual Studio\VC98\Include
将gmp.lib文件放置到VC库文件目录中,在我电脑中对应的目录为
E:\Program Files\Microsoft Visual Studio\VC98\Lib
注:如果你的VC装在不同的目录,找到对应的地方就可以了
好了,万事具备了,可以开始编写程序了
三、 编写程序
打开VC6.0,新建一个WIN32 CONSOLE工程(默认的HELLO WORLD 就可以),对工程进行如下设置:
选择 工程 -> 设置 ,如下图
弹出的对话框进行如下图设置,目的是为了添加gmp.lib库文件到工程。
好了,确定完后就可以代码编写了。
在主程序文件输入以下代码:
/*GMP简单教程winxos 2009-9-29*/#include "stdafx.h" //hello world 工程默认的,如果你建立的是空工程就不需要这句#include <gmp.h> //记得引入GMP.H的头文件int main(int argc, char* argv[]){ mpz_t t; //mpz_t 为GMP内置大数类型 mpz_init(t); //大数t使用前要进行初始化,以便动态分配空间 mpz_ui_pow_ui(t,2,100); //GMP所有函数基本都是以mpz打头 gmp_printf("2^100=%Zd\n",t); //输出大数,大数的格式化标志为%Zd mpz_clear(t); return 0;}
编译,运行结果如下:
是不是比较简单呢?相信您一定跃跃欲试了吧^_^
四、 高级教程
对于刚开始使用GMP库来说,就是不知道有哪些函数,容易被它繁多的函数吓到,到官方主页上去,就可以找到最新的帮助文档,英文的。
实际上可以发现它的众多函数命名是比较有规律的,而且对于大数运算来说常用的函数并不多。附件中包含了常用整数函数手册。
GMP的函数命名通常为
mpz_funxx_dataxx
其中funxx表示函数功能,dataxx表示数据类型,dataxx省略通常表示数据都是大数
举例如下:
mpz_t t;//这是类型声明,都需要的东西
mpz_init(t);//普通初始化,还有别的初始化方式,比如赋值初始化
mpz_set_ui(t,2);//赋值操作,ui表示无符号32位整数 //上面两句等同于mpz_init_set_ui(t,2);
mpz_set_str(t, ”1234”);//从字符串赋值,跟上面是不用的赋值类型,str表示字符串
mpz_add(t,a,b);//将大数a+b的结果赋值给t,就是t=a+b
mpz_add_ui(t,a,uib);//将小数uib与大数a求和结果赋值给t,就是t=a+uib
mpz_add_ui(t,t,1);//就是t=t+1
mpz_sub(t,a,b);//减法
mpz_mul(t,a,b);//乘法
gmp_printf(“%Zd”, t);//输出t
其他的类似,请参考手册。
注:如果要熟练还是要多多的练习,应该涉及大数的问题应该不是什么问题了,不过好的算法才是王道。本篇文章意在给那些想处理大数确不知如何使用GMP库的人,winxos自己也是初学者,如果有什么错误恳请指出,一起学习。
再附上一些完整的使用GMP的C++代码。
程序一、
//梅森素数的鲁卡斯测试以及概率测试#include <iostream>#include <gmp>#include <PRIMES.h> //包含了我自己定义的素数相关类,本程序调用了其产生小素数#include <ctime>using namespace std;#pragma comment(lib,"gmp.lib"); //另外一种引用库的方法int IsMersenne(int ExpP){if (ExpP == 2)return 1;mpz_t c, b;mpz_init(c);mpz_init(b);mpz_ui_pow_ui(c, 2, ExpP); mpz_sub_ui(c, c, 1);//M(p) = 2^p-1mpz_set_ui(b, 4);for (int j = 0;j < ExpP-2;j++){mpz_mul(b, b, b);mpz_sub_ui(b, b, 2);mpz_mod(b, b, c);}mpz_clear(c);if (mpz_cmp_ui(b, 0) == 0){mpz_clear(b);return 1;}mpz_clear(b);return 0;}int IsMersenne2(int ExpP){if (ExpP == 2) return 1;mpz_t c;mpz_init(c);mpz_ui_pow_ui(c, 2, ExpP);mpz_sub_ui(c, c, 1);if (mpz_probab_prime_p(c, 5)){return 1;}return 0;}int main(){time_t a,b;PRIMES P; int i, ct = 0;a=time(0);for (i = 900;i < 1100;i++){int ExpP = P.PrimeAt(i);SetTitle(ExpP);if (IsMersenne2(ExpP)){cout<<++ct<<"\t"<<ExpP<<endl;}}b=time(0);cout<<difftime(b,a)<<"秒"<<endl;return 0;}
程序二、
//Euler project 第二十题int e20(){mpz_t n;int i,sum=0;mpz_init_set_ui(n,1);for (i=2;i<=100;i++){mpz_mul_ui(n,n,i);}gmp_printf("%Zd\n",n);while (mpz_cmp_ui(n,0)>0){sum+=mpz_fdiv_ui(n,10);mpz_div_ui(n,n,10);}printf("%d\n",sum);mpz_clear(n);return 0;}
- GMP大数库VC使用入门教程
- 编译GMP大数库
- 大数库比较GMP、MPFP、MPIR、MPC
- GMP大数库实现RSA算法
- gmp大数运算库 window下安装配置和使用(上)
- gmp大数运算库 window下安装配置和使用(下)
- 大数 开方 GMP mpz_sqrt
- 用GMP库实现大数运算的引子
- pollard's rho算法(使用GMP库)
- Eclipse+MingW使用GMP
- RSA加/解密算法——gmp大数库C++实现
- 如何调用GMP大数库中的开N次方函数mpz_root()
- ubuntu10.4下安装和使用GMP高精度数学库
- ubuntu10.4下安装和使用GMP高精度数学库
- Qt使用第三方库GMP,用以超长整数运算
- Linux gmp类库的简单使用(一)
- Linux gmp类库的简单使用(二)
- pollard's p-1算法实现(使用GMP库)
- E: Sub-process /usr/bin/dpkg returned an error code (1)错误解决
- 电子书下载:Delphi XE2 入門指引手冊
- Qt学习笔记4-Widget布局管理
- Fedora5下skyeye安装相关
- 求圆周率(Go语言实现)
- GMP大数库VC使用入门教程
- 分享一个操作xml的代码
- Vim常用命令示意图
- C/C++中最常用字符串函数--不是指string
- iOS学习笔记12-SQLite数据库的简单使用
- Vi 编辑器使用
- Android Studio 在 win7 下的安装和设置
- Android学习笔记——文件路径(/mnt/sdcard/...)、Uri(content://media/external/...)学习
- 6410_io_drv.c: error: invalid operands to binary << (have 'char *' and 'int') 错误处理