[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