Ciao a tutti!

Sono nuova del forum. Sto scrivendo un codice che mi permetta di creare tre vettori T0, T1, T2 di dimensioni n ciascuno.

Per ognuno di essi, parto generando due distinti array di valori random, rispettivamente tra (0,p) e tra (0,n).

In seguito, ricavo T0, T1, T2, andando a moltiplicare, la prima volta, il primo valore del primo array con il primo elemento elevato alla zero del secondo array; la seconda volta, il secondo valore del primo array, con il secondo del secondo array, elevato alla prima; la terza volta, il terzo valore del primo array con il terzo valore elevato alla seconda del secondo array; ed infine, la quarta volta, il quarto valore del primo array con il quarto valore,elevato alla terza, del secondo array.
Faccio la somma dei quattro valori ricavati e colloco il risultato nella prima posizione del vettore che sto costruendo in quel momento, tra T0, T1, T2.
Ripeto l'operazione andando a scorrere gli array.

Il codice che mi esegue quanto spiegato sopra è il seguente:

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <math.h>


main(){

//parametri:

unsigned long long p = pow(2, 33)-1;
unsigned long long n = pow(2, 32);


// array per T0:
unsigned long long aa[p];
unsigned long long ab[n];

//array per T1:
unsigned long long ac[p];
unsigned long long ad[n];


//array per T2:
unsigned long long ae[p];
unsigned long long af[n];


unsigned long long T0[n];
unsigned long long T00[n];
unsigned long long T01[n];
unsigned long long T02[n];
unsigned long long T03[n];

unsigned long long T1[n];
unsigned long long T10[n];
unsigned long long T11[n];
unsigned long long T12[n];
unsigned long long T13[n];

unsigned long long T2[n];
unsigned long long T20[n];
unsigned long long T21[n];
unsigned long long T22[n];
unsigned long long T23[n];


srand(time(NULL));

// calcolo di T0

int ia; //genero le ai



for(ia=0; ia< p; ia++) {

aa[ia] = rand() % p + 1; // aa[] è il vettore che contiene i valori di a0,a1,...,an

// printf("aa[ia]=%llu\n", aa[ia]);

}


int ib; // genero le xi

for(ib=0 ; ib< n ; ib++) {

ab[ib] = rand() % n + 1; // ac[] è il vettore che contiene il vettore x0,...,xn

// printf("ab[ib]=%llu\n", ab[ib]);
}



int ic;

for (ic=0; ic< n; ic++){


T00[ic]= aa[ic] * (abs(floor(pow(ab[ic], 0)))) % p;
T01[ic]= aa[ic+1] * (abs(floor(pow(ab[ic], 1)))) % p;
T02[ic]= aa[ic+2] * (abs(floor(pow(ab[ic], 2)))) % p;
T03[ic]= aa[ic+3] * (abs(floor(pow(ab[ic], 3)))) % p;

T0[ic] = T00[ic] + T01[ic] + T02[ic] + T03[ic];
}

int id;

for(id=0; id< n; id++){

printf("T0[id]=%llu\n", T0[id]);

}





// calcolo di T1

int ie;

for(ie=0; ie< p; ie++){

ac[ie]= rand() % p +1;
// printf("ac[ie]=%llu\n", ac[ie]);
}

int ig;

for(ig=0; ig< n; ig++){

ad[ig]= rand() % n +1;
// printf("ad[ig]=%llu\n", ad[ig]);

}




int ih;

for (ih=0; ih< n; ih++){


T10[ih]= ac[ih] * (abs(floor(pow(ad[ih], 0)))) % p;
T11[ih]= ac[ih+1] * (abs(floor(pow(ad[ih], 1)))) % p;
T12[ih]= ac[ih+2] * (abs(floor(pow(ad[ih], 2)))) % p;
T13[ih]= ac[ih+3] * (abs(floor(pow(ad[ih], 3)))) % p;

T1[ih]= T10[ih] + T11[ih] + T12[ih] + T13[ih];
}

int ii;

for(ii=0; ii< n; ii++){

printf("T1[ii]=%llu\n", T1[ii]);

}





// calcolo di T2

int il;

for(il=0; il< p; il++){

ae[il]= rand() % p +1;
// printf("ae[il]=%llu\n", ae[il]);
}

int im;

for(im=0; im< n; im++){

af[im]= rand() % n +1;
// printf("af[im]=%llu\n", af[im]);

}


int in;

for (in=0; in< n; in++){


T20[in]= ae[in] * (abs(floor(pow(af[in], 0)))) % p;
T21[in]= ae[in+1] * (abs(floor(pow(af[in], 1)))) % p;
T22[in]= ae[in+2] * (abs(floor(pow(af[in], 2)))) % p;
T23[in]= ae[in+3] * (abs(floor(pow(af[in], 3)))) % p;

T2[in]= T20[in] + T21[in] + T22[in] + T23[in];

}

int io;

for(io=0; io< n; io++){

printf("T2[io]=%llu\n", T2[io]);

}
}


Compilo con linux:
# gcc -c prova.c
# gcc -c prova.c -o prova.o -lm
#gcc -o prova.exe prova.o -lm
#./prova.exe

E viene fuori 'Segmentation fault'!

Sareste così gentili da dirmi dove e cosa sbaglio?

Grazie