n/φ(n)이 최대가 되는 1백만 이하의 n 찾기
Euler's totient function을 보면 의 공식을 확인할 수 있다. 을 구하려면 의 모든 소수 약수를 하나씩 넣어가며 곱을 수행해야 한다.
따라서 은 다음과 같이 나타낼 수 있다.
위 식에서 볼 수 있듯이, 은 의 소수인 약수들에 의해 결정된다. 이 최대가 되려면 분모가 최소가 되어야 한다. 은 항상 1보다 작다. 1보다 작은 수는 곱할 수록 계속 작아지므로, 1백만 이하의 수 중에서 소수인 약수를 가장 많이 가지는 을 찾으면 의 값을 최대로 만들 수 있다. 1백만 이하의 수 중에서 소수인 약수를 가장 많이 가지는 수는, 1백만 이하의 수 중 소수의 곱으로만 만들 수 있는 가장 큰 수를 구하면 된다.
소수의 누적곱 시퀀스를 만들어 1백만을 넘지 않는 최대값을 구하면 문제의 답이 된다. Clojure 코드로는 다음과 같이 표현할 수 있다.
(ns p069
(:require [clojure.contrib.lazy-seqs :refer (primes)]))
(defn solve []
(->> (reductions * primes)
(take-while #(< % 1000000))
last))
실행 결과는 다음과 같다.
p069=> (time (solve)) "Elapsed time: 0.05742 msecs" 51??10