高手求救:大素数随机寻找(RSA),是不是内存的原因?

leaker 2010-05-09 12:13:33
以下是寻找素数的测试代码:
start = clock();
pri = rand_link(N);//随机产生具有N位数字的随机数,
cout<<"随机寻找"<<N<<"位数的素数"<<endl;
cout<<"第"<<i<<"次寻找素数=>"<<endl;
out_put_link(pri);
prime = prime_link(pri);
while(prime == NULL)
{
i++;
cout<<"第"<<i<<"次寻找的数是=>"<<endl;
free(pri);
pri = init_link();
pri = rand_link(N);
out_put_link(pri);
free(prime);
prime = init_link();
prime = prime_link(pri);
}

finish = clock();
duration = (double)(finish - start) / CLOCKS_PER_SEC;
cout<<"本次寻找耗时=>"<<duration <<"seconds"<<endl;
以单链表的形式存储大整数(一位数字一个节点), 一下是 prime_link(link* p)函数:
link* prime_link(link* p)
{//素数判定, 利用Miller-Rabin测试 n-1 = 2^s * m
const int N(10);
// p - 1 = (2^s) * m
link* s = init_link();//s
link* m = init_link();//m
link* tp = init_link();//tp = p - 1
link* bus = init_link();// 每次除以2 所得的结果
link* r = init_link();
//insert_link(r, 0);//r = 0
link* z = init_link();//z = (b^m)mod n

link* two = init_link();
insert_link(two, 2);//用于 z = z^2 mod n
link* one = init_link();
insert_link(one, 1);//用于 r = r + 1

tp = sub_link(p, 1);//tp = p - 1

int tbus(1);
link* ttp = init_link();
copy_link(tp, ttp);
ss: bus = div_link(ttp, 2);
if((bus->last ->data)%2 == 0)
{
tbus++;
ttp = init_link();
copy_link(bus,ttp);
bus = init_link();
goto ss;
}
else
{
copy_link(bus, m);//m
while(tbus)
{
insert_link(s,tbus%10);//s
tbus =(tbus - tbus%10)/10;
}
}
reveser_link(s);//还原 s

link* ts = init_link();
ts = sub_link(s, 1);


//随机产生 b, 1 <= b < n
int tplength(tp->length) ;

short rand_length[N] ;

srand( (unsigned)time( NULL ) );
int i(0);
for( ; i < N; ++i)
{
rand_length[i] = RangedRandDemo(1,tplength+1);
}

link* b = init_link();

i = N;
while(i)
{
m = init_link();
copy_link(bus,m);

loo: r = init_link();
insert_link(r, 0);//r = 0

b = randb(rand_length[i-1]);

if((equal_link(b, tp)== 0)&&(compare_link(tp,b)==1))
{
z = init_link();
z = muli_mod_link(b, m, p);
free(b);
if((z->length == 1&&z->head ->data == 1)||(equal_link(tp, z)== 1))
{
i--;
continue;
}
else
{
ss1:
/*s = init_link();*/
/*copy_link(ts,s);*/
if(equal_link(r, ts) == 1)
{
break;
}
else
{
/*link* tr = init_link();*/

r = add_link(r, one);//r = r+1
/*r = init_link();
copy_link(tr, r);*/

/*link* tz = init_link();*/
z = muli_mod_link(z, two, p);
/*z = init_link();
copy_link(tz, z);*/

/*free(tr);*/
/*free(tz);*/

if(equal_link(z, tp)== 1)
{
i--;
continue;
}
else
goto ss1;
}
}
}
else
{
goto loo;
}
}

free(s);
free(m);
free(tp);
free(bus);
free(r);
free(z);
free(two);
free(one);
free(ts);

if(i == 0)
{
return p;
}
else
{
return NULL;
}
}
当我把prime_link()中的 N = 50, 所产生的随机数字的位数 为 8 位时, 运行时, 看 任务栏的 内存使用情况, 竟然到达2.7G, 然后程序非正常终止, 且不结果. 当把prime_link()中的 N改为 N = 10, 所产生的随机数字的位数 为 10 位时, 运行时,看 任务栏的 内存使用情况, 1G的使用不到, 而且找到了10位数字的素数, 返回了结果.我想应该是 内存没释放的原因, 请问高手达人, 此处怎么修改?
以下是定义大整数:
typedef struct _node{
/*Byte b;*/
short data;//short[-32768,32767]
struct _node* next;
}node;

