Foros del Web » Programación para mayores de 30 ;) » C/C++ »

multiplicación de polinomios

Estas en el tema de multiplicación de polinomios en el foro de C/C++ en Foros del Web. Hola todos, necesito un pequeño empujon con un problema que tengo que hacer, sobre la multiplicación de polinomios mediante la técnica de divide y vencerás. ...
  #1 (permalink)  
Antiguo 16/04/2007, 16:53
 
Fecha de Ingreso: marzo-2007
Mensajes: 5
Antigüedad: 17 años, 1 mes
Puntos: 0
multiplicación de polinomios

Hola todos, necesito un pequeño empujon con un problema que tengo que hacer, sobre la multiplicación de polinomios mediante la técnica de divide y vencerás.

Ya he echo algo, pero no funciona bien, podrías decirme porque no funciona.

Aqui os dejo el código

Gracias

#include <stdio.h>
#include <stdlib.h>
int multiplicar(int *, int *, int *, int, int *, int *);
void combinar(int, int *, int *);
int espotenciade2(int);
int main(int argc, char *argv[]){
int n;
int contador=0,i=0;
int *P; /*Arrays que contienen los coeficientes de los polinomios que hay
que multiplicar*/
int *Q;
int *PQ; /*Array donde se almacenará el resultado de la multiplicación*/
int *aux;
int *vectorr; /*Array para almacenar resultados parciales*/
char c=getche();
switch(argc){
case 2:
n=atoi(argv[1]);
if(espotenciade2(n)==-2){ /*Si n es potencia de 2 se mostrara un mensaje
de error por la salida de error estandar*/
fprintf(stderr,"Uso: ./pract2 <n>\nSiendo n un numero entero potencia de 2\n");
return -2;
}
P=(int *)malloc(n * sizeof(int));
Q=(int *)malloc(n * sizeof(int));
vectorr=(int *)malloc(((2*n)+1) * sizeof(int));
PQ=(int *)malloc(((2*n)) * sizeof(int));
/*Pedir al usuario datos de entrada para el polinomio P*/
while(contador < n){
printf("P[ %d] = ",contador);
scanf("%d", &(P[contador]));
contador++;
printf("\n");
}
char c=getche();
contador=0;
/*Pedir al usuario datos de entrada para el polinomio Q*/
while(contador < n){
printf("Q[ %d] = ",contador);
scanf("%d", &(Q[contador]));
contador++;
printf("\n");
}
c=getche();
for(i=0; i<(2*n)-1; i++)
PQ[i]=0;
aux=(int *)malloc(sizeof(int));
*aux=0;
printf("antes del multiplicar");
multiplicar(P,Q,PQ,n,aux,vectorr);
c=getche();
combinar(n,vectorr,PQ);
c=getche();
for(i=0; i<(2*n)-1; i++)
printf("%d ",PQ[i]);
break;
default:
fprintf(stderr,"Uso: ./pract2 <n>\nSiendo n un numero entero potencia de 2\n");
return -1;
}
printf("\n");
free(vectorr);
free(PQ);
free(P);
free(Q);
free(aux);
return 0;
c= getche();

}
/*Algoritmo para comprobar que n cumpla la restricción de ser potencia de
2*/
int espotenciade2(int n){
int aux;
while(1){
aux=n%2;
n/=2;
if(aux != 0)
return -2; /*No es potencia de 2*/
if(n == 1)
return 0; /*Es potencia de 2*/
}
}
/*Algoritmo para combinar las soluciones parciales siguiendo la fórmula*/
void combinar(int n, int *vectorr, int *PQ){
int RI[n-1];
int RH[n-1];
int RD[n-1];
int contador=0, i=0;
for(i=0; i<n-1; i++){
RI[i]=vectorr[contador];
contador++;
}
for(i=0; i<n-1; i++){
RD[i]=vectorr[contador];
contador++;
}
for(i=0; i<n-1; i++){
RH[i]=vectorr[contador];
contador++;
}
contador=0;
for(i=0; i<n/2; i++){
PQ[i]=RI[i];
contador++;
}
for(i=n/2; i<=n; i++){
if(contador<n-1)
PQ[contador]=RI[contador] + RH[contador-2] - RI[contador-2] -
RD[contador-2];
else if(contador == n-1)
PQ[contador]=RH[contador-2] - RI[contador-2] - RD[contador-2];
else
PQ[contador]=RH[n/2] - RI[n/2] - RD[n/2] + RD[contador-n];
contador++;
}
contador=1;
for(i=n+1; i<(2*n)-1; i++){
PQ[i]=RD[contador];
contador++;
}
}
/*Algoritmo basado en la tecnica Divide y Venceras*/
int multiplicar(int *P, int *Q, int *PQ, int n, int *aux, int *vectorr){
int i=0, j=0, producto;
int PI[n/2];
int PD[n/2];
int QI[n/2];
int QD[n/2];
int sumaP[n/2];
int sumaQ[n/2];
int *RI=(int *)malloc(sizeof(int));
int *RD=(int *)malloc(sizeof(int));
int *RH=(int *)malloc(sizeof(int));
if(n == 1){ /*Caso base de la recursividad. Operar con escalares.*/
producto = *P * *Q;
return producto;
}
/*Dividir los polinomios*/
else{
for(i=0; i<(n/2); i++)
PI[i]=P[i];

for(j=0; j<(n/2); j++){
PD[j]=P[i];
i++;
}
for(i=0; i<(n/2); i++)
QI[i]=Q[i];

for(j=0; j<(n/2); j++){
QD[j]=Q[i];
i++;
}
/*Aqui calcular las erres: RI, RD y RH*/
*RI=multiplicar(PI,QI,RI,n/2,aux,vectorr);
*RD=multiplicar(PD,QD,RD,n/2,aux,vectorr);
for(i=0; i<n/2; i++)
sumaP[i]=PI[i] + PD[i];
for(i=0; i<n/2; i++)
sumaQ[i]=QI[i] + QD[i];
*RH=multiplicar(sumaP,sumaQ,RH,n/2,aux,vectorr);
/*PQ = (RH - RI - RD)*/
*PQ = *RH - *RI - *RD;
vectorr[*aux]=*RI;
(*aux)++;
vectorr[*aux]=*PQ;
(*aux)++;
vectorr[*aux]=*RD;
(*aux)++;
}
free(RI); free(RD); free(RH);
return 0;
}
  #2 (permalink)  
