forcal 发表于 2010-7-30 17:56:04

用Forcal封装HugeCalc大数算法库

关于Forcal,请访问:http://www.forcal.net/

演示程序OpenFC下载:http://www.forcal.net/xiazai/forcal9/openfc32w.rar
FcHugeCalc扩展库下载:http://www.forcal.net/xiazai/forcal9/FcHugeCalc.rar
FcHugeCalc源代码下载:http://www.forcal.net/xiazai/forcal9/FcHugeCalcCode.rar

我对大数计算不熟悉,许多问题还要向版主gxqcn及各位朋友们请教哦。欢迎大家给出任何改进的建议!

FcHugeCalc源代码是公开的,感兴趣的朋友可以自由修改它。

=====================================
        Forcal扩展库之FcHugeCalc:郭先强超大整数完全精度快速算法库
=====================================

用法:

1、下载OpenFC,无需安装,仅需按readme设置好。

2、复制FcHugeCalc32W.dll和HugeCalc.dll两个文件到文件夹“OpenFC\dll”。

3、打开工作区文件“OpenFC.ini”,在#LOAD{... ...}中添加如下行:

        "dll\FcHugeCalc32W.dll"        //郭先强超大整数完全精度快速算法库

4、执行“设置->重载动态库扩展”。

5、可能需要注册后才能正常使用,参考“HugeCalc.chm”。

=====================================

当前可用的函数:

1、HugeCalc::DelAllHC():销毁所有的HugeCalc对象

2、HugeCalc::NowHCNum(100):查看当前存在,尚未销毁的HugeCalc对象,最多显示100个对象

3、HugeCalc::newhc(HI)、HugeCalc::newhc(HIX)、HugeCalc::newhc(VUI32):申请HugeInt对象、申请HugeIntX对象、申请VECTOR_UINT32对象

4、HugeCalc::delhc(p):销毁HugeCalc对象p,p是由函数newhc返回的对象指针

5、HugeCalc::nstr(p,"123"):给HugeCalc对象p赋值为123

6、HugeCalc::show(p):输出HugeCalc对象p的内容

7、HugeCalc::add(a,b,c):计算a=b+c,在函数oo可直接用运算符计算b+c,返回一个临时对象

8、HugeCalc::sub(a,b,c):计算a=b-c,在函数oo可直接用运算符计算b-c,返回一个临时对象

9、HugeCalc::mul(a,b,c):计算a=b*c,在函数oo可直接用运算符计算b*c,返回一个临时对象

10、HugeCalc::div(a,b,c):计算a=b/c,在函数oo可直接用运算符计算b/c,返回一个临时对象

11、HugeCalc::mod(a,b,c):计算a=b%c,在函数oo可直接用运算符计算b%c,返回一个临时对象

12、HugeCalc::pow(a,b,c):计算a=b^c

13、HugeCalc::fac(a,100):计算a=100!

14、HugeCalc::NextPrime(a,b):计算a=比b大的最小的素数

=====================================

例子1:SetTalk;                //关闭计算结果及运行错误输出,并不阻止函数的输出
!using["HugeCalc"];        //使用命名空间HugeCalc,可简化函数的使用
mvar:                        //使用隐含模块变量声明方式
i: printff["\r\n"],        //输出一个换行符
   a=newhc.nstr["1111111111111111111111111111111"].free[],        //申请HugeInt对象并赋值,自动销毁该对象
   b=newhc.nstr["11111111112222222222222"].free[],                //申请HugeInt对象并赋值,自动销毁该对象
   c=newhc.add.show[].free[],        //申请HugeInt对象c,计算c=a+b并输出结果,自动销毁该对象
   printff["\r\n"],                        //输出一个换行符
   oo{.show[]};                //函数oo中的运算符是重载的,计算a+(b+c)+(a+b)并输出结果-------------------------------------

例子2:SetTalk;
!using["HugeCalc"];
mvar:
i: printff["\r\n"],
   a=newhc.nstr["1111111111111111111111111111111"].free[],
   b=newhc.nstr["11111111112222222222222"].free[],
   oo{.show[]};-------------------------------------

例子3:!using["HugeCalc"];
mvar:
i: oo{
        printff["\r\n"],
        //函数oofree[]指出由oo函数销毁该对象
        a=newhc.nstr["1111111111111111111111111111111"].oofree[],
        b=newhc.nstr["11111111112222222222222"].oofree[],
        c=newhc.oofree[],
        , c.pow(a,10), a+(d-a%b)*(a+c/b)].show[]
   };=====================================

