두 개의 파란 공이 뽑힐 확률이 50%인 경우
공 전체 개수를 , 파란 공 개수를 라 하면, 상자에서 무작위로 두 개의 공을 꺼냈을 때 두 개가 모두 파란 색일 확률은 다음과 같이 나타낼 수 있다.
이 식을 정리하면 다음 방정식을 얻을 수 있다.
이 방정식에서 이 이상인 정수해 중 가장 작은 값을 찾으면 문제를 풀 수 있지만, 이 방정식을 직접 풀기는 어려울 것 같다. 구글에서 'two integer variable equation'으로 검색해보니 Generic two integer variable equation solver란 아주 훌륭한 사이트를 찾을 수 있었다. 형태의 두 변수를 가지는 방정식에서 계수 를 입력하면 방정식의 해를 구해주는 사이트다. 여기서는 , , , , , 을 입력하면 다음과 같이 재귀적 해를 구할 수 있는 공식을 얻을 수 있다.
이 식은 Clojure 함수로 다음과 같이 나타낼 수 있다.
(defn next-b [b n] (+ (* 3 b) (* 2 n) -2))
(defn next-n [b n] (+ (* 4 b) (* 3 n) -3))
문제는 다음과 같이 풀 수 있다. 계속 다음 해를 구해가다 이 를 넘을 때 값이 답이 된다.
(def target 1000000000000)
(defn solve []
(loop [b 15, n 21]
(if (< n target)
(recur (next-b b n) (next-n b n))
b)))
실행 결과는 다음과 같다. 빠르게 답을 구한다.
p100=> (time (solve)) "Elapsed time: 0.055501 msecs" 75687232??73