Project Euler Problem3

Juliaを使いました
ある数nが合成数ならば、nの最大の素因数 = (n / (nの最小の素因数)) の最大の素因数 であることを使いました。
例 13195の最大の素因数=(13195/5)の最大の素因数

function find_divisor(n, d)
  if d * d > n
    n
  elseif n % d == 0
    d
  else
    find_divisor(n, d + 1)
  end
end

function smallest_prime_factor(n)
  find_divisor(n, 2)
end

function largest_prime_factor(n)
  spf = smallest_prime_factor(n)
  if n == spf
    n
  else
    largest_prime_factor(n / spf)
  end
end

println(largest_prime_factor(600851475143))

Haskellでの方法

smallest_prime_factor :: Integer -> Integer
smallest_prime_factor n = head $ filter ((==0) . (mod n)) [2..]

largest_prime_factor :: Integer -> Integer
largest_prime_factor n
  | n == spf = n
  | otherwise = largest_prime_factor (div n spf)
  where spf = smallest_prime_factor n