# Euler Problem¶

2520 is the smallest number that can be divided by each of the numbers from 1 to 10 without any remainder.

What is the smallest positive number that is evenly divisible by all of the numbers from 1 to 20?

My easiest guess is to multiply all prime numbers till the number.

In [1]:

    def get_primes_smaller(number):
        primes = []
        prospects = [n for n in range(2, number)]
        while prospects:
            p = prospects[0]
            prospects = [x for x in prospects if x % p != 0]
            primes.append(p)
        return primes

In [2]:

    from operator import mul
    from functools import reduce

    def get_number_which_is_divisible_by_all_numbers_from_one_to(n):
        ps= get_primes_smaller(n + 1)
        return reduce(mul, ps, 1)

    print(get_number_which_is_divisible_by_all_numbers_from_one_to(10))

    210

That obviously didn't work. The reason is that the same prime can occur multiple times in the factorization of a divisor. For example $2^{3} = 8$. We can always brute force of course. We do a smart brute force and only check multiples from the product of primes because this factor must be part of the solution.

In [3]:

    def is_divisible_by_numbers_smaller_or_equal(number, maximum_number):
        for n in range(2, maximum_number + 1):
            if number % n != 0:
                return False
        return True

    def get_number_which_is_divisible_by_all_numbers_from_one_to(n):
        ps = get_primes_smaller(n + 1)
        factor = reduce(mul, ps, 1)
        multiples_of_factor = factor
        while True:
            if is_divisible_by_numbers_smaller_or_equal(multiples_of_factor, n):
                return multiples_of_factor
            multiples_of_factor += factor

    assert(get_number_which_is_divisible_by_all_numbers_from_one_to(10) == 2520)
    print(get_number_which_is_divisible_by_all_numbers_from_one_to(20))

    232792560