Calcular las n raices racionales de un polinomio grado n (dudas particulares)

Iniciado por tenshi96, 22 Mayo 2016, 03:44 AM

0 Miembros y 1 Visitante están viendo este tema.

tenshi96

Buenas, es un trabajo y se me acaba el tiempo.
tengo 2 problemas...
El programa que llevo hecho me da una lista de las posibles raíces racionales que tendrá el polinomio, lo que quiero añadir ahora es que de esa lista elimine los elementos repetido, no eh logrado hacerlo bien y ya lo batalle bastante.
Me salte ese paso aunque sabia que seria mas tardado, que todas las posibles raíces las pruebe haber cual es, ya que sepa cual es, las guarde en un vector y al final me diga "estas son las raíces"

Les dejo el código que llevo y al final una explicación de como se hace a mano, lápiz y calculadora.
por favor lo menos C++ que puedan usar.

Codigo:
#include<stdio.h>
#include<math.h>
#define MD 99
#define MDU 9999 //MaximaDimensionUltra

int main(){
int i,j,c,e,Comb;
int P[MD],n,Factorizo;
//int MNR;//Maximo Numero de Raices
float DC[MD],DE[MD];//Divisores Constante/Exponente
int NMDc,NMDe,NMComb;//Numero Maximo Divisores constante/exponente NumeroMaximoCombinaciones
double PR[MDU]; //Posibles Raices

printf("Dame el grado del polinomio\n");
scanf("%d",&n);

if(n<0){
printf("No es un polinomio");
}

if(n==0){
printf("No es un polinomio, es una constante");
}

if(n>0){
printf("\nDame el coeficiente de cada X\n");
printf("NOTA: X^0 es la constante\n\n");


for(i=0;i<n+1;i++){
printf("X^%d= ",i);
scanf("%d",&P[i]);
}

printf("\nPolinomio:\n");
for(i=0;i<n+1;i++){
printf("(%d)X^%d",P[i],i);
if(i != n) printf("+");
}


if(P[0]==0){
Factorizo=0;
for(i=0;i<Factorizo+1;i++){
if(P[i]==0){
Factorizo=Factorizo+1;
}
}

printf("\n\nPero podemos factorizar %d X, por lo tanto ya sabemos que tiene %d raices igual a 0\n\n",Factorizo,Factorizo);

for(i=0;i<n+1;i++){
P[i]=P[i+Factorizo];
}

printf("\nNuevo Polinomio:\n");
for(i=0;i<n+1-Factorizo;i++){
printf("(%d)X^%d \n",P[i],i);
}
}

else{
Factorizo=0;
}

if(P[n]==0){
n=n-1;
for(i=n;i>n-1;i--){
if(P[i]==0){
n=n-1;
}
}



printf("\n\nY tambien podemos eliminar algunas X\nNuevo Polinomio:\n");
for(i=0;i<n+1;i++){
printf(" %dX^%d\n",P[i],i);
}
}

printf("\nDivisores de constante\n");
c=0;
NMDc=0;
for(i=1;i<P[0]+1;i++){
if(P[0]%i==0){
DC[c]=i;
c++;
NMDc=NMDc+1;
}
}

printf("\nA %d lo dividen:\n",P[0]);
for(c=0;c<NMDc;c++){
printf("%f\n",DC[c]);
}

printf("\n\nDivisores de exponente\n");
e=0;
NMDe=0;
for(i=1;i<P[n]+1;i++){
if(P[n]%i==0){
DE[e]=i;
e++;
NMDe=NMDe+1;
}
}

printf("\nA %d lo dividen:\n",P[n]);
for(e=0;e<NMDe;e++){
printf("%f\n",DE[e]);
}

Comb=0;
NMComb=0;
for(i=0;i<NMDc;i++){
for(j=0;j<NMDe;j++){
PR[Comb]=DC[i]/DE[j];
Comb++;
NMComb=NMComb+1;
}
}

printf("\nPosibles Raices:\n");
for(i=0;i<NMComb;i++){
printf("%f\n",PR[i]);
}

}
return 0;
}



→Como hacerlo a mano:
primero factorizas lo que sea necesario para que el polinomio tenga una constante, ya que tenga una constante buscas todos los números enteros que dividen ese numero (Nota: la constante debe ser entera), después tomas el coeficiente de la X exponencial mas grande y buscas todos los números enteros que lo dividen.
Tienes 2 listas, divisores de constante y divisores del coeficiente de la X exponencial mas grande.
Comienzas a dividir todas constantes entre todos los divisores de exponencial. tendrás una nueva lista de posibles raíces racionales... pero esto solo son las positivas, copias esa lista pero con signo negativo y ya tienes una nueva lista.

pruebas cada uno de esos números que obtuviste al dividir, positivos y negativos en el polinomio, y si alguno te da 0, Es raiz.

Gracias de antemano

AlbertoBSD

