Ejercicio de polinomios con pythontex y el paquete polynom

En este artículo voy a mostrar cómo resolver un ejercicio del tipo:

Ejercicio

  1. Dados los polinomios \(p(x)=8x^{3}+4x^{2}+1\) y \(q(x)=3x^{2}-1\). :
    1. Divide \(p(x)\) entre \(q(x)\)
    2. Calcula el valor numérico de \(p(x)\) en \(x=-\frac{1}{2}\)
    1. Factoriza: \(p(x)=x^{6}-16x^{5}+79x^{4}-100x^{3}-236x^{2}+656x-384\)
    2. Resuelve la ecuación: \(x^{6}-16x^{5}+79x^{4}-100x^{3}-236x^{2}+656x-384=0\)

usando pythontex y el paquete polynom. La idea es crear una plantilla en formato LyX/LaTeX que permita crear y resolver cualquier ejercicio de ese tipo independientemente de los polinomios que pasemos como argumentos. Al final de este artículo tienes un enlace que te permite descargarla.

  • Con pythontex vamos a poder hacer el ejercicio parametrizado. Es decir, podemos obtener la solución de cualquier ejercicio de características similares al anterior. La parametrización realizada consiste en que en el código pyhton del inicio tendremos que definir:

    #valores que podemos modificar
    #definimos los polinomios con los operar para el primer ejercicio
    p=8*x**3+4*x**2+1
    q=3*x**2-1
    
    #número en el que calcular el valor numérico
    #se trata de una fracción
    vn=Rational(-1,2)
    
    #establecemos las raíces (enteras) del polinomio a factorizar del 2º ejercicio
    raices=[8,1,-2,2,3,4]
    
    • Polinomios \(p\) y \(q\) del primer ejercicio y número en el que calcular el valor numérico.
    • Raíces del segundo polinomio. El ejercicio está preparado para raíces enteras incluyendo el \(0\). En ese caso, si el \(0\) es una raíz, primero saca factor común. La factorización se realiza por el método de Ruffini.
  • Una vez introducidos los valores anteriores, pythontex se encarga de poner los polinomios en el enunciado a partir de los datos que hemos introducido y de hallar la solución de ejercicio.

  • El paquete polynom se usa para hacer las divisiones de polinomios a partir de los polinomios y raíces que se le pasan como argumento. De él uso los comandos:

    • \polylongdivpara hacer la división de polinomios del primer ejercicio.
    • \polyhornerschemepara hacer la división por Ruffini.
  • La solución obtenida del ejercicio con los datos que aparecen al inicio es:

    image

  • El código python del fichero es:

\begin{sympycode}
x=var('x')

#valores que podemos modificar
#definimos los polinomios con los operar para el primer ejercicio
p=8*x**3+4*x**2+1
q=3*x**2-1

#número en el que calcular el valor numérico
#se trata de una fracción
vn=Rational(-1,2)

#establecemos las raíces (enteras) del polinomio a factorizar del 2º ejercicio
raices=[8,1,-2,2,3,4]

#comenzamos a hacer las "operaciones"
#construyo mis polinomios a partir de las raíces anteriores
#el primero (pf) el polinomio a factorizar
#el segundo (pfaux) con término independiente distinto de cero (para poder aplicar Ruffini)
pf=pfaux=1
for i in raices:
    pf=pf*(x-i)
    if i != 0:
        pfaux= pfaux*(x-i)
#Los expando
pf=expand(pf)
pfaux=expand(pfaux)

#polinomio con las raíces igual a 0
pfx=simplify(pf/pfaux)

#Función que si tenemos raíces iguales a 0 discrimina el
#polinomio a factorizar y el texto a mostrar
def impTexto(pol):
    if pol==1:
        print("Como su término independiente es distinto de $0$ no podemos sacar $x$ factor común:\n")
        print(r"$$p(x)="+latex(pfaux)+"$$")
    else:
        print("Como no tiene término independiente podemos sacar factor común y por tanto:\n")
        print(r"$$p(x)="+latex(pfx)+"\cdot"+"("+latex(pfaux)+")$$\n")
        print("El polinomio que ahora debemos factorizar es:\n")
        print(r"$$q(x)="+latex(pfaux)+"$$")

#Función que obtiene una división por Ruffini
#uso la función polyhornerscheme del paquete polynom
def divRuffini(r,pol):
    div=x-r
    paux=latex(pol)
    cadena=r'\polyhornerscheme[x='+str(r)+',resultleftrule=true,resultbottomrule=true,resultstyle=\color{blue}]{'+ paux+ '}'
    print(cadena)

#Función para hacer todos los pasos de Ruffini
#ordeno las raíces de menor a mayor a partir del valor absoluto
#se puede hacer más fácil a partir de la lista de raíces, pero es para que se conozca esa función
def factR(pol):
    for i in sorted(real_roots(pol),key=abs):
        divRuffini(i,pol)
        pol=quo(pol,x-i,domain=QQ)
        print('\n')

#Función que obtiene la división Euclidea de dos polinomios
#uso polylongdiv del paquete de LateX polynom
def divPol(dividendo,divisor):
    cadena=r'\polylongdiv[style=D]{'+latex(dividendo)+'}{'+latex(divisor)+ '}'
    print(cadena)

\end{sympycode}
  • Podéis acceder al fichero fuente en formato LyX en el siguiente enlace.
  • El resultado de compilarlo en formato pdf se puede ver accediendo al fichero.