본문 바로가기

Julia

오일러 프로젝트 25 (Julia)

1, 1, 2, 3, ... 으로 시작하는 피보나치 수열에서 1000자리가 처음으로 되는 것은 몇 번째 항인지를 구하는 문제이다. 어떤 정수가 몇 자리가 되는지를 보려면 log10() 값의 정수값 - 1 이 되는 것을 활용한다. 피보나치 수열은 채널을 사용한 제너레이터를 사용하면 쉽게 구할 수 있다.


# 제너레이터

function main()
  fib = Channel() do ch
    a, b = big(1), big(1)
    while true
      put!(ch, a)
      a, b = b, a + b
    end
  end
  for (i, f) in enumerate(Channel(fib))
    log10(f) > 999 && (println(i); break)
  end
end

main()

@async를 사용하면 훨씬 더 빨리 결과를 얻을 수 있다.


function main2()
    ch = Channel{BigInt}(1024)
    @async begin
        a, b = big(1), big(1)
        while true
            put!(ch, a)
            a, b = b, a + b
        end
    end
    for (i, v) in enumerate(ch)
        log10(v) > 999 && (println(i); break)
    end
end

@time main2()  # 0.000004 seconds