def perfect(n):
    sides = range(1, n + 1)
    return [(x, y, z) for x in sides for y in sides for z in sides
            if x*x == y*y + z*z if y >= z]

def primes(n):
    def factors(n):
        return [i for i in range(1, n + 1) if n % i == 0]

    return [i for i in range(2, n + 1) if len(factors(i)) == 2]

def dotproduct(u, v):
    return sum2([x*y for (x, y) in zip(u, v)])

def sum2(ls):
    sum = 0
    for n in ls:
        sum += n
    return sum
    #return reduce(lambda x, y: x + y, ls, 0)

def add1(n):
    return n + 1

def compose(f, g):
    #return lambda x: f(g(x))
    def composition(x):
        return f(g(x))
    return composition
