In [1]:
from euler import get_factors

In [2]:
get_factors(20)


Out[2]:
[2, 2, 5]

In [3]:
def terse(x):
    f = {}
    for i in x:
        if i not in f:
            f[i] = 0
        f[i] += 1
    return f

In [4]:
terse(get_factors(20))


Out[4]:
{2: 2, 5: 1}

In [5]:
def get_terse_primes(x):
    primes = {}
    for i in range(2, x + 1):
        p = terse(get_factors(i))
        for key in p:
            if key not in primes:
                primes[key] = 0
            if p[key] > primes[key]:
                primes[key] = p[key]
    return primes

In [6]:
get_terse_primes(20)


Out[6]:
{2: 4, 3: 2, 5: 1, 7: 1, 11: 1, 13: 1, 17: 1, 19: 1}

In [7]:
def product_terse_primes(x):
    product = 1
    primes = get_terse_primes(x)
    for prime in primes:
        product *= prime ** primes[prime]
    return product

In [8]:
%timeit product_terse_primes(20)
product_terse_primes(20)


10000 loops, best of 3: 77.8 us per loop
Out[8]:
232792560