Antiguo 16/04/2007, 20:10
 
Fecha de Ingreso: noviembre-2003
Ubicación: Mexico
Mensajes: 1.081
Antigüedad: 20 años, 5 meses
Puntos: 7
Re: multiplicación de polinomios

copie y pegue tu codigo sin mirarlo en mi visual studio, y me manda 34 errores exactamente.
Algunos son porque supongo que estas usando funciones no standard de borland, y las demas.... me dio flojera leer por que.

Lo que te puedo decir es:
Mejor explicanos cual es tu problema.
No te compila? si es asi, cual es el error exacto que te manda y que linea?

Si te da error en tiempo de ejecucion, cual es el error? al hacer que? que te dice el debugger?

Si simplemente no te da el resultado deseado, explicanos con palabras cual es la tecnica, y conforme vas avanzando en el codigo, explicanos detalladamente que hace, paso a paso, para asi ver como se te puede ayudar. Ah, y tambien seria bueno que usaras variables mas descriptivas (aunque por lo general te lleven a nombres mucho mas largos)

saludos,
  #3 (permalink)  
Antiguo 18/04/2007, 06:00
 
Fecha de Ingreso: marzo-2007
Mensajes: 5
Antigüedad: 17 años, 1 mes
Puntos: 0
Re: multiplicación de polinomios

Buenas,

Yo uso el programa Dev-c++. Y con este programa no tenía ningún error de compilación.

Pero a la hora de ejecutarlo, no me aparece el resultado de la multiplicación de los polinomios.

  #4 (permalink)  
Antiguo 18/04/2007, 12:25
 
Fecha de Ingreso: noviembre-2003
Ubicación: Mexico
Mensajes: 1.081
Antigüedad: 20 años, 5 meses
Puntos: 7
Re: multiplicación de polinomios

Cita:
Iniciado por blackwind Ver Mensaje
Si simplemente no te da el resultado deseado, explicanos con palabras cual es la tecnica, y conforme vas avanzando en el codigo, explicanos detalladamente que hace, paso a paso, para asi ver como se te puede ayudar.
lo puse, porque en lo personal, el codigo se me hace feo para leerlo, sobre todo que no se como se resuelve el problema "a mano" ni los pasos a seguir.....

Si no lo quieres hacer, quizas tendras que esperar a que otra persona quiera venir a ayudarte leyendo el codigo asi...