Detecte un error en tu codigo, P es un arreglo pero ahi capturas en la direcccion de P y corresponfe solo al elemento P[0]....

for(i=0;i<n+1;i++){
      printf("X^%d= ",i);
      scanf("%d",&P);
   }


No he visto el demas codigo pero es lo que vi en este momento....

Ya qie tenga la laptop en frente lo reviso a fondo.

Saludos.
Donaciones
1Coffee1jV4gB5gaXfHgSHDz9xx9QSECVW

JavierScars


#include<stdio.h>
#include<math.h>
#define MD 99
#define MDU 9999 //MaximaDimensionUltra

int main(){
   int i,j,c,e,Comb, op;
   int P[MD],n,Factorizo;
   //int MNR;//Maximo Numero de Raices
   float DC[MD],DE[MD], temp;//Divisores Constante/Exponente
   int NMDc,NMDe,NMComb;//Numero Maximo Divisores constante/exponente NumeroMaximoCombinaciones
   double PR[MDU]; //Posibles Raices

   printf("Dame el grado del polinomio\n");
   scanf("%d",&n);

   if(n<0){
   printf("No es un polinomio");
   }

   if(n==0){
      printf("No es un polinomio, es una constante");
   }

   if(n>0){
   printf("\nDame el coeficiente de cada X\n");
   printf("NOTA: X^0 es la constante\n\n");


   for(i=0;i<n+1;i++){
      printf("X^%d= ",i);
      scanf("%d",&P[i]);
   }

   printf("\nPolinomio:\n");
   for(i=0; i < n+1; i++){
   printf("(%d)X^%d",P[i],i);
   if(i != n) printf("+");
   }


      if(P[0]==0){
         Factorizo=0;
            for(i=0;i<Factorizo+1;i++){
               if(P==0){
                  Factorizo=Factorizo+1;
                  }
               }

            printf("\n\nPero podemos factorizar %d X, por lo tanto ya sabemos que tiene %d raices igual a 0\n\n",Factorizo,Factorizo);

            for(i=0;i<n+1;i++){
            P[i]=P[i+Factorizo];
            }

            printf("\nNuevo Polinomio:\n");
            for(i=0;i<n+1-Factorizo;i++){
               printf("(%d)X^%d \n",P,i);
                  }
               }

      else{
         Factorizo=0;
      }

         if(P[n]==0){
         n=n-1;
         for(i=n;i>n-1;i--){
            if(P==0){
               n=n-1;
            }
         }



   printf("\n\nY tambien podemos eliminar algunas X\nNuevo Polinomio:\n");
         for(i=0;i<n+1;i++){
         printf(" %dX^%d\n",P,i);
      }
   }

      printf("\nDivisores de constante\n");
      c=0;
      NMDc=0;
      for(i=1;i<P[0]+1;i++){
         if(P[0]%i==0){
            DC[c]=i;
            c++;
            NMDc=NMDc+1;
            }
      }

      printf("\nA %d lo dividen:\n",P[0]);
         for(c=0;c<NMDc;c++){
         printf("%.0f\n",DC[c]);
         }

   printf("\n\nDivisores de exponente\n");
      e=0;
      NMDe=0;
      for(i=1;i<P[n]+1;i++){
         if(P[n]%i==0){
            DE[e]=i;
            e++;
            NMDe=NMDe+1;
            }
      }

      printf("\nA %d lo dividen:\n",P[n]);
         for(e=0;e<NMDe;e++){
         printf("%.0f\n",DE[e]);
         }

   Comb=0;

   NMComb=0;
   for(i=0;i<NMDc;i++){
      for(j=0;j<NMDe;j++){
         PR[Comb] = DC[i] / DE[j];
         Comb++;
         NMComb = NMComb+1;
      }
   }

    for (i=0; i<NMComb; i++)
   {
       op = 1;

       for(j=0; j<NMComb; j++)
       {
           if(PR[j] < PR[i])
           {
               temp = PR[i];
               PR[i] = PR[j];
               PR[j] = temp;
           }

           if(PR[j] == PR[i]  && i != j)
           {
               PR[j] = 999;
           }

       }
   }

   printf("\nPosibles Raices:\n");
      for(i=0;i<NMComb;i++){
            if(PR[i] != 999)
         printf("%.4f\n",PR[i]);
      }

   }
   return 0;
}

Ahi esta ya lo primero resuelto para calcular cuales son las raices que funcionan tienes que hacer dentro de un for que pruebe con los resultados sustituyendolos en x y efectuando las operaciones si el resultado de todo da 0 que imprima dicho valor y ya.
Usa lo malo de la vida a tu favor, escala montañas de problemas para deslizarte sobre soluciones, derrumba muros de decepciones para encontrar la libertar de la felicidad,  y quema la leña del fracaso para calentarte con el éxito. Recuerda que sin la oscuridad la luz no brillaría tanto.