forcal        2010.7.29

gxqcn 发表于 2010-7-30 22:04:14

谢谢 LZ 对 HugeCalc 的封装。
我近期比较忙,所以没能帮到你什么,倒是你很快就调用起来了。

无心人 发表于 2010-7-31 22:27:55

不错的东东,有时间看看

wayne 发表于 2010-8-1 14:08:36

非常不错!!!支持国产!!!

wayne 发表于 2010-8-1 14:12:42

呵呵,其实我早在两年前csdn上就认识楼主了,而且还知道楼主常在仿真论坛里活跃,
没想到forcal还在继续更新,而且还有有了开发团队,祝贺!!祝福!!

forcal 发表于 2010-8-2 12:07:50

谢谢楼上朋友们的鼓励和关注!
Forcal由于兴趣,一直更新,呵呵。
最近瞄上了郭先生的HugeCalc ,想实现脚本式调用,虽然损失些效率,但增添些脚本式的方便。
根据Forcal的特点,想尽可能以最简单的方式实现HugeCalc 全部功能的调用,由于是抽空一边学习一边干,可能干得会慢一些,请关注的朋友也不要着急哦。

forcal 发表于 2010-8-4 20:04:07

有问题需要请教:

1、确定需要在脚本中实现的HugeCalc对象,我知道HugeInt和HugeIntX对象是必须的,还需要哪些对象呢?还没有发现CVECTOR_UINT32对象的用处,这个对象有必要提供给脚本用户吗?

2、以下功能上是不是一样的,但返回值有所区别:
        HI_API friend CONST CHugeInt operator *( CONST CHugeInt& left, CONST CHugeInt& right );    (1)
        CHugeInt& Mul( CONST CHugeInt& hugeMultiplicand, CONST CHugeInt& hugeMultiplier );      (2)

    (1)返回一个CHugeInt 对象,而(2)返回一个CHugeInt 对象的引用?
    (1)和(2)生成的对象由谁来销毁?是HugeCalc自动管理的吗?

    如果由HugeCalc自动管理这些临时对象,似乎会降低效率?使用如下函数是否会提高效率:
        void Mul(CHugeInt& result,CONST CHugeInt& hugeMultiplicand, CONST CHugeInt& hugeMultiplier );      (3)
    (3)将实现 result=hugeMultiplicand*hugeMultiplier ,但result、hugeMultiplicand、hugeMultiplier 都是主程序中的CHugeInt对象,HugeCalc只负责计算就可以了。

gxqcn 发表于 2010-8-5 07:46:15

7# forcal 问题1:

CVECTOR_UINT32 结构是一个首指针为常量,总长度固定的连续buffer,主要用于以下几个方面:
[*]作为入参,对一组数进行群组运算:如求Gcd、Lcm、Product、SumsOfLikePowers;
[*]作为入参,对CRadixConverter进行:构造、ResetVector操作;
[*]作为出参,对CRadixConverter进行:GetVector操作(其对象与入参是同一对象)

gxqcn 发表于 2010-8-5 08:03:19

7# forcal 问题2:

由(1)返回一临时对象,由(2)返回现有对象的引用。
后者不产生隐性的构造析构过程,效率更高。其实内部实现就是前者由后者实现的。

(2)的用法如下:
已知大整数A、B、C,则执行 C.Mul(A, B) 表示数学意义上的“C=A*B”

而之所以重载“*”乘法运算符,主要是为了方便人们书写习惯的四则运算,此即(1)的用法:
比如,还可令大整数 E=A*B+C*D;
上式至少含有两个临时对象,由HugeCalc自动管理其生命周期。

如果你用 C++ 调用模式,则没必要用(3)了,它其实等同于(2)。

forcal 发表于 2010-8-5 09:38:08

明白了,谢谢gxqcn !原来(3)和(2)是等效的。

对于问题1,在脚本中实现的HugeCalc对象已经有HugeInt、HugeIntX和CVECTOR_UINT32 ,还有必要实现其他对象吗?另外,Forcal整数是64位的,有CVECTOR_UINT64吗?如果没有CVECTOR_UINT64,稍微麻烦一点。

对于问题2,为提高效率,我会尽量使用C.Mul(A, B) 方式。另外没有看到加法、减法等其他运算的类似Mul函数形式?如Add、Sub等。
页: [1] 2 3 4 5 6
查看完整版本: 用Forcal封装HugeCalc大数算法库