saludos,
  #5 (permalink)  
Antiguo 19/04/2007, 03:33
 
Fecha de Ingreso: marzo-2007
Mensajes: 5
Antigüedad: 17 años, 1 mes
Puntos: 0
Re: multiplicación de polinomios

hola de nuevo,

La técnica utilizada es:

Tenemos 2 polinomios de grado n-1

P(x) = P0 + P1x + P2x(elevado a 2) +……+Pn-1x(elevado a n-1)

Q(x) = Q0 + Q1x + Q2x(elevado a 2) +……+Qn-1x(elevado a n-1)

Hay que dividir cada polinomio en 2 polinomios de grado n/2.

Consideramos Pi la parte izquierda del polinomio P, Pd la parte derecha del polinomio P.

Pi(x) = P0 + P1x + P2x(elevado a 2) +…….+P(n/2)-1x(elevado a (n/2) -1)

Pd(x) = Pn/2 + P((n/2)+1)x + P2x(elevado a 2) +…….+P(n/2)-1x(elevado a (n/2) -1)

Ejemplo: 1 + 2x +3x(al cuadrado) + 4x(al cubo)
La parte izquierda sería 1+2x y la derecha el resto.

Como hemos hecho esa división antes el polinomio P quedaría de la siguiente manera:

P(x) = Pi(x) + Pd(x) x(elevado a n/2)
Nota: Como ves solo a la parte derecha hay que multiplicarla por x elevado a n/2.

Con el polinomio Q hay que hacer lo mismo que con el polinomio P:

Q(x) = Qi(x) + Qd(x) x(elevado a n/2)

P(x) Q(x) = Pi Qi + (Pi Qd + PdQi) x (elevado a n/2) + Pd Qd x(elevado a n) (n sale como resultado de sumar n/2 + n/2).

Hay que buscar una aproximación para reducir el número de multiplicaciones porque sino la complejidad será de n al cuadrado.

Ri(x) = Pi(x) Qi(x)

Rd(x) = Pd(x) Qd(x)

Rh(x) = (Pi(x) + Pd(x)) (Qi(x) + Qd(x))

P(x) Q(x) = Ri(x) + (Rh(x) – Ri(x) – Rd(x)) x (elevado a n/2) + Rdx (elevado a n)
Aunque es más grande, el número de operaciones se ha reducido a 3.



Si Pi = 5x +3 y Pd = 6x + 2

(5x + 3) + (6x + 2) = 11x + 5

Ejemplo:

P(x) = -1 + 2x + x (elevado a 2) + 3x (elevado a 3) n=4 por lo que el grado es n-1=3

Q(x) = 2 + x – x (elevado a 2) + 2x (elevado a 3)

Dividir los polinomios:

P(x) = (-1 + 2x) + (1 + 3x) x (elevado a 2)
Pi Pd

Q(x) = (2 + x) + (-1 + 2x) x (elevado a 2)
Pi Pd

Ri(x) = (-1 + 2x) (2 + x) = -2 + 3x + 2x (elevado a 2)

Rd(x) = (1 + 3x) (-1 + 2x) = -1 –x + 6x (elevado a 2)

Rh(x) = (-1 + 2x + 1 + 3x) (-1 + 2x + 2 + x) = 5x + 15x (elevado a 2)

Combinar soluciones parciales siguiendo la fórmula:

P(x) Q(x) = -2 + 3x + 2x (elevado a 2) + (5x + 5x (elevado a 2) + 2 – 3x – 2x (elevado a 2) + 1 + x – 6x (elevado a 2)) x(elevado a 2) + (1 – x + 6x(elevado a 2)) x (elevado a 4)

Lo primero que hago es comprobar que el grado del polinomio es múltiplo de 2.

Después lleno los vectores correspondientes para almacenar los polinomios.

En el método Multiplicar es el que utiliza la técnica de divide y Vencerás, en el cual se van dividiendo los problemas hasta llegar al caso base, que es cuando el grado del polinomio es 1, que entonces es como multiplicar dos escalares.

El método Combinar, es es que combina las soluciones obtenidas en el método multiplicar, para devolver una solución al problema.

Es que llevo tanto tiempo mirando el código que ya no encuentro ningún error. Por eso, estoy pidiendo ayuda.

Gracias, por preocuparte.

Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta

SíEste tema le ha gustado a 2 personas (incluyéndote)




La zona horaria es GMT -6. Ahora son las 00:14.