Raúl Merino on Fri, 30 Dec 2005 15:57:36 +0100


[Date Prev] [Date Next] [Thread Prev] [Thread Next] [Date Index] [Thread Index]

Need Help!!!!!!!! ;-)


Hi!
I try to make a program to compute primes between 2^508 and 2^512. To do it, i use c with pari.
I have a problem when i do the next comparasion:

while(itos(geq((GEN) primers[a], stoi(0)))==1);

In theory (I don't know if i make it good) primers[a] is a vector. I use the function cgetg to get memory for the variable primers[a].

I put all the program in the newt sentences and then i put the program in the language for the calculator gp.

#include<stdio.h>
#include<math.h>
#include<stdlib.h>
#include <process.h>
#include "pari.h"




void fdescomposicio(int min_bits, int epsi);


void construccio_primers(int minbits, int maxposlongitud, int nombrepgrans);
int comprovar_primeritat (int L, int f, GEN aux_pari);

int nombrepgrans, maxposlloc, maxd, f;
int descomposicio[100];
int *llocprimers;
GEN p, primers, v;



int main (void)
{
int epsi, minbits;

srand (getpid());
pari_init(32000000, 30000);

printf("Aquest programa dona claus de 512 bits.\n");
printf("A partir de quin valor vols comprovar si un nombre es primer?\n");
scanf("%d",&minbits);
printf("Per calcular un primer li restes un epsilon i, despres, el factoritzem en primers petits.\n");
printf("Quin epsilon (enter i positiu) vols agafar?\n");
scanf("%d", &epsi);

fdescomposicio(minbits, epsi);

construccio_primers(minbits, maxd, nombrepgrans);

return 0;

}

void fdescomposicio(int minbits, int epsi)
{
int k, s, j, i, repetit, longitud;
int auxllocprimers[100];

for(k=0; k<100; k++) descomposicio[k]=0;
for(k=0; k<100; k++) auxllocprimers[k]=0;
descomposicio[0]=500;
s=0;
i=1;

for(k=0;k<100; k++)
{
if(descomposicio[k]>minbits)
{
longitud=descomposicio[k]-epsi;

while(longitud>minbits)
{
descomposicio[i]=rand()%(longitud-1)+1;
longitud=longitud-descomposicio[i];
i++;
}

descomposicio[i]=longitud;
i++;
}

repetit=0;
for(j=0; j<100; j++)
{
if(auxllocprimers[j]==i) repetit=1;
}

if(repetit==0)
{
auxllocprimers[s]=i;
s++;
}
}


maxd=0;
nombrepgrans=0;
maxposlloc=0;

for(k=0;k<100; k++)
{
if(descomposicio[k]!=0) maxd++;
if(descomposicio[k]>minbits) nombrepgrans++;
}

for(k=0; k<100; k++)
{
if(auxllocprimers[k]!=0) maxposlloc++;
}

llocprimers =(int *)calloc(maxposlloc+1, sizeof(int));

for(k=0; k<maxposlloc;k++)
{
llocprimers[k]=auxllocprimers[maxposlloc-k-1];
}

printf("Descomposicio\n");
for(k=0; k<maxd; k++) printf("%d\t",descomposicio[k]);
printf("\n\nlloc dels primers\n");
//llocprimers[maxposlloc-1]=2;
for(k=0; k<maxposlloc; k++) printf("%d\t", llocprimers[k]);
printf("\n\n");
printf("nombrepgrans = %d\n", nombrepgrans);
printf("max = %d\n", maxd);

return;
}


void construccio_primers(int minbits, int maxposlongitud, int nombrepgrans)
{
int L, control, posicio_aux, controlgrans, elevado_aux, control_primeritat;
int a, k, q, var, j, r;
GEN elevado, aux_pari, min_bits, j_aux;

//reservem memòria per les variables del PARI
elevado=cgeti(BITS_IN_LONG);
aux_pari=cgeti(DEFAULTPREC);
p=cgeti(BITS_IN_LONG);
j_aux=cgeti(BITS_IN_LONG);
min_bits=cgeti(DEFAULTPREC);
primers=cgetg(100, t_INT);
for(k=1; k<100; k++) primers[k]=lgeti(BITS_IN_LONG);
aux_pari=stoi((long) 2);
min_bits=stoi((long) min_bits);

//primers is a vector who have components <=2^512
//p is a integer <2^512

f=1;
control=(int) f;
for(a=0; a<=maxposlloc-2; a++)
{

if(a!=1) maxposlongitud=posicio_aux;

while(itos(geq((GEN) primers[a], stoi(0)))==1);
{
posicio_aux=maxposlongitud;
control=f;
L=llocprimers[a]-llocprimers[a+1] + 1;
v = cgetg(L+1, t_INT);
for(k=1; k<L+1; k++) v[k]=lgeti(BITS_IN_LONG);

for(r=1; r<=L-1; r++)
{
//if(equalui((long) descomposicio[posicio_aux],(GEN) min_bits)<=0)
if(itos(glt(stoi(descomposicio[posicio_aux]),(GEN) min_bits))==1)
{
elevado = (GEN) gpowgs((GEN) aux_pari, (long) descomposicio[posicio_aux]);
elevado_aux=(long) itos((GEN) elevado);
gaddgsz((GEN) elevado, (long) rand()%elevado_aux, (GEN) v[r]);
}
//if(absi_cmp(stoi((long) descomposicio[posicio_aux]),(GEN) min_bits)>0)
if(itos(ggt(stoi(descomposicio[posicio_aux]), (GEN) min_bits))==1)
{
for(q=1; q<=posicio_aux; q++)
{
if(absi_cmp(stoi((long)descomposicio[q]),(GEN) min_bits)>0)
{
controlgrans++;
}
}

var= nombrepgrans-controlgrans+1;
gaffect((GEN) v[r], (GEN) primers[var]);
controlgrans=0;
}

posicio_aux --;
}

for(j=64; j<=16384;j++)
{
j_aux=stoi((long) j);
if(f==control)
{
gaffect((GEN) v[L], (GEN)nextprime(j_aux));
gaffect((GEN) j, (GEN) v[L]);
gaffsg((long) 2, (GEN) p);

for(k=1; k<=L; k++) gaffect((GEN) p, (GEN) gmul((GEN) p,(GEN) v[k]));
p=gaddgs((GEN) p, (long) 1);
control_primeritat=comprovar_primeritat (L, f, aux_pari);
if(control_primeritat==1) printf("p és = %s", GENtostr(p));
}
}
}*/
}

return;

}

void construccio_primers(GEN descomposicio, GEN llocprimers, int minbits, int maxposlloc, int maxposlongitud, int nombrepgrans)
{
int L, control, posicio_aux, controlgrans;
int a, k, q, var, j, r;
GEN primers, v, elevado, aux_pari, min_bits, p, j_aux;
pari_init(32000000, 30000);
elevado=cgeti((long) 100);
aux_pari=cgeti((long) 10);
p=cgeti((long) 100);
j_aux=cgeti((long) 100);
min_bits=cgeti((long) 10);
primers=cgetg(100, t_INT);
for(k=1; k<100; k++) primers[k]=lgeti((long) 100);
aux_pari=stoi((long) 2);
min_bits=stoi((long) min_bits);
BITS_IN_LONG


f=1;
control=(int) f;
for(a=0; a<=maxposlloc-2; a++)
{
if(a!=1) maxposlongitud=posicio_aux;

while((int) equalis(primers[a], (long) 0)==0)
{
posicio_aux=maxposlongitud;
control=f;
L=llocprimers[a]-llocprimers[a+1] + 1;
v = cgetg(L+1, t_INT);
for(k=1; k<L+1; k++) v[k]=lgeti((long) 100);

for(r=1; r<=L-1; r++)
{
if(absi_cmp((GEN)descomposicio[posicio_aux],(GEN) min_bits)<=0)
{
elevado = (GEN) gpowgi((GEN) aux_pari, (GEN) descomposicio[posicio_aux]);
gaddz((GEN) randomi(elevado),(GEN) elevado,(GEN) v[r]);
}
if(absi_cmp((GEN)descomposicio[posicio_aux],(GEN) min_bits)>0)
{
for(q=1; q<=posicio_aux; q++)
{
if(absi_cmp((GEN)descomposicio[q],(GEN) min_bits)>0)
{
controlgrans++;
}
}

var= nombrepgrans-controlgrans+1;
gaffect((GEN) v[r], (GEN) primers[var]);
controlgrans=0;
}

posicio_aux --;
}

for(j=64; j<=16384;j++)
{
j_aux=stoi((long) j);
if(f==control)
{
gaffect((GEN) v[L], (GEN)nextprime(j_aux));
gaffect((GEN) j, (GEN) v[L]);
gaffsg((long) 2, (GEN) p);

for(k=1; k<=L; k++) gaffect((GEN) p, (GEN) gmul((GEN) p,(GEN) v[k]));
p=gaddgs((GEN) p, (long) 1);
comprovar_primeritat(p, primers, v, L, f, aux_pari);
}
}
}
}

return;

}

int comprovar_primeritat (int L, int f, GEN aux_pari)
{
//g, aux son punteros
//f,v son punteros que estaran en este programa y en el principal
int i, t, repetit, z;
GEN g, aux, aux_pari2, aux_pari3;

//reservem memoria per g i aux
g=cgeti((long) 100);
aux=cgeti((long) 100);
aux_pari2=cgeti((long) 10);
aux_pari3=cgeti((long) 10);
aux_pari2=stoi((long) -1);
aux_pari3=stoi((long) 1);

//isprime segun manual user's, no existe en libpari.pdf
if(isprime((GEN) p) == 1)
{
i=0;
while(i<15)
{
gaffect((GEN) stoi((long) (rand()%(itos(p)-3))+2), (GEN) g);
gaffect((GEN) aux, (GEN) gmodulcp(g,p));
gaffect((GEN) aux, (GEN) gpow((GEN) aux,(GEN) gdivexact((GEN) gaddgs((GEN) p, (long) -1), (GEN) aux_pari), (long) 1));

if(itos(geq((GEN) aux, (GEN) gmodulcp(aux_pari2,p)))==1)
{
t=1;
while(itos(geq((GEN) aux, (GEN) gmodulcp(aux_pari3,p)))==0)
{
gaffect((GEN) aux, (GEN) gmodulcp((GEN) g,(GEN) p));
gaffect((GEN) aux, (GEN) gpow((GEN) aux,(GEN) gdivexact((GEN) gaddgs((GEN) p, (long) -1), (GEN) v[t]), (long) 1));
t++;
if(t==L+1 && itos(geq((GEN) aux, (GEN) gmodulcp(aux_pari3,p)))==0)
{
repetit=0;
for(z=1; z<=f; z++)
{
if(itos(geq((GEN) p, (GEN) primers[z]))==1)
{
repetit=1;
}
}

if(repetit==0)
{
gaffect((GEN) primers[f], (GEN) p);
f++;
return 1;
}

break;
}
}

if(t==L+1) break;
}
i++;
}
}

return 0;
}



The program for the calculator is:
f=1;
cota_inf=2^508;
cota_sup=cota_inf*16;
min_bits= 25;
epsilon=10;
posmaxveclong=0;
maxposveclloc=0;
nombrepgrans=0;
controlgrans=0;
vectorlongitud=vector(100);
auxprimers=vector(100);
primers=vector(100);
s=1;
vectorlongitud[1]=500;
i=2;
for(k=1, 100, if(vectorlongitud[k]>25,longitud=vectorlongitud[k]-epsilon;while(longitud>min_bits, vectorlongitud[i]=random(longitud-1)+1; longitud=longitud-vectorlongitud[i]; i++);vectorlongitud[i]=longitud;i++);repetit=0;for(j=1,100, if(auxprimers[j]==i,repetit=1)); if(repetit==0, auxprimers[s]=i;s++)) for(k=1,100, if(vectorlongitud[k]!=0, posmaxveclong ++); if(vectorlongitud[k]>min_bits, nombrepgrans++));
for(k=1,100, if(auxprimers[k]!=0, maxposveclloc ++));
llocprimers=vector(maxposveclloc);
for(k=1,maxposveclloc, llocprimers[k]=auxprimers[maxposveclloc+1-k]);
maxl=posmaxveclong;
control=f;
for(a=1,maxposveclloc-1,;if(a!=1,posmaxveclong=posaux);while(primers[a]==0,posaux=posmaxveclong;control=f;L=llocprimers[a]-llocprimers[a+1]+1;v=vector(L);for(r=1,L-1,if(vectorlongitud[posaux]<=min_bits,elevado=2^(vectorlongitud[posaux]);v[r]=random(elevado)+elevado);if(vectorlongitud[posaux]>min_bits,for(q=1, posaux, if(vectorlongitud[q]>min_bits, controlgrans++));var=nombrepgrans-controlgrans+1; v[r]=primers[var];controlgrans=0);posaux--);for(j=2^6, 2^14,if(f==control, v[L]=nextprime(j); j=v[L]; p=2; for(k=1, L, p=p*v[k]); p++; if(isprime(p)==1,i=0;while(i<15, g=random(p-3)+2;aux=Mod(g,p)^((p-1)/2); if(aux==Mod(-1,p),t=1;while(aux!=Mod(1,p),aux=Mod(g,p)^((p-1)/v[t]); t++; if(t==L+1&&aux!= Mod(1,p),repetit=0;for(z=1, f, if(p==primers[z], repetit=1));if(repetit==0,primers[f]=p;f++);break));if(t==L+1,break)); i++))))));



If somebody see some mistake, please tell me.

Thanks.

Ra.

_________________________________________________________________
¿Estás pensando en cambiar de coche? Todas los modelos de serie y extras en MSN Motor. http://motor.msn.es/researchcentre/