以下の工夫なしのコードでは、コンビネーションの計算をするのに
1分以上かかっています。
lang
1def ncr(n, r) 2 r = n - r if r > n - r 3 return 0 if r < 0 4 return 1 if r == 0 5 return (n - r + 1..n).inject(:*) / (1..r).inject(:*) 6end 7 8N = 1000 9cnt = 0 10(0..N).each{|a| 11 (0..a).each{|b| 12 cnt += ncr(a, b) 13 } 14} 15p cnt == 2 ** (N + 1) - 1
大きな数字でもコンビネーションの計算を
速く求められるようにするには
ncr をどのように定めればよろしいのでしょうか?
(追記)
ちなみに、Python版(工夫なし)では同じ計算を1分以内で行います。
lang
1from math import factorial 2 3def product(iterable): 4 prod = 1 5 for n in iterable: 6 prod *= n 7 return prod 8 9def npr(n, r): 10 return product(range(n - r + 1, n + 1)) 11 12def ncr(n, r): 13 if r > n // 2: 14 r = n - r 15 return npr(n, r) // factorial(r) 16 17N = 1000 18cnt = 0 19for a in xrange(N + 1): 20 for b in xrange(a + 1): 21 cnt += ncr(a, b) 22 23print cnt == 2 ** (N + 1) - 1

回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2015/05/04 18:45
2015/05/05 01:55