找回密码
 欢迎注册
查看: 29342|回复: 33

[原创] GMP大数运算库的一个Qt界面小程序

[复制链接]
发表于 2010-8-7 18:02:47 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?欢迎注册

×
风云剑兑现了自己一个月前的承诺,相形之下自感惭愧,我岂能言而无信,于是拿出整块的时间,搞了一个GMP的Qt界面,很简单,只有6个函数。

不过,要加其他函数的话非常方便,到时候HugeCalc有了MinGW版本,我再换成HugeCalc的:

2010-08-07_18-01-18.png


===============================================
bin里面的可执行文件是strip过的release版本,才73KB,依赖于三个dll 库, libgmp-10.dll ,QtCore4.dll  ,QtGui4.dll,足有10M有余,所以,没有安装Qt的只好到外面下载了:
http://ifile.it/ilhn9rp/gmpGUI.7z

后面的是源码文件,关于Qt部分,欢迎交流。

bin.zip

29.78 KB, 下载次数: 31, 下载积分: 金币 -1 枚, 经验 1 点, 下载 1 次

毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
 楼主| 发表于 2010-8-7 18:09:59 | 显示全部楼层
用Qt4.6.3 + GCC4.5.0做出来的,编译出来的exe很小,可Qt的两个dll就有10M,压缩后也有3M,只好放在其他服务器上了,
下载地址:
http://ifile.it/ilhn9rp/gmpGUI.7z

里面含有三个dll文件:  libgmp-10.dll ,QtCore4.dll  ,QtGui4.dll和一个主程序gmpGUI.exe
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
 楼主| 发表于 2010-8-9 13:04:39 | 显示全部楼层
呵呵,GMP的命令太底层了,做成界面实在是没啥意思,要是能封装成一种脚本语言,然后还能在界面里解释运行那才有趣。
比如:
1、敲入  gcd 12 32  回车,得到4
2、敲入  set a 6,回车,再敲 a! 得到6的阶乘720
3、敲入 NextPrime  [mul 7 12]  得到84的下一个素数,即89
4、敲入 for {set i 1} {i<=5} {prime ii}  得到前5个素数

................................................
HugeCalc也应该这样,抛弃界面,该成脚本的
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
 楼主| 发表于 2010-8-9 13:19:41 | 显示全部楼层
解释执行效率也并不一定会大打折扣,lua就是一个很好的例子
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2010-8-9 14:01:25 | 显示全部楼层
...
HugeCalc也应该这样,抛弃界面,该成脚本的
wayne 发表于 2010-8-9 13:04


那得加个词法分析器,蛮繁的。
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2010-8-9 14:07:58 | 显示全部楼层
可惜GMP是全英文的介绍,我看不懂,否则用Forcal封装了,想必也比较好用。
楼主若有兴趣,参考我封装HugeCalc的代码FcHugeCalc,实现个FcGMP,应该不是很负杂。
Forcal与lua的速度不相上下,lua支持运算符重载吗?
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
 楼主| 发表于 2010-8-9 16:45:53 | 显示全部楼层
5# gxqcn
那是,白手起家的确很繁,不过,一般的第三方库都提供有脚本语法 设计的功能。
比如Qt里面,有QtScript 模块,Boost里面,有Spirit库........这个时候就不繁了
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
 楼主| 发表于 2010-8-9 16:50:13 | 显示全部楼层
6# forcal

lua是用纯标准C写的。
一个完整的Lua解释器不过200k,在目前所有脚本引擎中,Lua的速度是最快的。

俺不知道C是否支持运算符重载
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
 楼主| 发表于 2010-8-9 16:54:38 | 显示全部楼层
5# gxqcn

给一个例子的截图:
2010-08-09_16-55-22.png

代码地址:
http://doc.qt.nokia.com/4.6/script-qscript.html
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2010-8-9 18:25:19 | 显示全部楼层

lua是用纯标准C写的。
一个完整的Lua解释器不过200k,在目前所有脚本引擎中,Lua的速度是最快的。

俺不知道C是否支持运算符重载
wayne 发表于 2010-8-9 16:50


Forcal是用C/C++写的,核心库FORCAL32W.DLL文件大小:约130K;不使用MSVC运行库的静态库版本,约260K~300K。

以下程序的速度,lua要差一些:
  1. for(x=0.0;x<=1.0;x=x+0.0011)
  2. {
  3.     for(y=1.0;y<=2.0;y=y+0.0011)
  4.     {
  5.         sum=sum+cos(1.0-sin(1.2*pow(x+0.1,y/2.0-x)+cos(1.0-sin(1.2*pow(x+0.2,y/3.0-x))))-cos(1.0-sin(1.2*pow(x+0.3,y/4.0-x)))-cos(1.0-sin(1.2*pow(x+0.4,y/5.0-x)+cos(1.0-sin(1.2*pow(x+0.5,y/6.0-x))))-cos(1.0-sin(1.2*pow(x+0.6,y/7.0-x)))));
  6.     }
  7. }
