写了个大数运算的类,128字节整数/64字节证书0.42秒

leechiyang 2006-01-04 10:35:51
24135501670223683947692974213177628854836024361753788459367109041342094124141185489741564055835613645906624080910086319086342123329698753320446732179921028053755865530666721200289969214858760509743493228801323601423489639516939141126215434065441863408522377170990714611543765335561665225741274297382387222103312289717047209019399220311368312438851766278887677710049639953030401805483315401324476223989246067658076785143363264022492855208265747423132116392863305977096581671437539166149988617473215911140230270729794033497667813724131408317359544953555806793526288864948182631727491441674207838100386208263117026992060

除以

151158024153112773282813787225975272958434475517639914651283203298283159412609517532974296767820490949274446256991316083463182863277812087442905228631232515326448731115513149634438144182055866936377024251379439683772096634082038790745896771203481163595402759084028640115747691176517694599910761018905774543638

运算100次耗时42秒,p4 1.6G机器,
...全文
183 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
gxqcn 2006-01-16
  • 打赏
  • 举报
回复
我用 HugeCalc 计算,仅需 0.001188s (P4 1.7GHz)
leechiyang 2006-01-15
  • 打赏
  • 举报
回复
为了可以使数据无限大,我把数据放到链表里了,太影响速度.
等有时间的时候改成动态数组,应该会快些.改好后贴源代码.
alphapaopao 2006-01-14
  • 打赏
  • 举报
回复
不算快
lzzqqq 2006-01-11
  • 打赏
  • 举报
回复
比较慢....不过还要顶你一下.
FengYuanMSFT 2006-01-11
  • 打赏
  • 举报
回复
旁听
sboom 2006-01-11
  • 打赏
  • 举报
回复
你们真有空,到时我也写一个。。。。。。。。。。
kevinmartin 2006-01-11
  • 打赏
  • 举报
回复
这种计算应该用汇编做的,怎么没有人做呢?
用汇编的二进制做除法
huanyun 2006-01-11
  • 打赏
  • 举报
回复
改为int64的数组 FastDivSub使用二分查找找商 可以提高效率n倍 但我不想写了 累
AthlonxpX86 2006-01-10
  • 打赏
  • 举报
回复
强人,学习加关注,我不是数学专业>_<
huanyun 2006-01-10
  • 打赏
  • 举报
回复
这个是我今天写的 花了不少心血啊
inline void FastAdd(BYTE* pNum1, int& nNum1,
BYTE* pNum2, int nNum2)
{
int i,j;

if(nNum1 < nNum2) nNum1 = nNum2;

for(i = 0; i < nNum2; ++i)
{
if(pNum1[i] + pNum2[i] > 255)
{
pNum1[i] = pNum1[i] + pNum2[i] - 256;
j=i+1;

while(pNum1[j] == 255)
{
pNum1[j] = 0;
++j;
}

if(j == nNum1)
{
pNum1[j] = 1;
++nNum1;
}
else
{
pNum1[j] += 1;
}
}
else
{
pNum1[i] += pNum2[i];
}
}
}


inline int FastDivSub(BYTE* pNum1, int& nNum1,
BYTE* pNum2, int nNum2)
{
int nRet = -1;
if(nNum1 <= nNum2 && pNum1[nNum1-1] < pNum2[nNum2-1]) return nRet;
BYTE* pNum;
int i,j;

if(pNum1[nNum1-1] < pNum2[nNum2 -1])
{
nRet = nNum1 - nNum2 - 1;
}
else
{
nRet = nNum1 - nNum2;
}

pNum = pNum1 + nRet;

for(i= nNum2-1; i >= 0; --i)
{
if(pNum[i] < pNum2[i])
{
pNum[i] += 256 - pNum2[i];
j=i+1;

while(pNum[j] == 0)
{
pNum[j] = 0xFF;
++j;
}

pNum[j] -= 1;
}
else
{
pNum[i] -= pNum2[i];
}
}

while(pNum1[nNum1-1] == 0) --nNum1;

return nRet;
}

inline void FastAddInt(BYTE* pNum, int& nNum, int nAdd)
{
if(pNum[0] + nAdd > 255)
{
pNum[0] += nAdd - 256;

int i = 1;
while(pNum[i] == 255)
{
pNum[i] = 0;
}

if(i == nNum)
{
pNum[i] = 1;
++nNum;
}
else
{
pNum[i] += 1;
}
}
else
{
pNum[0] += nAdd;
}
}

void FastDiv(BYTE* pRet, int nRet,
BYTE* pNum1, int nNum1,
BYTE* pNum2, int nNum2)
{
BOOL bDiv;
if(nNum1 < nNum2)
bDiv = FALSE;
else
bDiv = TRUE;

int nOff;

while(bDiv)
{
bDiv = FALSE;
if(nNum1 >= nNum2)
{
nOff = FastDivSub(pNum1, nNum1, pNum2, nNum2);
if( nOff >= 0 )
{
FastAddInt(pRet+nOff, nRet, 1);
bDiv = TRUE;
}
}
}
}

void Test()
{
BYTE pRet[1000] = {0};
BYTE pNum1[1000] = {0};
BYTE pNum2[1000] = {0};
int i,nRet, nLen1, nLen2;

nRet = 1;
nLen1 = 128;
for(i=0;i<nLen1;++i) pNum1[i] = rand()%256;
nLen2 = 64;
for(i=0;i<nLen2;++i) pNum2[i] = rand()%256;

DWORD dwStart = ::GetTickCount();

for(i = 0; i < 100; ++i)
{
FastDiv(pRet, nRet, pNum1, nLen1, pNum2, nLen2);
}

DWORD dwEnd = ::GetTickCount();

CString str;
str.Format("%d", dwEnd-dwStart);
::AfxMessageBox(str);
}

还可以优化
目前 AMD2500 512M 下100次共0.7秒
荒废的太阳 2006-01-09
  • 打赏
  • 举报
回复
重新贴一下我的答案,最后一行是小数位:
15967066125299485385801426701907703680214079017020416957359670
71532460922959738433175162470007869732848734950532044521267821
59010293309201247320427297230201674802404354306394279456790500
40970293666652943347694443390008862907499695794585828382513508
4683949210114866023925615415571533701779096275656515878309945.
893891172540681508933318832914
荒废的太阳 2006-01-09
  • 打赏
  • 举报
回复
你的答案是不是:

15967066125299485385801426701907703680214079017020416957359670715324609229597384
33175162470007869732848734950532044521267821590102933092012473204272972302016748
02404354306394279456790500409702936666529433476944433900088629074996957945858283
825135084683949210114866023925615415571533701779096275656515878309945.8938911725
40681508933318832914

我暂时不跟你比速度,我用了1秒的时间。
leechiyang 2006-01-09
  • 打赏
  • 举报
回复
up
leechiyang 2006-01-05
  • 打赏
  • 举报
回复
to huanyun(无妻徒刑)
_______________________

我的运算是基于256进制的除法实现的,用什么算法快呢?
leechiyang 2006-01-04
  • 打赏
  • 举报
回复
大家说是快还是慢?
张友邦 2006-01-04
  • 打赏
  • 举报
回复
我也没概念!不过很支持!
huanyun 2006-01-04
  • 打赏
  • 举报
回复
比较慢
Rafier 2006-01-04
  • 打赏
  • 举报
回复
没有概念。。。。。

19,468

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 图形处理/算法
社区管理员
  • 图形处理/算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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