Number大数运行库V0.01发布 :)

yaos 2004-07-25 10:09:02
http://yaojialin.51.net/download/Number.rar

Vs 2003格式

什么都不能做,刚做好类声明,请对类的定义发表看法
...全文
188 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
yaos 2004-08-09
  • 打赏
  • 举报
回复
最近无法回复

你的程序应该结果溢出

嘿嘿,Number工程库在缓慢更新中,目标是Wintel平台上的紧凑代码的应用,如果能顺利完成,希望能在加密和数论应用方面有用处

telescopewyj 2004-08-06
  • 打赏
  • 举报
回复
呵呵,不错不错
kerbcurb 2004-08-06
  • 打赏
  • 举报
回复
我知道了,两个数达到一定的位数后,存储问题时必须考虑的,如果两个数的长度都超过18位,对于10^9进制,乘积的位数大于单个乘数长度的二倍,否则就会有交叉。
kerbcurb 2004-08-05
  • 打赏
  • 举报
回复
请姚先生帮助看一下
这个的错误所在
void karatsuba(LARGE_INT * a,LARGE_INT * b,LARGE_INT * ret,LARGE_INT d )
{
long i;
LARGE_INT * ar = & a[0]; // low-order half of a
LARGE_INT * al = & a[d / 2]; // high-order half of a
LARGE_INT * br = & b[0]; // low-order half of b
LARGE_INT * bl = & b[d / 2]; // high-order half of b
LARGE_INT * asum;// = & ret[d * 5]; // sum of a's halves
LARGE_INT * bsum;// = & ret[d * 5 + d / 2]; // sum of b's halves
LARGE_INT * x1 = & ret[d * 0]; // ar*br's location
LARGE_INT * x2 = & ret[d * 1]; // al*bl's location
LARGE_INT * x3;// = & ret[d * 2]; // asum*bsum's location

asum = new LARGE_INT[d / 2];
bsum = new LARGE_INT[d / 2];


x3 = new LARGE_INT[d];


// when d is small, we're better off just reverting to
// grade-school multiplication, since it's faster at this po LARGE_INT.
if ( d <= KARAT_CUTOFF )//KARAT_CUTOFF = 4
{
gradeSchool( a, b, ret, d );
return;
}

// compute asum and bsum
for ( i = 0; i < d / 2; i++ )
{
asum[i] = al[i] + ar[i];
bsum[i] = bl[i] + br[i];
}

karatsuba( ar, br, x1, d / 2 );
karatsuba( al, bl, x2, d / 2 );
karatsuba( asum, bsum, x3, d / 2 );

// combine recursive steps
for ( i = 0; i < d; i++ ) x3[i] = x3[i] - x1[i] - x2[i];
for ( i = 0; i < d; i++ ) ret[i + d / 2] += x3[i];

delete[]x3;
delete[]bsum;
delete[]bsum;
}
void gradeSchool(LARGE_INT * a,LARGE_INT * b,LARGE_INT * ret,LARGE_INT d )
{
long i, j;

for ( i = 0; i < 2 * d; i++ ) ret[i] = 0;
for ( i = 0; i < d; i++ )
{
for ( j = 0; j < d; j++ ) ret[i + j] += a[i] * b[j];
}
}
//------------------------------------------------------------------------------

void doCarry(LARGE_INT * a,LARGE_INT d )
{
LARGE_INT c;
long i;

c = 0;
for ( i = 0; i < d; i++ )
{
//printf("%016u ",a[i]);
a[i] += c;
if ( a[i] < 0 )
{
c = -( -( a[i] + 1 ) / RADIX + 1 );
}
else
{
c = a[i] / RADIX;
}
a[i] -= c * RADIX;
//printf("%09u ",a[i]);
//printf("%09u\n",c);

}
if ( c != 0 ) fprintf( stderr, "Overflow %d\n", c );
}
这是他人的代码,本身是10进制,我修改成10^9进制,但是当d大于或等于32后,计算结果是错误的
yaos 2004-07-29
  • 打赏
  • 举报
回复
:)

引用计数要修改的函数有点多阿
因为一般的大数程序都涉及的变量不多,而且基本都在变化
似乎用处不大
liangbch 2004-07-29
  • 打赏
  • 举报
回复
使用引用计数 不是为了 防止内存泄露,而是为了减少内存的占用量,即值相同的变量只用一个对象来表示。apfloat 和 MFC 的 CString 都使用了引用计数。
kerbcurb 2004-07-29
  • 打赏
  • 举报
回复
为了防止内存泄露,是否可以增加引用计数
shines77 2004-07-28
  • 打赏
  • 举报
回复
up
yaos 2004-07-27
  • 打赏
  • 举报
回复
基本补充了所有文件,大部分都是空的 :)

写了所有的乘法
把除法架子搭起来了

+ — * 已经可以计算了,虽然可能有错误
另外,有一个地方有性能缺陷
就是不能实现
number t = new number(number b)的拷贝构造函数
只能用number t; t = b;代替
一旦b超过初始的1024DWORD大小,可能有内存重新分配的发生 :(
我的C++水平太菜,请教大家如何改进

我题目提供的地址同步于我的更新进度
提供VS2003的项目文件,至于其他windows编译器,暂时不提供
另外,不提供linux版本,因为有GMP :)
yaos 2004-07-26
  • 打赏
  • 举报
回复
升级到0.09

实现了一些辅助功能,并写了所有+ -的操作
大部分都是不用调试的,直接调其他函数,小部分比较核心的需要调试

准备写乘法,和短除法,然后实现简单的输入输出
再调试
yaos 2004-07-25
  • 打赏
  • 举报
回复
计划近期完成+-*和一些简单的功能

并尝试完成四则运算

33,007

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