[C con Clase] Multiplicacion de Polinomios
lukas
davidlukas en hotmail.com
Mar Mar 20 18:09:37 CET 2007
Hola que tal? , El problema consiste en la multiplicacion de polinomios mediante la tecnica de "divide y venceras" ( sigue una estructura parecida a la multiplicacion de enteros largos ) . EL problema es que debo de tener algo mal cuando ejecuta la recursividad o la funcion malloc para la reserva de memoria pero no se encontrar el error, si alguien me puede echar una mano? Aqui dejo el codigo:(Da error por violacion de segmento :( :( :( )
#include <stdio.h>
#include <stdlib.h>
int* Mult(int* p, int n, int* q, int m);
int main(){
int s; // Para mostrar el resultado
int* r;
int p[]={ -1, 2, 1, 3 }; // Ejemplo de clase
int q[]={ 2, 1,-1, 2 };
r=Mult(p, 4, q, 4);
free(r);
return 0;
}
int* Mult(int* p, int n, int* q, int m)
{
int* P; int* Pi; int* Pd;
int* Q; int* Qi; int* Qd;
int* Ri;int* Rd; int* Rh;
int* Sp;int* Sq;
int* f; int* g; int* h;
int* j; int* X;
int u=0;
int v=0;
int i,N,M;
//Comprobamos que vector es mas largo
if(n>m){ P=p; Q=q; N=n+1; M=m+1; }
else { Q=p; P=q; N=m+1; M=n+1; }
P=(int*)malloc((sizeof(int))*(N));
Q=(int*)malloc((sizeof(int))*(M));
Pi=(int*)malloc((sizeof(int))*(N/2));
Pd=(int*)malloc((sizeof(int))*(N/2));
Qi=(int*)malloc((sizeof(int))*(M/2));
Qd=(int*)malloc((sizeof(int))*(M/2));
Ri=(int*)malloc((sizeof(int))*(N));
Rd=(int*)malloc((sizeof(int))*(N));
Rh=(int*)malloc((sizeof(int))*(N));
Sp=(int*)malloc((sizeof(int))*(N/2));
Sq=(int*)malloc((sizeof(int))*(N/2));
f=(int*)malloc((sizeof(int))*(N/2));
g=(int*)malloc((sizeof(int))*(N));
h=(int*)malloc((sizeof(int))*(N*N));
j=(int*)malloc((sizeof(int))*(N*N));
X=(int*)malloc((sizeof(int))*(1));
if(M==1)
{ //Caso Base
X[0]=P[0]*Q[0];
//Devuelvo el resultado y libero la memoria
free(P);free(Pi);free(Pd);
free(Q);free(Qi);free(Qd);
free(Ri);free(Rd);free(Rh);
free(Sp);free(Sq);free(f);
free(g);free(h); free(j);
return X;
}
else{
//Divido los vectores y ejecuto recursivamente
for(i=0;i<(N/2)-1;i++){ //Parte Izquierda de P
Pi[i]=P[i];
}
for(i=N/2;i<N;i++){ //Parte Derecha de P
Pd[i]=P[i];
}
for(i=0;i<(M/2)-1;i++){ //Parte Izquierda de Q
Qi[i]=Q[i];
}
for(i=M/2;i<M;i++){ //Parte Derecha de Q
Qd[i]=P[i];
}
Ri=Mult(Pi,N/2,Qi,M/2);
Rd=Mult(Pd,N/2,Qd,M/2);
for(i=0;i<(N/2)-1;i++){ // Pi+Pd
Sp[i]=Pi[i]+Pd[i];
}
for(i=0;i<(M/2)-1;i++){ // Qi+Qd
Sq[i]=Qi[i]+Qd[i];
}
Rh=Mult(Sp,N/2,Sq,M/2);
for (i=0;i<(N/2)-1;i++){ // Rh+Ri+Rd
f[i]=Rh[i]-Ri[i]-Rd[i];
}
for (i=0;i<(N/2)-1;i++){ // 1.-(Rh+Ri+Rd)*Xn/2
g[i]=0;
}
for (i=N/2;i<N;i++){ // 2.-(Rh+Ri+Rd)*Xn/2
g[i]=f[u];
u++;
}
for (i=0;i<N-1;i++){ // 1.-Rd*Xn
h[i]=0;
}
for (i=N;i<2*N;i++){ // 2.-Rd*Xn
h[i]=Rd[v];
v++;
}
for(i=0;i<2*N;i++){ // Solucion
j[i]=Ri[i]+g[i]+h[i];
}
free(P);free(Pi);free(Pd);
free(Q);free(Qi);free(Qd);
free(Ri);free(Rd);free(Rh);
free(Sp);free(Sq);free(f);
free(g);free(h); free(X);
return j;
}
}
Gracias :)
Más información sobre la lista de distribución Cconclase