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 punterosa
que pasará la lista de coeficientes, una variable enteran
que almacena el grado del polinomio y otra variable enterax
que 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]
.int result = a[n];
Nota: No lo confunda con el tamaño de la matriz; inicializa la variable
resultado
con el elemento del arregloa
en la n-ésima posición. -
Se crea un bucle
for
, invirtiendo el bucle desde el último elemento de la matriza
hasta el índice 0. El valor de la variableresultado
se 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 porx
y 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-1
de la matriz, que es 3.Por esta razón, los coeficientes deben invertirse al inicializar en la función
main
. El valor deresultado
se 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
sol
para 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
Horner
con tres parámetros.int Horner(int a[], int n, int x)
-
Se crea una variable
resultado
y se inicializa con el primer elemento de la matriz desreferenciando el puntero. El puntero*a
es lo mismo que escribirarr[0]
.int result = *a;
En el ejemplo anterior, el método
Horner
necesitaba 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
for
que itera de 1 an
. En cada iteración, el valor de la variableresultado
se actualiza con el valor del polinomio.El valor de
resultado
se 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
n
contiene el grado del polinomio. El valor den
se calcula mediante:n = tamaño del arreglo -1
.int n = (*(&arr + 1) - arr) - 1; // n = size of the array - 1;
-
El método
Horner
se llama pasando la matriz, el valor den
y 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
iostream
y define el espacio de nombres comostd
.#include <iostream> using namespace std;
-
Se crea un método
Horner
que tiene tres parámetros: un puntero entero*pi
, otra variable enteragrado
, que es el grado del polinomio (usado comon
en el ejemplo anterior), yx
para 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
if
devuelve el valor depi
en el índice 0 solo si el valor del grado se ha reducido a 0.if (degree == 0) { return pi[0]; }
-
Para aplicar la recursividad, se vuelve a llamar al método
Horner
en lugar de devolver un valor.return Horner(pi, degree - 1, x) * x + pi[degree];
La sintaxis anterior mantiene el método
Horner
para 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.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
sol
y 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++.