Fue dificil para mí así que compartí el problema con un amigo y descubrimos que, para una ecuación de la forma 6a+9b+20c=n, dejando pivotear el valor de a, los valores de b y c solo toman valores de (0,1) y (0,1,2) respectivamente, a partir del cual se cumple que para cualquier n >= 43 se puede encontrar siempre una combinación natural y positiva para la cual existe solución, ya que existe un teorema que indica que para un n, que tuviera n+1, n+2,...n+5 soluciones continuas, entonces para cualquier solución >= n siempre existirá una combinación de constantes naturales y positivos que tuvieran solución.
Por lo que pude formular el siguiente algoritmo, para procesar el continuo y encontrar el número mas grande posible antes de alcanzar n (notese que el teorema indica n -> n+5 por lo que deben probarse 6 soluciones continuas, a la que se le agrega una a la hora de buscar la última sin n solución)
#6a + 9b + 20c
n = 1
number_of_sucessive_successes = 0
success_on_n = False
while number_of_sucessive_successes < 6:
for b in range(0, 2):
for c in range(0, 3):
for a in range(0, n + 1):
if 6*a + 9*b + 20*c == n:
success_on_n = True
if success_on_n is True:
number_of_sucessive_successes += 1
else:
number_of_sucessive_successes = 0
success_on_n = False
n += 1
print n - 7 # - 6 because last 6 were sucessive solutions, so - 1 for the last not buyable solution
Para la cual generalicé una solución para cualquier ecuación diofántica del mismo tipo:
#general solution
n = 1
number_of_sucessive_successes = 0
success_on_n = False
constants = (5, 11, 17)
while number_of_sucessive_successes < 6:
for y in range(0, n + 1):
for z in range(0, n + 1):
for x in range(0, n + 1):
if constants[0]*x + constants[1]*y + constants[2]*z == n:
success_on_n = True
if success_on_n is True:
number_of_sucessive_successes += 1
else:
number_of_sucessive_successes = 0
success_on_n = False
n += 1
print n - 7 # - 6 because last 6 were sucessive solutions, so - 1 for the last not buyable solution
J.V.
No hay comentarios:
Publicar un comentario