GMP大数运算库的一个Qt界面小程序
风云剑兑现了自己一个月前的承诺,相形之下自感惭愧,我岂能言而无信,于是拿出整块的时间,搞了一个GMP的Qt界面,很简单,只有6个函数。不过,要加其他函数的话非常方便,到时候HugeCalc有了MinGW版本,我再换成HugeCalc的:
===============================================
bin里面的可执行文件是strip过的release版本,才73KB,依赖于三个dll 库, libgmp-10.dll ,QtCore4.dll,QtGui4.dll,足有10M有余,所以,没有安装Qt的只好到外面下载了:
http://ifile.it/ilhn9rp/gmpGUI.7z
后面的是源码文件,关于Qt部分,欢迎交流。 用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 呵呵,GMP的命令太底层了,做成界面实在是没啥意思,要是能封装成一种脚本语言,然后还能在界面里解释运行那才有趣。
比如:
1、敲入gcd 12 32回车,得到4
2、敲入set a 6,回车,再敲 a! 得到6的阶乘720
3、敲入 NextPrime得到84的下一个素数,即89
4、敲入 for {set i 1} {i<=5} {prime ii}得到前5个素数
................................................
HugeCalc也应该这样,抛弃界面,该成脚本的 解释执行效率也并不一定会大打折扣,lua就是一个很好的例子 ...
HugeCalc也应该这样,抛弃界面,该成脚本的
wayne 发表于 2010-8-9 13:04 http://bbs.emath.ac.cn/images/common/back.gif
那得加个词法分析器,蛮繁的。 可惜GMP是全英文的介绍,我看不懂,否则用Forcal封装了,想必也比较好用。
楼主若有兴趣,参考我封装HugeCalc的代码FcHugeCalc,实现个FcGMP,应该不是很负杂。
Forcal与lua的速度不相上下,lua支持运算符重载吗? 5# gxqcn
那是,白手起家的确很繁,不过,一般的第三方库都提供有脚本语法 设计的功能。
比如Qt里面,有QtScript 模块,Boost里面,有Spirit库........这个时候就不繁了 6# forcal
lua是用纯标准C写的。
一个完整的Lua解释器不过200k,在目前所有脚本引擎中,Lua的速度是最快的。
俺不知道C是否支持运算符重载 5# gxqcn
给一个例子的截图:
代码地址:
http://doc.qt.nokia.com/4.6/script-qscript.html
lua是用纯标准C写的。
一个完整的Lua解释器不过200k,在目前所有脚本引擎中,Lua的速度是最快的。
俺不知道C是否支持运算符重载
wayne 发表于 2010-8-9 16:50 http://bbs.emath.ac.cn/images/common/back.gif
Forcal是用C/C++写的,核心库FORCAL32W.DLL文件大小:约130K;不使用MSVC运行库的静态库版本,约260K~300K。
以下程序的速度,lua要差一些:for(x=0.0;x<=1.0;x=x+0.0011)
{
for(y=1.0;y<=2.0;y=y+0.0011)
{
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)))));
}
}lua代码1:#!/usr/local/bin/lua
-- By forcal
function sum()
local t = os.clock()
local x=0
local y=0
local sum=0
for x=0,1,0.0011 do
for y=1,2,0.0011 do
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)))))
end
end
io.write(sum)
io.write(string.format("\nTime Elapsed %f\n", os.clock() - t))
end
sum()结果:
19160.536601703
Time Elapsed 3.109000
Forcal代码1:mvar:
t0=sys::clock(),
sum=0,
x=0,
(x<=1).while{
y=1,
(y<=2).while{
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))))),
y=y+0.0011
},
x=x+0.0011
},
printff{"\r\n{1,r}\r\nTime Elapsed {2,r}\r\n",sum,/1000};结果:
19160.536601703152
Time Elapsed 1.984
lua代码2:#!/usr/local/bin/lua
-- By forcal
function f(x,y)
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)))))
end
function sum()
local t = os.clock()
local x=0
local y=0
local sum=0
for x=0,1,0.0011 do
for y=1,2,0.0011 do
sum=sum+f(x,y)
end
end
io.write(sum)
io.write(string.format("\nTime Elapsed %f\n", os.clock() - t))
end
sum()结果:
19160.536601703
Time Elapsed 3.250000
Forcal代码2:mvar:
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)))));
t0=sys::clock(),
sum=0,
x=0,
(x<=1).while{
y=1,
(y<=2).while{
sum=sum+f(x,y),
y=y+0.0011
},
x=x+0.0011
},
printff{"\r\n{1,r}\r\nTime Elapsed {2,r}\r\n",sum,/1000};结果:
19160.536601703152
Time Elapsed 2.0779999999999998
以上代码1的C++耗时约1.33秒。
以上代码Forcal只输给了matlab的矢量化代码,因为matlab的矢量化代码比C++还快,小于1秒。