typedef struct{
short b;//符号
node* head;
node* last;
short length;
}link;
以下是大数的模乘快速运算 (p^b) mod q
link* muli_mod_link(link* p, link* b, link* q)
{
link* c = init_link();
insert_link(c,1);
if(b->length == 1&& b->head ->data == 0)
{
return c;
}

link* tp = init_link();

while((b->head ->data ) != 0)
{
int a(b->last ->data) ;
if( (a&1) == 0)// a&1 == 0 偶数;a&1 == 1 奇数
{
//b = b / 2
b = div_two_link(b);
/*lb = init_link();
copy_link(tb,lb);
tb = init_link();*/

// lp<- lp* lp
copy_link(p, tp);
p = muli_link(p,tp);
//p = p* lp mod lq
p = mod_link(p,q);
tp = init_link();
}
else
{
// b = b -1
b = sub_link(b);

// c = c * p
c = muli_link(c,p);
c = mod_link(c,q);
}
}

free(tp);

return c;
}
小弟第一次发贴, 亟待英雄好汉解救...
...全文
194 25 打赏 收藏 转发到动态 举报
写回复
用AI写文章
25 条回复
切换为时间正序
请发表友善的回复…
发表回复
leaker 2010-05-10
  • 打赏
  • 举报
回复
像我这样的不带头结点的单链表怎么销毁啊...咋没人回我呢?
leaker 2010-05-09
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 jackyjkchen 的回复:]

没有打星星……还是扣分
[/Quote]
已经下了, 不会用啊...
我用VS2008 打不开他的.sln
jackyjkchen 2010-05-09
  • 打赏
  • 举报
回复
没有打星星……还是扣分
jackyjkchen 2010-05-09
  • 打赏
  • 举报
回复
下载区下载吧,评论一下就不扣分了,编译的时候选Release DLL(release lib貌似有点问题),用的时候再把include的东西包含一下即可
leaker 2010-05-09
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 shuihan0739 的回复:]

引用 1 楼 jackyjkchen 的回复:

这套算法太……看看TomCrypt库里面的RSA密钥生成,1024bit才耗时0.1~0.3s,而且内存占用只有数百KB

这是我自己写的, 效率真的很低, 而已还几号内存.TomCrypt库是什么啊? 我用的是VS 2008编的.
[/Quote]

在论坛里面看您有tomcrypt 1.17 VS2008库?我正好也是VS2008的, 发 我一份啊?
jackyjkchen 2010-05-09
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 shuihan0739 的回复:]
引用 1 楼 jackyjkchen 的回复:

这套算法太……看看TomCrypt库里面的RSA密钥生成,1024bit才耗时0.1~0.3s,而且内存占用只有数百KB

这是我自己写的, 效率真的很低, 而已还几号内存.TomCrypt库是什么啊? 我用的是VS 2008编的.
[/Quote]
这种成熟算法除了可以锻炼自己,否则不要自己写,绝对效率低,TomCrypt库csdn下载区有,全套的加密算法,开源的,去看看里面的随机数生成器
leaker 2010-05-09
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 jackyjkchen 的回复:]

这套算法太……看看TomCrypt库里面的RSA密钥生成,1024bit才耗时0.1~0.3s,而且内存占用只有数百KB
[/Quote]
这是我自己写的, 效率真的很低, 而已还几号内存.TomCrypt库是什么啊? 我用的是VS 2008编的.
jackyjkchen 2010-05-09
  • 打赏
  • 举报
回复
这套算法太……看看TomCrypt库里面的RSA密钥生成,1024bit才耗时0.1~0.3s,而且内存占用只有数百KB
jbz001 2010-05-09
  • 打赏
  • 举报
回复
先看看再说
leaker 2010-05-09
  • 打赏
  • 举报
回复
[Quote=引用 22 楼 arong1234 的回复:]

这不是一样么?楼主需要找本数据结构的数学习学习,从这种东西开始教你是很难的
引用 21 楼 shuihan0739 的回复:
引用 20 楼 shuihan0739 的回复:

引用 19 楼 arong1234 的回复:

当然不可能!他只会释放第一个node,不会释放next指向的内存
引用 18 楼 shuihan0739 的回复:
引用 16 楼 arong1234 的回……
[/Quote]
没时间了啊, 赶时间呢
arong1234 2010-05-09
  • 打赏
  • 举报
回复
这不是一样么?楼主需要找本数据结构的数学习学习,从这种东西开始教你是很难的
[Quote=引用 21 楼 shuihan0739 的回复:]
引用 20 楼 shuihan0739 的回复:

引用 19 楼 arong1234 的回复:

当然不可能!他只会释放第一个node,不会释放next指向的内存
引用 18 楼 shuihan0739 的回复:
引用 16 楼 arong1234 的回复:

既然你用link保存数字,当你释放这个link时,肯定不是一个free就可以的。例如你保存了1->2->3这个链表,估计……
[/Quote]
leaker 2010-05-09
  • 打赏
  • 举报
回复
[Quote=引用 20 楼 shuihan0739 的回复:]

引用 19 楼 arong1234 的回复:

当然不可能!他只会释放第一个node,不会释放next指向的内存
引用 18 楼 shuihan0739 的回复:
引用 16 楼 arong1234 的回复:

既然你用link保存数字,当你释放这个link时,肯定不是一个free就可以的。例如你保存了1->2->3这个链表,估计你只释放了1占用的内存,2,3的就被你泄漏了

我……
[/Quote]
这样可以吗?
void free_link(link* l)
{
free(l->head );
free(l);
l = NULL;
}
leaker 2010-05-09
  • 打赏
  • 举报
回复
[Quote=引用 19 楼 arong1234 的回复:]

当然不可能!他只会释放第一个node,不会释放next指向的内存
引用 18 楼 shuihan0739 的回复:
引用 16 楼 arong1234 的回复:

既然你用link保存数字,当你释放这个link时,肯定不是一个free就可以的。例如你保存了1->2->3这个链表,估计你只释放了1占用的内存,2,3的就被你泄漏了

我没写 链表的 释放函数, 只是简单的对链表来个 fr……
[/Quote]
那怎么才能够写个 释放整个链表?
arong1234 2010-05-09
  • 打赏
  • 举报
回复
当然不可能!他只会释放第一个node,不会释放next指向的内存
[Quote=引用 18 楼 shuihan0739 的回复:]
引用 16 楼 arong1234 的回复:

既然你用link保存数字,当你释放这个link时,肯定不是一个free就可以的。例如你保存了1->2->3这个链表,估计你只释放了1占用的内存,2,3的就被你泄漏了

我没写 链表的 释放函数, 只是简单的对链表来个 free(link* ) 而已, 这样能不能释放链表?
[/Quote]
leaker 2010-05-09
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 arong1234 的回复:]

既然你用link保存数字,当你释放这个link时,肯定不是一个free就可以的。例如你保存了1->2->3这个链表,估计你只释放了1占用的内存,2,3的就被你泄漏了
[/Quote]
我没写 链表的 释放函数, 只是简单的对链表来个 free(link* ) 而已, 这样能不能释放链表?
arong1234 2010-05-09
  • 打赏
  • 举报
回复
我的意思是:你的prime_link里怎么判断的

[Quote=引用 15 楼 shuihan0739 的回复:]
引用 14 楼 arong1234 的回复:

我的意思是:你这些数是什么?你在存中间结果还是啥?如果有一个数12345,你是怎么算质数的?
引用 13 楼 shuihan0739 的回复:
引用 12 楼 arong1234 的回复:

看你到处用链表,看不出你里面存啥的
为什么都是c++了,还不用面向对象的写法,代码太乱了
没有看过什么质数算法需要链表的,你到底在干吗?
引用……
[/Quote]
arong1234 2010-05-09
  • 打赏
  • 举报
回复
既然你用link保存数字,当你释放这个link时,肯定不是一个free就可以的。例如你保存了1->2->3这个链表,估计你只释放了1占用的内存,2,3的就被你泄漏了
leaker 2010-05-09
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 arong1234 的回复:]

我的意思是:你这些数是什么?你在存中间结果还是啥?如果有一个数12345,你是怎么算质数的?
引用 13 楼 shuihan0739 的回复:
引用 12 楼 arong1234 的回复:

看你到处用链表,看不出你里面存啥的
为什么都是c++了,还不用面向对象的写法,代码太乱了
没有看过什么质数算法需要链表的,你到底在干吗?
引用 10 楼 shuihan0739 的回复:
引……
[/Quote]
1)随机生成一个N位的数字:rand_link(N)
2)用prime_link(pri)来判断该数是不是素数, 是, 结束; 否则, 转1)
这样回答的是不是你要问的?
arong1234 2010-05-09
  • 打赏
  • 举报
回复
我的意思是:你这些数是什么?你在存中间结果还是啥?如果有一个数12345,你是怎么算质数的?
[Quote=引用 13 楼 shuihan0739 的回复:]
引用 12 楼 arong1234 的回复:

看你到处用链表,看不出你里面存啥的
为什么都是c++了,还不用面向对象的写法,代码太乱了
没有看过什么质数算法需要链表的,你到底在干吗?
引用 10 楼 shuihan0739 的回复:
引用 8 楼 zhoutanliang 的回复:

看这么多。。。。



。。。

就看第一个就可以了, 我想问的的就是 为什么会花……
[/Quote]
leaker 2010-05-09
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 arong1234 的回复:]

看你到处用链表,看不出你里面存啥的
为什么都是c++了,还不用面向对象的写法,代码太乱了
没有看过什么质数算法需要链表的,你到底在干吗?
引用 10 楼 shuihan0739 的回复:
引用 8 楼 zhoutanliang 的回复:

看这么多。。。。



。。。

就看第一个就可以了, 我想问的的就是 为什么会花那么多的内存呢?
[/Quote]
用链表存储数字啊, 比如数字:123456, 存入链表中,则为1->2->3->4->5->6, 其中头结点为1,尾节点为6, 长度为6, 符号位b=1啊
加载更多回复(5)

64,654

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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