Multiplicar polinomios C

ZeNiT2

Buenas mi duda es que me piden multiplicar 2 polinomios a+ax+ax²....axn y he averiguado a multiplicarlos si son del mismo grado pero como cuando se multiplican se van sumando el grado hay ya me pierdo programandolo si alguien me puede pasar el codigo o explicarme como seria se lo agradeceria .

un salu2

Gnos1s

Si miras el polinomio como un array, de la siguiente forma:

v[0]=a
v[1]=b
v[2]=c
....
v[n]=d

Eso representa al polinomio a+bx+cx²+...+dxn.

Si te fijas, la posición del elemento dentro del array es el grado de la X que le acompaña. El resto es aplicar la operación.

El algoritmo para hacer la multiplicación es O(n²). Mediante los índices, calculas los grados que salen.

Para i <- 1 ... N (N es la longitud del array)
....Para j <- 1 ... N
.......Si v1 AND v2[j] existen entonces
............v3[i+j]=v3[i+j] + v1[2]*v2[1]

Eso suponiendo que lo haces con arrays. Si lo haces con listas enlazadas, ya es un poco diferente, pero tampoco mucho.

ZeNiT2

Gracias si mas o menos lo que mas dicho es lo que tengo hecho , la suma la he hecho asi sumando v 1º polinomio + v del segundo ... lo que no me sales es eso cuando intento multiplicar ya que los grados se van sumando y creo que hay ya me lio.

Gnos1s

Tan simple como en el vector resultado, guardar el valor en la posición i+j. Siendo i=3 y j=2, por ejemplo:

v1[3]=4 (4x3)
v2[2]=5 (4x2)

v3[3+2]=4*5 (20x5)

Cuando te toque imprimir el resutlado, haces un recorrido, por ejemplo, en C podrías hacerlo así:

for(i=0;i<N;i++){
  if(v3[i]!=0 && i==0) printf("&d ",v3.resultado);
  else if(v3[i]!=0 && i==1) printf("&d x",v3.resultado);
  else if(v3[i]!=0) printf("&d x^%d",v3.resultado,i);
}
printf("\n");

De esta forma, imprimes a+ax+...+axn, sólo los grados que existan, y para i=0 e i=1, el formato es el correcto. También podrías poner los casos de i, dentro de si es true la condición.

Editado: corregido, cierto #4. Se me fue por completo.

JuAn4k4

#4 No.

Si el valor en v = 0, significa que no hay nada. No hacen falta boleanos.

//Inicializar
for ( i=0; i<=N; i++)
{
v[i] =0;
v1[i] = 0;
v2[i] = 0;
}

// Obtener valores de polinomios
// v1 y v2.


// Multiplicamos
for ( i=0; i<=N; i++)
{   for ( j=0; j<=N ; j++ )
        {
              if ( (i+j) > N ) { error () ; exit(0) ;}
           v[i+j] +=  v1[i] * v2[j] ;
        }
}


// Mostramos el resultado
for(i=N;i>=0;i--){
    switch ( v[i] ){
       case 1 : printf("x^%d +",i); break;
       case 0 : break;
       default:  printf("%d·x^%d +",v[i], i); break;
  }
 } 

Al final pintara un "+" de más pero es igual.

ZeNiT2

Muchas gracias a los 2

Lo he conseguio hacer creo que es diferente pero me ha funcionado
aqui lo dejo creo que esta hecho de forma muy sencilla:

int j,i;

for(i=0;i<t;i++)
for(j=0;j<t;j++)
{
if(i>n)
r[j]=w;
else if(i>m)
r[j]=v;
else
r[j]=v*w[j];
}

for(i=0;i<t;i++)
for(j=0;j<t;j++)
{
if(i==j)
g[i+j]=r[j];
else

g[i+j]=r[i][j]+r[j][i];

}
}

pd: ahora tengo que hacer otro apartado que ni si quiera se lo que significa...

Comprobar si un valor determinado de x, es raíz del segundo polinomio utilizando la regla de ruffini.

Gnos1s

#5 El valor puede ser hasta N+M, donde N y M son el valor del mayor grado de ambos polinomios. Esto tendrá que controlarlo mirando las longitudes.

#6 Simplemente es hacer el algoritmo de Ruffini.

JuAn4k4

#7 N es lo que reservas, en principio si el polinomio se pasa de ahi, mejor dejarlo. Y ¿ porque no permitir que uno de los polinomios sea de grado N +M ( en tu caso ) ? .

JuAn4k4

eco.

El antiflood que no funciona despues de hacer login. ( Login + Respuesta rapida = Control Antiflood que no funciona ).

Gnos1s

Me refería a que los polinomios tendrán un tamaño de array igual al grado del polinomio. Le puse N y M para diferenciar simplemente.

Usuarios habituales

  • Gnos1s
  • JuAn4k4
  • ZeNiT2