找回密码
 欢迎注册
查看: 39991|回复: 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-11-24 09:52 , Processed in 0.032003 second(s), 19 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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