11 de julio de 2012

Project Euler 12

#!/usr/bin/env python
from math import sqrt

def primefactors(n):
    if n<=1:
        return [0,0]
                                     #cota de factores para n
    cota=int(sqrt(n))+1 #prime factors upperbound
    result = [] #[[factor,exponent],...]
    exponente=0 #exponente del factor primo
    if n%2==0:
        while n%2==0:
            n/=2
            exponente+=1
        #result.append([2,exponente])
        #############################
        #solo exponentes
        #exponent only
        #|
        #v
        result.append(exponente)
    for i in range(3,cota,2):
        exponente=0
        if n%i==0:
            while n%i==0:
                n/=i
                exponente+=1
                         #[factor, exponent]   
            #result.append([i,exponente])
            #############################
            #solo exponentes
            #exponent only
            #|
            #v
            result.append(exponente)
    if n!=1:
        result.append(1)
    return result
#n-esimo numero triangular
#n-th triangular number
def TrNum(n):
    return n*(n+1)/2

#Numero de divisores de n
#Number of divisors of n
def divnum(n):
    return reduce(lambda x,y:x*y,map(lambda x:x+1,primefactors(n)))

divisores=500 #
n=1
while divnum(TrNum(n)) < divisores:
    n+=1
print TrNum(n)

Preguntas en los comentarios por favor.  Ü
Questions on the comments please. Ü