擂台:超大整数高精度快速算法(续)

gxqcn 2004-07-21 07:22:37
我在业余时间开发了一套《超大整数完全精度快速算法库》HugeCalc,
可快速计算超大整数的加、减、乘、除(商/余)、乘方、开方,
也可快速计算大数的 Fibonacci 数列、(双)阶乘、排列、组合等,
还可完成超大整数数组的最大公约数、最小公倍数等数论运算,
现在,该套软件已被华军、天空、电脑之家、天天等下载站点收录。

其最核心的乘法算法现已优于当前的 apfloat、Mathematica,甚至 GMP!
(稍后我将给出详细测试报告,也欢迎广大网友在各种软硬件条件下评测。)

因为 CSDN 是一个高手云集的地方,
所以特借这块宝地广泛征集类似算法或软件,以期达到相互促进的目的。

注:
1、HugeCalc 最新(测试)版下载地址:http://www.freewebs.com/maths/download/HugeCalc.rar

2、声明, 设此擂台的目的是为了相互促进,而非争强斗胜(其实我的计算机水平非常有限,只是比较充分地运用了数学知识而已);

3、算法或软件不限于自身原创,欢迎提供第三方链接信息,谢谢!

4、并不要求所有功能均须强于我现有的软件,有一两项也请及时告诉我,谢谢!

5、特别欢迎各种算法的讨论,本人也将在适当的时机整理出一些核心算法,以便与大家交流;

6、本贴为 http://community.csdn.net/Expert/topic/3049/3049738.xml?temp=.9123499 帖子(因受30次回复限制而结贴)的延续,在此感谢广大网友的热心参与(有156个回帖,是一个难得的专业知识库:),尤其特别感谢 liangbch、shines、yaos 等朋友的热烈讨论。
...全文
2431 点赞 收藏 71
写回复
71 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
rickone 2004-11-20
我想知道是怎么算的啊~~~~
回复
yuxin1 2004-10-23
《数学中国》 http://mathchina.com
http://mathchina.com
http://mathchina.com
<a href="http://mathchina.com">http://mathchina.com</a>
<a href=http://mathchina.com>http://mathchina.com</a>
www.mathchina.com
回复
yuxin1 2004-10-23
收录到《数学中国》,
欢迎大家投稿,
文章要求不象传统杂志那样高
回复
gxqcn 2004-10-18
HugeCalc V3.0.2.1 今天正式发布!包含其所有公共接口文件。

因本人即将受发贴30次的限制,所以将对本贴结贴。请大家继续参与该话题的讨论:
http://community.csdn.net/Expert/topic/3441/3441530.xml
回复
wicoo 2004-10-17
to gxqcn(GxQ)
我的程序使用的是16进制的表示,我指的是两个1,000,000位数的乘法,目前你的程序比我快些,我的FFT算法还需改进.
关于大素数搜索不止是算法公式的问题,这涉及到很多的数论理论,传统的除法(从2试到sqrt(n))当然可以,但是效率太低,比如说要判定一个1000位十进制数是否素数的话计算量可想而知.目前已有的算法都是使用的筛选法,只能判断出该数可能是素数,在一定的概率范围内,比如说Miller-Rabin Primality Test筛选出来的数是素数的概率为:1-2^(-s),s是算法中随意设定的一个数,一般设为1000,当然s越大计算量越大.即使达到了1-2^(-1000)的概率,出现判断错误的机会还是很多,因为目前搜索到的素数已经达到了几百万位,将近千万位了,在百万位级别的范围内搜索的话...如果我们谁能够搜索出世界上第一个千万位素数的话...
算pi并没有多大的实际意义,我的意思是觉得这样比较计算速度比较合适些,并没有觉得你的程序仅能算阶乘,我很欣赏CHugeInt.
回复
gxqcn 2004-10-17
to shines(郭子):
谢谢!因为最终决定开放接口文件,所以对原来的某些函数名作了修改,造成与老版本不兼容,所以版本号的判定已无实际意义。不过,还是非常感谢你,对以后的开发会有用的。

