Fermat vs. Pythagoras mejorado

Este post fue migrado de un blog hecho con Wordpress. Si se ve mal, dejame un comentario y lo arreglo.

Logré bajar la complejidad de mi solución de un orden cúbico a un orden cuadrático, la diferencia en cuanto a tiempo de ejecución requerido es sorprendente:

comparacion de 3 soluciones

Pero todavía no e suficiente, con un N igual a 10000 la respuesta se obtiene luego de 10 minutos (en mi computadora de 700 Mhz).

En esta solución ya no uso la función pythagoras(x,y,z). Solo hay 2 ciclos for anidados y el valor de z se calcula como z = sqrt( pow(x,2) + pow(y,2) ). Si z es entero, se tiene un triplete válido y solo falta verificar si x,y,z son primos relativos.

def is_int(i):
return i == int(i)

def solv106f(N):

miembros = []

tripletes_rprim = 0

for x in range(1,N-1):

    for y in range(x+1,N):

        z = sqrt( pow(x,2) + pow(y,2) )

        if (is_int(z) and z <= N):

            for a in [x,y,z]:

                if a not in miembros:

                    miembros.append(a)

            if (rprim(x,y,z)):

                tripletes_rprim +=1



no_miembros = N - len(miembros)

return N, tripletes_rprim, no_miembros

Comentarios

Comments powered by Disqus