用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 谢谢 LZ 对 HugeCalc 的封装。
我近期比较忙,所以没能帮到你什么,倒是你很快就调用起来了。 不错的东东,有时间看看 非常不错!!!支持国产!!! 呵呵,其实我早在两年前csdn上就认识楼主了,而且还知道楼主常在仿真论坛里活跃,
没想到forcal还在继续更新,而且还有有了开发团队,祝贺!!祝福!! 谢谢楼上朋友们的鼓励和关注!
Forcal由于兴趣,一直更新,呵呵。
最近瞄上了郭先生的HugeCalc ,想实现脚本式调用,虽然损失些效率,但增添些脚本式的方便。
根据Forcal的特点,想尽可能以最简单的方式实现HugeCalc 全部功能的调用,由于是抽空一边学习一边干,可能干得会慢一些,请关注的朋友也不要着急哦。 有问题需要请教:
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只负责计算就可以了。 7# forcal 问题1:
CVECTOR_UINT32 结构是一个首指针为常量,总长度固定的连续buffer,主要用于以下几个方面:
[*]作为入参,对一组数进行群组运算:如求Gcd、Lcm、Product、SumsOfLikePowers;
[*]作为入参,对CRadixConverter进行:构造、ResetVector操作;
[*]作为出参,对CRadixConverter进行:GetVector操作(其对象与入参是同一对象) 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)。 明白了,谢谢gxqcn !原来(3)和(2)是等效的。
对于问题1,在脚本中实现的HugeCalc对象已经有HugeInt、HugeIntX和CVECTOR_UINT32 ,还有必要实现其他对象吗?另外,Forcal整数是64位的,有CVECTOR_UINT64吗?如果没有CVECTOR_UINT64,稍微麻烦一点。
对于问题2,为提高效率,我会尽量使用C.Mul(A, B) 方式。另外没有看到加法、减法等其他运算的类似Mul函数形式?如Add、Sub等。