Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: tenshi96 en 22 Mayo 2016, 03:44 am



Título: Calcular las n raices racionales de un polinomio grado n (dudas particulares)
Publicado por: tenshi96 en 22 Mayo 2016, 03:44 am
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:
Código
  1. #include<stdio.h>
  2. #include<math.h>
  3. #define MD 99
  4. #define MDU 9999 //MaximaDimensionUltra
  5.  
  6. int main(){
  7. int i,j,c,e,Comb;
  8. int P[MD],n,Factorizo;
  9. //int MNR;//Maximo Numero de Raices
  10. float DC[MD],DE[MD];//Divisores Constante/Exponente
  11. int NMDc,NMDe,NMComb;//Numero Maximo Divisores constante/exponente NumeroMaximoCombinaciones
  12. double PR[MDU]; //Posibles Raices
  13.  
  14. printf("Dame el grado del polinomio\n");
  15. scanf("%d",&n);
  16.  
  17. if(n<0){
  18. printf("No es un polinomio");
  19. }
  20.  
  21. if(n==0){
  22. printf("No es un polinomio, es una constante");
  23. }
  24.  
  25. if(n>0){
  26. printf("\nDame el coeficiente de cada X\n");
  27. printf("NOTA: X^0 es la constante\n\n");
  28.  
  29.  
  30. for(i=0;i<n+1;i++){
  31. printf("X^%d= ",i);
  32. scanf("%d",&P[i]);
  33. }
  34.  
  35. printf("\nPolinomio:\n");
  36. for(i=0;i<n+1;i++){
  37. printf("(%d)X^%d",P[i],i);
  38. if(i != n) printf("+");
  39. }
  40.  
  41.  
  42. if(P[0]==0){
  43. Factorizo=0;
  44. for(i=0;i<Factorizo+1;i++){
  45. if(P[i]==0){
  46. Factorizo=Factorizo+1;
  47. }
  48. }
  49.  
  50. printf("\n\nPero podemos factorizar %d X, por lo tanto ya sabemos que tiene %d raices igual a 0\n\n",Factorizo,Factorizo);
  51.  
  52. for(i=0;i<n+1;i++){
  53. P[i]=P[i+Factorizo];
  54. }
  55.  
  56. printf("\nNuevo Polinomio:\n");
  57. for(i=0;i<n+1-Factorizo;i++){
  58. printf("(%d)X^%d \n",P[i],i);
  59. }
  60. }
  61.  
  62. else{
  63. Factorizo=0;
  64. }
  65.  
  66. if(P[n]==0){
  67. n=n-1;
  68. for(i=n;i>n-1;i--){
  69. if(P[i]==0){
  70. n=n-1;
  71. }
  72. }
  73.  
  74.  
  75.  
  76. printf("\n\nY tambien podemos eliminar algunas X\nNuevo Polinomio:\n");
  77. for(i=0;i<n+1;i++){
  78. printf(" %dX^%d\n",P[i],i);
  79. }
  80. }
  81.  
  82. printf("\nDivisores de constante\n");
  83. c=0;
  84. NMDc=0;
  85. for(i=1;i<P[0]+1;i++){
  86. if(P[0]%i==0){
  87. DC[c]=i;
  88. c++;
  89. NMDc=NMDc+1;
  90. }
  91. }
  92.  
  93. printf("\nA %d lo dividen:\n",P[0]);
  94. for(c=0;c<NMDc;c++){
  95. printf("%f\n",DC[c]);
  96. }
  97.  
  98. printf("\n\nDivisores de exponente\n");
  99. e=0;
  100. NMDe=0;
  101. for(i=1;i<P[n]+1;i++){
  102. if(P[n]%i==0){
  103. DE[e]=i;
  104. e++;
  105. NMDe=NMDe+1;
  106. }
  107. }
  108.  
  109. printf("\nA %d lo dividen:\n",P[n]);
  110. for(e=0;e<NMDe;e++){
  111. printf("%f\n",DE[e]);
  112. }
  113.  
  114. Comb=0;
  115. NMComb=0;
  116. for(i=0;i<NMDc;i++){
  117. for(j=0;j<NMDe;j++){
  118. PR[Comb]=DC[i]/DE[j];
  119. Comb++;
  120. NMComb=NMComb+1;
  121. }
  122. }
  123.  
  124. printf("\nPosibles Raices:\n");
  125. for(i=0;i<NMComb;i++){
  126. printf("%f\n",PR[i]);
  127. }
  128.  
  129. }
  130. return 0;
  131. }


→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


Título: Re: Calcular las n raices racionales de un polinomio grado n (dudas particulares)
Publicado por: AlbertoBSD en 22 Mayo 2016, 17:14 pm
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]....

Código
  1. for(i=0;i<n+1;i++){
  2.      printf("X^%d= ",i);
  3.      scanf("%d",&P);
  4.   }

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.


Título: Re: Calcular las n raices racionales de un polinomio grado n (dudas particulares)
Publicado por: JavierScars en 23 Mayo 2016, 04:12 am
Código:
#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.