#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <time.h>
#include <sys/time.h>
//Para calcular tiempo
double dwalltime(){
double sec;
struct timeval tv;
gettimeofday(&tv,NULL);
sec = tv.tv_sec + tv.tv_usec/1000000.0;
return sec;
}
int main(int argc, char *argv[]){
int *A,*B,*C;
double *A2,*B2,*C2;
double timeMult,timePow,timeVector,tick;
int i,N,j;
N = atoi(argv[1]);
//Aloca memoria para la matriz
A=(int*)malloc(sizeof(int)*N*N);
A2=(double*)malloc(sizeof(double)*N*N);
B=(int*)malloc(sizeof(int)*N*N);
B2=(double*)malloc(sizeof(double)*N*N);
C=(int*)malloc(sizeof(int)*N*N);
C2=(double*)malloc(sizeof(double)*N*N);
//Inicializar matrices
for(i=0;i<N;i++){
for(j=0;j<N;j++){
A[i*N+j] = rand() % 40 + 1;
B[i*N+j] = rand() % 40 + 1;
C[i*N+j] = rand() % 40 + 1;
}
}
/* for(i=0;i<N*N;i++){
A[i] = 4;
B[i] = 4;
C[i] = 4;
}
*/
//calcular la potencia multiplicando
tick = dwalltime();
for(i=0;i<N*N;i++){
double valor= B[i];
B2[i]= valor*valor;
}
timeMult = dwalltime() - tick;
printf("Tiempo requerido para elevar multiplicando es: %f \n",timeMult);
//obtiene la potencia 2 de la matriz usando pow
tick = dwalltime();
for(i=0;i<N*N;i++){
A2[i] = pow(A[i],2);
}
timePow = dwalltime() - tick;
printf("Tiempo requerido para elevar a la potencia a la matriz con pow: %f \n",timePow);
//obtiene la potencia 2 con un vector con los valores precargados
tick = dwalltime();
int resultados[41];
for(i=1;i<=40;i++){
resultados[i]= i*i;
}
for(i=0;i<N*N;i++){
int pos = C[i];
C2[i] = resultados[pos];
}
timeVector = dwalltime() - tick;
printf("Tiempo requerido para elevar a la potencia a la matriz con vector: %f \n",timeVector);
//-----suma todo e imprime------
double totalA = 0,totalB = 0, totalC= 0;
for(i=0;i<N*N;i++){
totalA+=A2[i];
totalB+=B2[i];
totalC+=C2[i];
}
printf("primer y ultimo A2 %.0f , %.0f \n",A2[0],A2[N*N-1]);
printf("primer y ultimo B2 %.0f , %.0f \n",B2[0],B2[N*N-1]);
printf("primer y ultimo C2 %.0f , %.0f \n",C2[0],C2[N*N-1]);
printf("totales (deben ser parecidos): %.0f %.0f %.0f",totalA,totalB,totalC);
free(A);
free(B);
free(C);
free(A2);
free(B2);
free(C2);
return 0;
};