Problem 5

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 divisibledivisible with no remainder by all of the numbers from \(1\) to \(20\)?

Julia (using lcm)

p5() = lcm(1:20...);
p5()
232792560
using BenchmarkTools;
@benchmark p5()
BenchmarkTools.Trial: 10000 samples with 1000 evaluations.
 Range (minmax):  1.132 ns3.647 ns   GC (min … max): 0.00% … 0.00%
 Time  (median):     1.142 ns              GC (median):    0.00%
 Time  (mean ± σ):   1.140 ns ± 0.038 ns   GC (mean ± σ):  0.00% ± 0.00%
  ▁                                               
  █▁▁▁▁▃▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁█▁▁▁▄ ▂
  1.13 ns        Histogram: frequency by time       1.14 ns <
 Memory estimate: 0 bytes, allocs estimate: 0.

Julia

include("euler.jl")

function prime_decomposition(n::Integer)
    possible_primes = Euler.sieve_of_eratosthenes(n)
    temp_n = n
    dec = Int32[]

    while temp_n > 1
        for p  possible_primes
            q, r = divrem(temp_n, p)            
            if iszero(r)
                temp_n = temp_n ÷ p
                push!(dec, p)
                break
            end
        end
    end
    return dec
end;

function p5()
    decomposition = map(prime_decomposition, 2:20)
    distinct_primes = vcat(decomposition...) |> unique

    count_matrix = 
    map(distinct_primes) do p
        map(decomposition) do d
            count(==(p), d)
        end
    end |> stack

    primes_powers = map(maximum, eachcol(count_matrix))

    n = (distinct_primes .^ primes_powers) |> prod

    return n
end;

p5()
232792560
using BenchmarkTools;
@benchmark p5()
BenchmarkTools.Trial: 10000 samples with 6 evaluations.
 Range (minmax):  5.078 μs701.066 μs   GC (min … max):  0.00% … 97.51%
 Time  (median):     5.646 μs                GC (median):     0.00%
 Time  (mean ± σ):   6.691 μs ±  22.319 μs   GC (mean ± σ):  13.51% ±  4.02%
         ▃▆▇█▃▂                                               
  ▁▁▁▂▃▅████████▇▆▄▄▃▃▂▂▂▂▂▂▂▂▂▂▂▂▁▂▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁ ▂
  5.08 μs         Histogram: frequency by time        7.99 μs <
 Memory estimate: 12.66 KiB, allocs estimate: 142.