复制代码
lua代码1:
  1. #!/usr/local/bin/lua

  2. -- By forcal

  3. function sum()
  4.         local t = os.clock()

  5.         local x=0
  6.         local y=0
  7.         local sum=0
  8.         for x=0,1,0.0011 do
  9.                 for y=1,2,0.0011 do   
  10.                         sum=sum+math.cos(1-math.sin(1.2*(x+0.1)^(y/2-x)+math.cos(1-math.sin(1.2*(x+0.2)^(y/3-x))))-math.cos(1-math.sin(1.2*(x+0.3)^(y/4-x)))-math.cos(1-math.sin(1.2*(x+0.4)^(y/5-x)+math.cos(1-math.sin(1.2*(x+0.5)^(y/6-x))))-math.cos(1-math.sin(1.2*(x+0.6)^(y/7-x)))))
  11.                 end

  12.         end
  13.         io.write(sum)

  14.         io.write(string.format("\nTime Elapsed %f\n", os.clock() - t))
  15. end

  16. sum()
复制代码
结果:
19160.536601703
Time Elapsed 3.109000

Forcal代码1:
  1. mvar:
  2. t0=sys::clock(),
  3. sum=0,
  4. x=0,
  5. (x<=1).while{
  6.   y=1,
  7.   (y<=2).while{
  8.     sum=sum+cos(1-sin(1.2*(x+0.1)^(y/2-x)+cos(1-sin(1.2*(x+0.2)^(y/3-x))))-cos(1-sin(1.2*(x+0.3)^(y/4-x)))-cos(1-sin(1.2*(x+0.4)^(y/5-x)+cos(1-sin(1.2*(x+0.5)^(y/6-x))))-cos(1-sin(1.2*(x+0.6)^(y/7-x))))),
  9.     y=y+0.0011
  10.   },
  11.   x=x+0.0011
  12. },
  13. printff{"\r\n{1,r}\r\nTime Elapsed {2,r}\r\n",sum,[sys::clock()-t0]/1000};
复制代码
结果:
19160.536601703152
Time Elapsed 1.984

lua代码2:
  1. #!/usr/local/bin/lua

  2. -- By forcal

  3. function f(x,y)
  4.         return math.cos(1-math.sin(1.2*(x+0.1)^(y/2-x)+math.cos(1-math.sin(1.2*(x+0.2)^(y/3-x))))-math.cos(1-math.sin(1.2*(x+0.3)^(y/4-x)))-math.cos(1-math.sin(1.2*(x+0.4)^(y/5-x)+math.cos(1-math.sin(1.2*(x+0.5)^(y/6-x))))-math.cos(1-math.sin(1.2*(x+0.6)^(y/7-x)))))
  5. end

  6. function sum()
  7.         local t = os.clock()

  8.         local x=0
  9.         local y=0
  10.         local sum=0
  11.         for x=0,1,0.0011 do
  12.                 for y=1,2,0.0011 do   
  13.                         sum=sum+f(x,y)
  14.                 end

  15.         end
  16.         io.write(sum)

  17.         io.write(string.format("\nTime Elapsed %f\n", os.clock() - t))
  18. end

  19. sum()
复制代码
结果:
19160.536601703
Time Elapsed 3.250000

Forcal代码2:
  1. mvar:
  2. f(x,y)=cos(1-sin(1.2*(x+0.1)^(y/2-x)+cos(1-sin(1.2*(x+0.2)^(y/3-x))))-cos(1-sin(1.2*(x+0.3)^(y/4-x)))-cos(1-sin(1.2*(x+0.4)^(y/5-x)+cos(1-sin(1.2*(x+0.5)^(y/6-x))))-cos(1-sin(1.2*(x+0.6)^(y/7-x)))));
  3. t0=sys::clock(),
  4. sum=0,
  5. x=0,
  6. (x<=1).while{
  7.   y=1,
  8.   (y<=2).while{
  9.     sum=sum+f(x,y),
  10.     y=y+0.0011
  11.   },
  12.   x=x+0.0011
  13. },
  14. printff{"\r\n{1,r}\r\nTime Elapsed {2,r}\r\n",sum,[sys::clock()-t0]/1000};
复制代码
结果:
19160.536601703152
Time Elapsed 2.0779999999999998

以上代码1的C++耗时约1.33秒。
以上代码Forcal只输给了matlab的矢量化代码,因为matlab的矢量化代码比C++还快,小于1秒。
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
您需要登录后才可以回帖 登录 | 欢迎注册

本版积分规则

小黑屋|手机版|数学研发网 ( 苏ICP备07505100号 )

GMT+8, 2024-3-29 23:01 , Processed in 0.049579 second(s), 19 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表