Estoy tratando de escribir un código en Python para hacer lo siguiente. Podemos expresar la conjetura de Erdos-Straus en función de algunos polinomios $x(k), y(k), z(k) \in \mathbb{Q}[k]$ tal que $\frac4k = \frac{1}{x(k)} + \frac{1}{y(k)} + \frac{1}{z(k)}$ . Nótese que los coeficientes son números racionales, pero tienen que ser enteros para poder utilizarlos en esta conjetura. Se dan las siguientes fórmulas:
- $ \frac4k = \frac1{uk} + \frac1{vk} + \frac{4uv - u - v}{uvk} \quad(P1)$
- $ \frac4k = \frac1{uk} + \frac{4u-1}{uk+v} + \frac{(4u-1)v}{uk(uk+v)}\quad (P2) $
- $ \frac4k = \frac{4u}{uk+v+1} + \frac4{k(uk+v+1)} + \frac{4v}{k(uk+v+1)}\quad (P3)$
- $ \frac4k = \frac4{k+v} + \frac{4v}{k(k+4u+v)} + \frac{16uv}{k(k+v)(k+4u+v)} \quad (P4) $
El siguiente teorema se utiliza para determinar cuándo los polinomios dan valores enteros: Considere $f \in \mathbb{Q}[k]$ es elegir $m \in \mathbb{Z}$ tal que $m \cdot f$ sólo tiene coeficientes enteros. Consideremos ahora $n = am+b \in \mathbb{Z}$ con $0 \le b < m$ . Entonces $f(n) \in \mathbb{Z}$ si $(m\cdot f)(b) \equiv 0\,\,(mod\,\,m)$ .
Este teorema implica que sólo mirando las clases de residuos modulo $m$ es suficiente para saber para qué enteros $n$ también $f(n)$ será un número entero.
Para la conjunción Erdös-Straus tengo tres polinomios $f_1(n), f_2(n), f_3(n)$ . Quiero saber para qué $n$ los tres Los polinomios tienen coeficientes enteros. Consideremos los correspondientes $m$ -valores $m_1,m_2,m_3$ y que $m$ sea igual a $lcm(m_1,m_2,m_3)$ . Aplicando el teorema anterior (con el $m$ encontrados), basta con comprobar para qué clases de residuos modulo $m$ los tres polinomios $f_1,f_2,f_3$ serán números enteros.
Así, me gustaría escribir una función en Python que tenga valores concretos de $u$ y $v$ como entrada. Quiero calcular el valor correcto de $m$ y comprobar para qué clases de residuos modulo $m$ los polinomios tienen valores enteros. Por lo tanto, la salida debe ser una tupla ( $m$ ,L) con L la lista de clases de residuos modulo $m$ (que cumplan las condiciones). Quiero poder utilizar esta función para (P1), (P2), (P3) y (P4).
Esto es lo que tengo hasta ahora:
P.<k> = PolynomialRing(QQ)
var('x,y,z')
def P1(u,v):
x = u*k
y = v*k
z = (u*v*k)/(4*u*v-u-v)
return (x,y,z)
def P2(u,v):
x = u*k
y = (u*k+v)/(4*u-1)
z = (u*k*(u*k+v))/((4*u-1)*v)
return (x,y,z)
def P3(u,v):
x = (u*k+v+1)/(4*u)
y = (k*(u*k+v+1))/4
z = (k*(u*k+v+1))/(4*v)
return (x,y,z)
def P4(u,v):
x = (k+v)/4
y = (k*(k+4*u+v))/(4*v)
z = (k*(k+v)*(k+4*u+v))/(16*u*v)
return (x,y,z)
var('m,k')
def findM(f):
m = (f(k=1)^-1).denominator()
return m
var('u,v,P,m1,m2,m3,m,k')
def mP(u,v,P):
D = P(u,v)
m1 = findM(D[0])
m2 = findM(D[1])
m3 = findM(D[2])
m = lcm([m1,m2,m3])
L = []
for i in xrange(1,m-1):
if((D[0](k=i)^-1).denominator() == 1 and (D[1](k=i)^-1).denominator() == 1 and (D[2](k=i)^-1).denominator() == 1 and Mod(m*((D[0]^-1) + (D[1]^-1) + (D[2]^-1))(k=b),m) == 0):
L.append(i)
return (m,L)
El problema es que sigo obteniendo una lista vacía. Estoy usando Sage Math para calcular esto (que está basado en Python - algo así). ¿Puede alguien ayudarme, por favor?
¡Infinitamente agradecido!