wayne 发表于 2010-8-7 18:02:47

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部分,欢迎交流。

wayne 发表于 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

wayne 发表于 2010-8-9 13:04:39

呵呵,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也应该这样,抛弃界面,该成脚本的

wayne 发表于 2010-8-9 13:19:41

解释执行效率也并不一定会大打折扣,lua就是一个很好的例子

gxqcn 发表于 2010-8-9 14:01:25

...
HugeCalc也应该这样,抛弃界面,该成脚本的
wayne 发表于 2010-8-9 13:04 http://bbs.emath.ac.cn/images/common/back.gif

那得加个词法分析器,蛮繁的。

forcal 发表于 2010-8-9 14:07:58

可惜GMP是全英文的介绍,我看不懂,否则用Forcal封装了,想必也比较好用。
楼主若有兴趣,参考我封装HugeCalc的代码FcHugeCalc,实现个FcGMP,应该不是很负杂。
Forcal与lua的速度不相上下,lua支持运算符重载吗?

wayne 发表于 2010-8-9 16:45:53

5# gxqcn
那是,白手起家的确很繁,不过,一般的第三方库都提供有脚本语法 设计的功能。
比如Qt里面,有QtScript 模块,Boost里面,有Spirit库........这个时候就不繁了

wayne 发表于 2010-8-9 16:50:13

6# forcal

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

俺不知道C是否支持运算符重载

wayne 发表于 2010-8-9 16:54:38

5# gxqcn

给一个例子的截图:


代码地址:
http://doc.qt.nokia.com/4.6/script-qscript.html

forcal 发表于 2010-8-9 18:25:19


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秒。
页: [1] 2 3 4
查看完整版本: GMP大数运算库的一个Qt界面小程序