数学研发论坛

 找回密码
 欢迎注册
查看: 10145|回复: 50

[讨论] 用Forcal封装HugeCalc大数算法库

[复制链接]
发表于 2010-7-30 17:56:04 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?欢迎注册

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

例子2:
  1. SetTalk[false];
  2. !using["HugeCalc"];
  3. mvar:
  4. i: printff["\r\n"],
  5.    a=newhc[HI].nstr["1111111111111111111111111111111"].free[],
  6.    b=newhc[HI].nstr["11111111112222222222222"].free[],
  7.    oo{[c=a%b, a+(b-a%b)*(a+b/c)].show[]};
复制代码
-------------------------------------

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

forcal        2010.7.29
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2010-7-30 22:04:14 | 显示全部楼层
谢谢 LZ 对 HugeCalc 的封装。
我近期比较忙,所以没能帮到你什么,倒是你很快就调用起来了。
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2010-7-31 22:27:55 | 显示全部楼层
不错的东东,有时间看看
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2010-8-1 14:08:36 | 显示全部楼层
非常不错!!!支持国产!!!
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2010-8-1 14:12:42 | 显示全部楼层
呵呵,其实我早在两年前csdn上就认识楼主了,而且还知道楼主常在仿真论坛里活跃,
没想到forcal还在继续更新,而且还有有了开发团队,祝贺!!祝福!!
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
 楼主| 发表于 2010-8-2 12:07:50 | 显示全部楼层
谢谢楼上朋友们的鼓励和关注!
Forcal由于兴趣,一直更新,呵呵。
最近瞄上了郭先生的HugeCalc ,想实现脚本式调用,虽然损失些效率,但增添些脚本式的方便。
根据Forcal的特点,想尽可能以最简单的方式实现HugeCalc 全部功能的调用,由于是抽空一边学习一边干,可能干得会慢一些,请关注的朋友也不要着急哦。
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
 楼主| 发表于 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只负责计算就可以了。
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2010-8-5 07:46:15 | 显示全部楼层
7# forcal 问题1:

CVECTOR_UINT32 结构是一个首指针为常量,总长度固定的连续buffer,主要用于以下几个方面:
  • 作为入参,对一组数进行群组运算:如求Gcd、Lcm、Product、SumsOfLikePowers;
  • 作为入参,对CRadixConverter进行:构造、ResetVector操作;
  • 作为出参,对CRadixConverter进行:GetVector操作(其对象与入参是同一对象)
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 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)。
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
 楼主| 发表于 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等。
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
您需要登录后才可以回帖 登录 | 欢迎注册

本版积分规则

小黑屋|手机版|数学研发网 ( 苏ICP备07505100号 )

GMT+8, 2019-7-17 16:18 , Processed in 0.058678 second(s), 17 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表