2 votos

La conjetura de Erdős-Straus utilizando polinomios en Python

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:

  1. $ \frac4k = \frac1{uk} + \frac1{vk} + \frac{4uv - u - v}{uvk} \quad(P1)$
  2. $ \frac4k = \frac1{uk} + \frac{4u-1}{uk+v} + \frac{(4u-1)v}{uk(uk+v)}\quad (P2) $
  3. $ \frac4k = \frac{4u}{uk+v+1} + \frac4{k(uk+v+1)} + \frac{4v}{k(uk+v+1)}\quad (P3)$
  4. $ \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!

1voto

Yong Hao Ng Puntos 1779

La siguiente es una posible implementación, que puede probar aquí .

R. = PolynomialRing(QQ)
D. = PolynomialRing(ZZ)
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)
def findM(f):
    m = f.denominator() 
    return m
def mP(u,v,P):
    f = P(u,v)
    m1 = findM(f[0])
    m2 = findM(f[1])
    m3 = findM(f[2])
    m = lcm([m1,m2,m3])
    F = [D(m*f[0]),D(m*f[1]),D(m*f[2])]
    L = []
    for i in xrange(1,m+1):
         if(Mod(F[0](i),m)==0 and Mod(F[1](i),m)==0 and Mod(F[2](i),m)==0):
             L.append(i)
    return (m,L)
#Example:
[u,v,P] = [3/5,5,P4]
[m,S] = mP(u,v,P)
[x,y,z] = P(u,v)

print("[u,v,m] = ",[u,v,m])
print("[k,x(k),y(k),z(k),check]:")
for k in S:
    [xk,yk,zk] = [x(k),y(k),z(k)]
    chk = 1/xk + 1/yk + 1/zk
    print [k,xk,yk,zk,chk==4/k]

El ejemplo, utilizando $(u,v)=(3/5,5)$ y $P4$ , devolverá

[75, 20, 309, 10300, True]
[175, 45, 1596, 119700, True]
[375, 95, 7170, 1135250, True]
[475, 120, 11457, 2291400, True]
[675, 170, 23031, 6525450, True]
[775, 195, 30318, 9853350, True]
[975, 245, 47892, 19555900, True]
[1075, 270, 58179, 26180550, True]

La primera línea significaría $$ \frac{4}{75} = \frac{1}{20} + \frac{1}{309} + \frac{1}{10300} $$


Usted declaró

P.<k> = PolynomialRing(QQ)

pero más tarde esto elimina la declaración:

var('u,v,P,m1,m2,m3,m,k')

Es posible que desee asignar un anillo universal $R:=\mathbb Q[k]$ que, en cambio, no se ha tocado en ningún momento. También podría ser una buena idea tener un anillo integral $D:=\mathbb Z[k]$ ya que se trabajará en él más adelante, pero supongo que no es necesario.

R.<k> = PolynomialRing(QQ)  
D.<k> = PolynomialRing(ZZ)

Para encontrar $m$ basta con utilizar

def findM(f):
    m = f.denominator() 
    return m  

El comando actual

(f(k=1)^-1).denominator()

encontrará el numerador en su lugar, y evaluado en $f(1)$ por lo que no es el verdadero denominador.

Un último punto es xrange(1,m-1) te da el rango $[1,2,\dots,m-2]$ pero quieres $[1,2,\dots,m]$ .

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X