Encuentre el valor del polinomio usando la regla de Horner en C++
- Encuentre el valor del polinomio usando la regla de Horner en C++ iterando el bucle hacia atrás
- Encuentre el valor del polinomio usando la regla de Horner en C++ iterando el bucle hacia adelante
- Use la recursividad para encontrar el valor del polinomio usando la regla de Horner en C++
- Conclusión
 
La regla de Horner es un algoritmo eficiente para calcular el valor de un polinomio.
Considere el polinomio p(x) = 6x^3 - 2x^2 + 7x + 5 en x = 4. Para calcularlo usando la regla de Horner en C++, el primer coeficiente, 6, se multiplica por el valor en x, que es 4, y el producto de los dos, que es 24, se suma al siguiente coeficiente -2.
La resultante se multiplica por 4 y se suma al siguiente coeficiente.
Este proceso se repite para el número de coeficientes en la ecuación. El producto final que queda es el valor del polinomio.
Este artículo explica cómo encontrar el valor de un polinomio usando la regla de Horner en C++ al convertir las reglas anteriores en código de computadora.
Consideremos un polinomio:
Si x = 4, el valor del polinomio es 385.
Encuentre el valor del polinomio usando la regla de Horner en C++ iterando el bucle hacia atrás
Veamos el programa que encuentra el valor de un polinomio usando la regla de Horner en C++ mediante bucle inverso.
- 
La primera línea de código importa el paquete de biblioteca iostream; en la segunda línea, el espacio de nombres se define comostd.
- 
Se crea un método int Horner()con tres parámetros: una matriz de punterosaque pasará la lista de coeficientes, una variable enteranque almacena el grado del polinomio y otra variable enteraxque almacena el valor del polinomio enx.int Horner(int* a, int n, int x)
- 
Esto explica cómo sumar el producto de polinomios entre sí. Se crea una variable entera resultado, inicializada con el último elemento del arregloa[n].
```c++
int result = a[n];
```
> Nota: No lo confunda con el tamaño de la matriz; inicializa la variable `resultado` con el elemento del arreglo `a` en la n-ésima posición.
- 
Se crea un bucle for, invirtiendo el bucle desde el último elemento de la matrizahasta el índice 0. El valor de la variableresultadose actualiza para cada iteración del bucle.for (int i = n - 1; i >= 0; --i)En la primera iteración, el valor de a[n]se multiplica porxy luego se suma al elemento anterior de la matriz:a[n-1]. Para una matriz -{2,3,4}, el bucle tomará el último elementoa[n], que es 4, lo multiplicará porx, y luego lo sumará al elementon-1de la matriz, que es 3.Por esta razón, los coeficientes deben invertirse al inicializar en la función main. El valor deresultadose devuelve al final del método.
- 
Dentro de la función main, se crea un array para pasarlo al primer parámetro del métodoHorner. Tenga en cuenta que el valor de los coeficientes dentro de la matriz se invierte porque el ciclo itera hacia atrás.
- 
Se crea una variable entera solpara almacenar el resultado devuelto por el método denominadoHorner.En el primer parámetro se pasa el array que se está creando. El segundo parámetro pasa el grado de los polinomios en la ecuación, 3, y el tercer parámetro pasa el valor en x.int sol = Horner(arr, 3, 4);
Código:
#include <iostream>
using namespace std;
int Horner(int* a, int n, int x) {
  int result = a[n];
  for (int i = n - 1; i >= 0; --i) result = result * x + a[i];
  return result;
}
int main() {
  int arr[4] = {5, 7, -2, 6};
  int sol = Horner(arr, 3, 4);
  cout << sol;
}
Salida (regla de Horner de bucle inverso en C++):
385
Encuentre el valor del polinomio usando la regla de Horner en C++ iterando el bucle hacia adelante
Si necesitamos ejecutar el bucle hacia adelante, a diferencia del último ejemplo, podemos eliminar la referencia del puntero de la matriz para obtener su primer elemento y ejecutar el bucle hacia adelante en lugar de invertirlo. Es otra forma de usar bucles para implementar la regla de Horner en C++.
Entendamos lo que hace el código:
- La primera línea de código importa el paquete de biblioteca iostream.
- Similar al ejemplo anterior, se crea un método Hornercon tres parámetros.
```c++
int Horner(int a[], int n, int x)
```
- 
Se crea una variable resultadoy se inicializa con el primer elemento de la matriz desreferenciando el puntero. El puntero*aes lo mismo que escribirarr[0].int result = *a;En el ejemplo anterior, el método Hornernecesitaba un componente de tamaño adjunto a su matriz:int result = a[n];para señalar el último elemento. Aquí, simplemente está desreferenciado.
- 
Se crea un bucle forque itera de 1 an. En cada iteración, el valor de la variableresultadose actualiza con el valor del polinomio.El valor de resultadose devuelve al final del método.for (int i = 1; i < n; i++) result = result * x + a[i]; return result;
- 
Dentro de la función main, se crea una matriz con el valor de los coeficientes. El polinomio utilizado aquí es:$$ 
 p(x) = 5x^4 + 3x^3 - 2x^2 + 4x - 6; x=-2
 $$La matriz se crea tomando los coeficientes de los polinomios - int arr[] = {5,3,-2,4,-6};.
