2015年12月2日水曜日

151202

Ruby


Number of smooth weakly unimodal compositions of n into positive parts such that the first and last part are 1(2)

速くしてみた。

# nをl以上の相異なるk個の数で分割
def g(n, l, k)
  return 0 if n < l
  return 1 if k == 1
  s = 0
  (l + 1..n).each{|i|
    v = g(n - i + 1, i, k - 1)
    break if v == 0
    s += v
  }
  return s
end

# nをk個の相異なる数に分割
def g0(n, k)
  g(n, 1, k)
end

def f(n)
  # 1, 1, … , 1の真っ平らなもの
  s = 1
  # 山型
  (1..n).each{|i|
    (1..i).each{|k|
      # 和がiでkのぼるものと和がn - iでk + 1のぼるものを組み合わせたもの
      s += g0(i, k) * g0(n - i, k + 1) 
    }
  }
  s
end

def A001522(n)
  (0..n).map{|i| f(i)}
end
ary = A001522(56)

# OEIS A001522のデータ
ary0 =
[1,1,1,1,2,3,5,7,10,14,19,26,35,47,62,82,107,139,
 179,230,293,372,470,591,740,924,1148,1422,1756,
 2161,2651,3244,3957,4815,5844,7075,8545,10299,
 12383,14859,17794,21267,25368,30207,35902,42600,
 50462,59678,70465,83079,97800,114967,134956,
 158205,185209,216546,252859]
# 一致の確認
p ary == ary0

0 件のコメント:

コメントを投稿

注: コメントを投稿できるのは、このブログのメンバーだけです。