to wicoo(hehe):
正巧,咱们的配置基本相当,我不知你说的“1,000,000位16进制”是指结果的大小,还是参与计算的数的大小?你做到那个速度,已经很不错了。
但我对 HugeCalc 的测试结果为,两个1,204,120位10进制(相当于1,000,000位16进制)的数相乘,仅需1.8s;平方仅需 1.3s;内存消耗没测,但估计也会很小。

任何高精度算法库的核心都离不开对整数序列的计算,当前的 HugeCalc 完成的是其最核心的 CHugeInt,它可以很容易的向浮点推广(不好意思,关于预设精度的计算函数,我没有导出)。我开发该算法库,可并不是拿来仅仅计算一下阶乘而已,最新版的 HugeCalc V3.0.2.1 已完成了比较困难的除法、开方等运算,且同样达到了高效率,比如对 100000! 开 100 次方仅需 1.437s。至于要完成大素数的判定搜索或pi的高精度计算,仅仅是需要一些算法公式而已,而我对它们没有研究,不想重复别人走过的路,除非自己研究出更高效、收敛速度更快的计算公式。。。
回复
wicoo 2004-10-16
FFT只有复数算法,因为旋转因子本身就是一个复数e^(2*pi*k)

所谓整数算法只是针对整数做一些优化,比如说可以一次计算两个实数序列的FFT等等
回复
shines77 2004-10-16
to gxqcn(GxQ):
信收到很久了,一直忘记回。。。不知道你解决了没有,帖在这里吧,祝大家好运

int getLibVersion(char *szLibName, char *szInfoString, char *szVersionInfo)
{
char *lpData = NULL;
UINT wSize;
DWORD dwHandle, dwSize;
LANGANDCODEPAGE *lpTranslate;
int result;

dwSize = GetFileVersionInfoSize(szLibName, &dwHandle);
if(!dwSize)
return 0;

lpData = new char [dwSize];
if(!lpData)
return 0;

result = GetFileVersionInfo(szLibName, dwHandle, dwSize, (LPVOID)lpData);
if(!result)
{
delete[] lpData;
return 0;
}

/*
VS_FIXEDFILEINFO *pFileInfo;
if (!VerQueryValue(lpData, TEXT("\\"), (LPVOID *) &pFileInfo, (PUINT) &BufLen)) {
return 0;
}
else {
printf ("MajorVersion: %d\n", HIWORD(pFileInfo->dwFileVersionMS));
printf ("MinorVersion: %d\n", LOWORD(pFileInfo->dwFileVersionMS));
printf ("BuildNumber: %d\n", HIWORD(pFileInfo->dwFileVersionLS));
printf ("RevisionNumber (QFE): %d\n", LOWORD(pFileInfo->dwFileVersionLS));
}
*/

// get valid resource data using path, handle, and size
result = VerQueryValue(lpData, TEXT("\\VarFileInfo\\Translation"),
(LPVOID*)&lpTranslate, &wSize);
if (result == 0 || wSize == 0)
{
delete[] lpData;
return 0;
}

// Read the file description for each language and code page.
char subBlock[100];
LPVOID lpBuffer;
for(unsigned i=0; i<(wSize/sizeof(struct LANGANDCODEPAGE)); i++)
{
wsprintf(subBlock,
TEXT("\\StringFileInfo\\%04x%04x\\%s"),
lpTranslate[i].wLanguage, lpTranslate[i].wCodePage, szInfoString);

result = VerQueryValue(lpData, subBlock, (LPVOID*)&lpBuffer, &wSize);
if (!result)
break;

strcat(szVersionInfo, (LPCSTR)lpBuffer);
}

delete[] lpData;
return 1;
}

int main (int argc, char *argv[])
{
char szLibFileName[] = TEXT("HugeCalc.dll");
char szLibVersion[256];
for(int i=0; i<256; i++)
szLibVersion[i] = 0;

if(!getLibVersion(szLibFileName, TEXT("ProductVersion"), szLibVersion))
{
strcpy(szLibVersion, "Unavailable"); // 不能取得HugeCalc.dll的版本信息
}

return 0;
}
回复
yaos 2004-10-16
FFT有全整数算法啊
回复
wicoo 2004-10-16
写错了,是e^j(2*k*pi),是个复数
回复
wicoo 2004-10-15
我认为我们不应该在这里比阶乘的计算速度,因为这本身没有什么意义