- 
La variable ncontiene el grado del polinomio. El valor dense calcula mediante:n = tamaño del arreglo -1.int n = (*(&arr + 1) - arr) - 1; // n = size of the array - 1;
- 
El método Hornerse llama pasando la matriz, el valor deny el valor enx. El resultado devuelto se almacena en una nueva variable entera y se imprime.int sol = Horner(arr, n, -2); std::cout << "Value of polynomial = " << sol;
Código:
#include <iostream>
int Horner(int a[], int n, int x) {
  int result = *a;
  for (int i = 1; i < n; i++) result = result * x + a[i];
  return result;
}
int main() {
  int arr[] = {5, 3, -2, 4, -6};
  int n = (*(&arr + 1) - arr) - 1;
  int sol = Horner(arr, n, -2);
  std::cout << "Value of polynomial = " << sol;
}
Salida (regla de Horner de bucle hacia adelante en C++):
Value of polynomial = -20
Use la recursividad para encontrar el valor del polinomio usando la regla de Horner en C++
Hasta ahora, hemos aprendido a encontrar el valor de un polinomio usando la regla de Horner en C++. Se hizo iterando bucles y actualizando el conteo usando una variable acumuladora.
En este ejemplo, el valor del polinomio se calcula por recursión. Veamos el código.
- 
La primera línea de código importa el paquete iostreamy define el espacio de nombres comostd.#include <iostream> using namespace std;
- 
Se crea un método Hornerque tiene tres parámetros: un puntero entero*pi, otra variable enteragrado, que es el grado del polinomio (usado comonen el ejemplo anterior), yxpara pasar el valor enx.int Horner(int* pi, int degree, int x)
- 
La característica de la función recursiva es seguir llamándose a sí misma como un bucle hasta que se cumpla una condición, lo que reduce la complejidad del tiempo. Para la condición, una instrucción ifdevuelve el valor depien el índice 0 solo si el valor del grado se ha reducido a 0.
```c++
if (degree == 0) {
  return pi[0];
}
```
- 
Para aplicar la recursividad, se vuelve a llamar al método Horneren lugar de devolver un valor.return Horner(pi, degree - 1, x) * x + pi[degree];La sintaxis anterior mantiene el método Hornerpara llamarse a sí mismo repetidamente por el grado del polinomio presente. En una ecuación, el grado del polinomio es su máximo exponente.Si se considera la ecuación utilizada en el último ejemplo: $$ p(x) = 5x^4 + 3x^3 - 2x^2 + 4x - 6; x=-2 $$El grado del polinomio es 4. Esto significa que la recursividad se repetirá a sí misma para n+1= 5 veces (tamaño de la matriz). En cada iteración, el método se llamará a sí mismo hasta que el valor del grado se reduzca a0.Una vez que llegue a 0, la recursividad tomará el elemento*p[0]y lo pasará a su llamada de método anterior.
```c++
return Horner(pi, degree - 1, x) * x + pi[degree];
```
Es lo mismo que abrir un sobre dentro de un sobre hasta llegar al último y luego volver a doblarlo. El valor de la última llamada al método se pasa a la llamada al método anterior y se ejecutan los cálculos.
- 
Dentro de la función main, se crea una matriz de enteros para pasar los coeficientes de la ecuación al métodoHorner. Luego, el valor de los parámetros se pasa al método.int sol = Horner(arr, 4, -2);La matriz es arr, grado -4, y valor enx, que es-2.
- 
Por último, el resultado devuelto se almacena en una variable entera soly se imprime.
Código:
#include <iostream>
using namespace std;
int Horner(int* pi, int degree, int x) {
  if (degree == 0) {
    return pi[0];
  }
  return Horner(pi, degree - 1, x) * x + pi[degree];
}
int main() {
  int arr[] = {5, 3, -2, 4, -6};
  int sol = Horner(arr, 4, -2);
  cout << "Value of Polynomial using recursion = " << sol;
}
Producción :
Value of Polynomial using recursion = 34
Conclusión
Este artículo explica cómo encontrar el valor de polinomios usando la regla de Horner en C++. Los tres métodos tienen diferentes complejidades de tiempo que pueden ser una gran herramienta de aprendizaje para el lector.
Se recomienda intentar escribir los códigos usted mismo y luego regresar para obtener sugerencias. El lector entenderá fácilmente los conceptos de encontrar el valor de polinomios usando la regla de Horner en C++.