高手求救:大素数随机寻找(RSA),是不是内存的原因?
以下是寻找素数的测试代码:
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;
}
小弟第一次发贴, 亟待英雄好汉解救...