无心人 发表于 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);
}

除法就稍微复杂点了
页: 1 2 [3] 4 5 6 7
查看完整版本: 来点复杂的吧