如果谁能够发现更快更准的素数筛选算法或者找出了一个更大的素数之类的那才是真的厉害

或者比计算pi的速度也起码更有意义一些

回复
wicoo 2004-10-15
关于FFT我比较了解,在这里想说几句
使用FFT是算法复杂度是最低的:NlogN,通常的教科书乘法算法复杂

度达到N^2,而分治法也只能达到N^log2(3),虽然使用更复杂的分治

法能够将复杂度降低到N^(1+e),e->0,但是这是以更多的加法次数

和更复杂的程序代码为代价的,不值得.

FFT快速乘法算法是将整数转换成复数,然后对乘数和被乘数进行

FFT变换(这其中涉及到很多技巧问题,后面再说),然后对变换结果

逐位相乘,然后对乘法结果做反FFT变换就可以得到乘法结果了.

FFT算法的一位复数不能存放太多位的10进制(或者16进制)数,否则

会造成精度丢失.一般来说存放4位比较合适(实践证明).

但是FFT运算时会占用很多的内存,首先是复数存储,在c语言中一个

复数使用两个double类型存储的话将占用16byte内存,将占用大量

内存,另外FFT变换的过程中要使用到的旋转因子W也将占用大量的内存.

我目前的使用FFT算法的快速乘法模块速度大约为1,000,000位16进制

乘法耗时2.8s(赛扬1.7G,256RAM,通常状况)峰值内存耗用大概11.5M

平方模块1,000,000位16进制耗时1.8s(同上)
回复
gxqcn 2004-10-08
利用本次“十一”长假,我对 HugeCalc 作了许多改进:

⊙ 改进了计算 Fibonacci 数列的算法
⊙ 支持十六进制字符串直接对超大整数的初始化或赋值
⊙ 全面提升除法、开方及相关的最大公约数/最小公倍数/进制转换等运算效率
⊙ 修改了 HugeCalc.exe 的界面

HugeCalc Ver3.0.2.1(beta),可从我的个人主页及时更新:
http://www.freewebs.com/maths/download/HugeCalc.rar

(主页服务器不太稳定,有时很难下载;可直接与我联系 gxqcn@163.com)
回复
gxqcn 2004-09-29
更正:上贴 HugeCalc Ver3.0.2.1(beta) 计算耗时的指是:
(10^64 - 1)^10000(即 64 个 9 的 10000 次方)
即指数是 PowCalc 算的10倍。
回复
gxqcn 2004-09-29
我估计你指的是“PowCalc(等幂和计算器)”—— 这是一款界面豪华,使用便捷(仅快捷键就有60多组),有近百项功能的计算器。它是用 VB 开发的,于去年五·一终止开发。

HugeCalc 则完全用 C++ 开发,且大量采用了一些高效算法,速度比 PowCalc 更快,比如:
计算 (10^64 - 1)^1000(即 64 个 9 的 1000 次方和),
PowCalc Ver2002.12.08 需 1.576s
HugeCalc Ver3.0.2.1(beta) 需 0.538s
(P4 1.7GHz / 256MB / XP)

在 yaos 的 http://yaojialin.51.net/download/ 同时提供 PowCalc 及 HugeCalc 免费下载。

HugeCalc 也即将终止开发。

现在正在犹豫是否将公共接口的 .h 及 .lib 文件公开,大家不妨谈谈。。。

注:我在这个帖子中的回复已接近30了,可能又不得不再次结贴了:(
回复
cyj2008 2004-09-29
我记得有一个叫做PowerCalc的计算器,计算任意一个64位数字的大数的1000次方只需要2--3秒钟(我当时的配置是赛扬II950,256 RAM),不知道这算不算快了。
回复
gxqcn 2004-09-28

在不久前正式发布 HugeCalc Ver3.0.1.2 时,
我曾宣称不再更新维护 HugeCalc 了。

现在看来,又要食言了:)HugeCalc Ver3.0.2.1 即将推出!

