JuliaでProject Euler(18)

Problem 20

https://projecteuler.net/problem=20

Problem16とだいたい同じ。

Pythonで書くと、

from itertools import *
import sys

def multiply(v, n):
    v2 = []
    carry = 0
    for d in v:
        carry, r = divmod(d*n+carry, 10)
        v2.append(r)
    while carry > 0:
        carry, r = divmod(carry, 10)
        v2.append(r)
    return v2

def e020(N):
    a = [1]
    for n in range(1, N+1):
        a = multiply(a, n)
    return sum(a)

N = int(sys.argv[1])
print e020(N)

これをJuliaに翻訳して、

function multiply(v, n)
    v2::Array{Int} = []
    carry = 0
    for d in v
        m = d*n+carry
        r = m%10
        carry = div(m, 10)
        push!(v2, r)
    end
    while carry > 0
        r = carry%10
        carry = div(carry, 10)
        push!(v2, r)
    end
    return v2
end

function e020(N)
    a = [1]
    for n in 1:N
        a = multiply(a, n)
    end
    return sum(a)
end

N = parse(Int, ARGS[1])
println(e020(N))

やはり、2行目で型指定していないと遅い。
PyPyで、

$ time pypy e020.py 30000
511470

real    0m15.933s
user    0m13.875s
sys     0m2.016s

Juliaで型指定しないと、

$ time julia e020.jl 30000
511470

real    2m6.301s
user    2m3.984s
sys     0m0.594s

上のように型指定すると、

$ time julia e020a.jl 30000
511470

real    0m10.654s
user    0m10.734s
sys     0m0.500s

PyPyより速くなった。