2021年3月6日土曜日

210306

Ruby


チェビシェフ多項式の明示的な式を利用した計算

T_n(n+k), U_n(n+k)の値を、
明示的な式を利用し計算してみた。

def ncr(n, r)
  return 1 if r == 0
  (n - r + 1..n).inject(:*) / (1..r).inject(:*)
end

# n >= 0, m = 1 or 2
def chebyshev(n, m, k)
  if m == 2
    return (0..n).inject(0){|s, i| s + (2 * k - 2) ** i * ncr(n + 1 + i, 2 * i + 1)}
  elsif m == 1
    if n == 0
      return 1
    else
      return (n * (0..n).inject(0){|s, i| s + (2 * k - 2) ** i * ncr(n + i, 2 * i) / (n + i.to_r)}).to_i
    end
  end
end

K = 5
N = 9
(0..K).each{|k|
  p [k, (0..N).map{|i| chebyshev(i, 1, i + k)}]
}
(0..K).each{|k|
  p [k, (0..N).map{|i| chebyshev(i, 2, i + k)}]
}

出力結果
[0, [1, 1, 7, 99, 1921, 47525, 1431431, 50843527, 2081028097, 96450076809]]
[1, [1, 2, 17, 244, 4801, 120126, 3650401, 130576328, 5374978561, 250283080090]]
[2, [1, 3, 31, 485, 10081, 262087, 8193151, 299537289, 12545596801, 592479412811]]
[3, [1, 4, 49, 846, 18817, 514088, 16692641, 628855930, 26986755841, 1300371936876]]
[4, [1, 5, 71, 1351, 32257, 930249, 31521799, 1229215691, 54276558337, 2678768828749]]
[5, [1, 6, 97, 2024, 51841, 1580050, 55989361, 2265463212, 103182433537, 5228741809214]]
[0, [1, 2, 15, 204, 3905, 96030, 2883167, 102213944, 4178507265, 193501094490]]
[1, [1, 4, 35, 496, 9701, 241956, 7338631, 262184896, 10783446409, 501827040100]]
[2, [1, 6, 63, 980, 20305, 526890, 16451071, 600940872, 25154396001, 1187422368110]]
[3, [1, 8, 99, 1704, 37829, 1032240, 33489287, 1260879920, 54085723209, 2605282707576]]
[4, [1, 10, 143, 2716, 64769, 1866294, 63202399, 2463542488, 108742564225, 5365498355074]]
[5, [1, 12, 195, 4064, 104005, 3168060, 112211527, 4538833824, 206671502025, 10470873504140]]