//===========================================================

对版本升级,并非是因为发现现有版本有bug,
而是为了全面提升除法、开方及相关的最大公约数/最小公倍数/进位制转换等运算效率!

HugeCalc Ver3.0.2.1 计划在 2004.10.18 日正式发布,
我将充分利用“十·一”长假,全面仔细的过滤一遍代码,以确保稳定。

HugeCalc Ver3.0.1.2 正式版可从各大专业下载站点免费下载。
HugeCalc Ver3.0.2.1(beta),可从我的个人主页及时更新:
http://www.freewebs.com/maths/download/HugeCalc.rar
(主页服务器不太稳定,有时很难下载;可直接与我联系)

如有好的建议,欢迎提出。
如果发现bug,请及时将现象反馈给我,谢谢!

祝各位:中秋快乐!

//===========================================================

附速度比对:
(I) 计算 (100000!) / (( 30000!) * (70000!)) 除法部分(456574位/430047位):
HugeCalc V3.0.2.1 需 0.297s
HugeCalc V3.0.1.2 需 32.922s

(II) 计算 (100000!) 开 100 次方:
HugeCalc V3.0.2.1 需 3.750s
HugeCalc V3.0.1.2 需 84.094s

(III) 计算 (100000!) 转换成 16 进位制:
HugeCalc V3.0.2.1 需 17.422s
HugeCalc V3.0.1.2 需 93.531s
回复
gxqcn 2004-09-28
test
回复
carambo 2004-09-26
厉害亚
回复
gxqcn 2004-09-17
以前曾听yao说过,进位制转换有对数级的算法,当时将信将疑。
近期着手该方面的优化,终于开发出了如此高效率的算法(完全自创)!以下是对比数据:

+----------------+--------------------+--------------------+--------------+
| 转换成12进位制 | HugeCalc 3.0.1.1 | HugeCalc 3.0.1.2 | 转换后位数 |
|----------------|--------------------|--------------------|--------------|
| 1,000! | 0.047s | 0.031s | 2,380 位 |
| 10,000! | 6.969s | 2.109s | 33,044 位 |
| 20,000! | 32.844s | 9.343s | 71,663 位 |
| 40,000! | 155.829s | 30.953s | 154,482 位 |
+----------------+--------------------+--------------------+--------------+

+----------------+--------------------+--------------------+--------------+
| 转换成16进位制 | HugeCalc 3.0.1.1 | HugeCalc 3.0.1.2 | 转换后位数 |
|----------------|--------------------|--------------------|--------------|
| 1,000! | 0.031s | 0.031s | 2,133 位 |
| 10,000! | 6.297s | 2.203s | 29,615 位 |
| 20,000! | 29.609s | 8.250s | 64,228 位 |
| 40,000! | 138.704s | 28.297s | 138,453 位 |
+----------------+--------------------+--------------------+--------------+

以上数据表明:
1、HugeCalc V3.0.1.2 比 HugeCalc V3.0.1.1 进位制效率高许多;
2、进位制转换非常耗时(有时比计算数值本身还耗时,因为需要大量的除法运算)。

HugeCalc 自此所有模块均已优化,尽管还有不少改进空间(如乘方取模 PowMod() 运算等),但与当前的意义不大,
所以,HugeCalc 有可能在很长一段时间里不再更新,也就是说,这有可能是其最后一版(除非有单位或个人的资助)。


Dear yao:

我已将压缩包发给您,您可以将网上的文件现在更新,或在下周一左右更新,谢谢!

HugeCalc V3.0.1.2 压缩包文件字节数:
Factorial.zip -- 37,688 字节(36.8 KB)
HugeCalc.rar -- 186,655 字节(182 KB)
HugeCalc.zip -- 194,212 字节(189 KB)

请确认之。
回复
加载更多回复
相关推荐
发帖
数据结构与算法
创建于2007-08-27

3.2w+

社区成员

数据结构与算法相关内容讨论专区
申请成为版主
帖子事件
创建了帖子
2004-07-21 07:22
社区公告
暂无公告