无心人
发表于 2009-2-20 23:01:30
我明天下午如果去学校
我想修改下你的代码
尝试是否在浮点下能不出错误
看是否可行
你的代码实在复杂,呵呵
谁做雷锋把说明集中到一起?
mathe
发表于 2009-2-21 16:15:11
原帖由 无心人 于 2009-2-20 21:18 发表 http://bbs.emath.ac.cn/images/common/back.gif
呵呵
mathe给我的windows程序可能不如我重新编译的好
非常可能.而且有可能因为是使用的gmp版本不同,我的版本可能有理数实现的不够好.
无心人
发表于 2009-2-21 20:36:57
:)
我觉得,你不如重新整理下代码
反正目前最短运行时间也是1600天机时
花点时间优化
万一能提高速度10倍呢
无心人
发表于 2009-2-21 20:37:44
:)
要不手工实现下GMP的有理数也可以
反正你用到的功能简单
无心人
发表于 2009-2-21 20:43:42
你的版本不是有理数实现的不好,是编译的汇编是386的吧
记得你的应该是某个修改版,可以用VC编译成静态库
而我是自己编译的MinGW静态库
mathe
发表于 2009-2-21 21:58:07
主要最近我没有多少空余时间.
mathe
发表于 2009-2-21 22:01:42
你来帮忙做一个在p阶域上进行计算的代码如何?这里p最好选择梅森素数或费马素数,p越大越好(丢失解的可能性越小).
无心人
发表于 2009-2-21 22:55:08
如果你能分析出 P的大小和解丢失的概率的关系最好了
素数可以取2^31-1
可以考虑用汇编计算
应该是比较简单
我分析你的代码,需要替换的函数很少的
我给你的短消息替换成double是可以编译成功的
关键是,是否在VC2008等windows系统下编译
呵呵
我的MinGW不方便调试
下周有时间我测试下
是简单的替换么?
========================================
我做好了给你发mail吧,你帮助鉴定!!
无心人
发表于 2009-2-21 22:58:02
你还要准备两组数据
一组否定的
一组肯定的
方便鉴定是否可行
无心人
发表于 2009-2-22 09:09:42
考虑 p = 2^31 - 1
typedef unsigned long DWORD
#define P (2^31-1)//具体数值就不算了
DWORD fAdd(DWORD, a, DWORD b)
{
DWORD c = a + b;
return (c < P? c : c - P);
}
DWORD fSub(DWORD, a, DWORD b)
{
DWORD c = P -b + a;
return (c < P? c : c - P);
}
DWORD fMul(DWORD, a, DWORD b)
{
long long c =a * b;
DWORD d = c & P
DWORD e = c >> 31
e += d;
return (e < P? e : e - P);
}
除法就稍微复杂点了