2015年9月27日日曜日

150927

Ruby


k角数定理?(1)

「組合せ論プロムナード」の第5講において以下の内容が載っていた。

「ヤコビの3重積公式」の変数を置き換えると、
「ガウスの4角数定理」および「オイラーの5角数定理」が導ける。

さて、同様の変換を行うことで、
以下のようなk角数定理?のようなものが導ける。

Π(1 - q^((k - 2)n))(1 - q^((k - 2)n - 1))(1 - q^((k - 2)n - k + 3))
= Σ(-1)^m q^(m((k - 2) * m + k - 4) / 2)

この式を確かめてみる。

# m次以下を取り出す
def mul(f_ary, b_ary, m)
  s1, s2 = f_ary.size, b_ary.size
  ary = Array.new(s1 + s2 - 1, 0)
  (0..s1 - 1).each{|i|
    (0..s2 - 1).each{|j|
      ary[i + j] += f_ary[i] * b_ary[j]
    }
  }
  ary[0..m]
end

def lhs(k, n)
  ary = [1]
  # 無限積のうち必要なところだけ取り出す
  # 1 - q^((k - 2)n)
  (k - 2).step(n, k - 2){|i|
    b_ary = Array.new(i + 1, 0)
    b_ary[0], b_ary[-1] = 1, -1
    ary = mul(ary, b_ary, n)
  }
  # 1 - q^((k - 2)n - 1)
  (k - 3).step(n, k - 2){|i|
    b_ary = Array.new(i + 1, 0)
    b_ary[0], b_ary[-1] = 1, -1
    ary = mul(ary, b_ary, n)
  }
  # 1 - q^((k - 2)n - k + 3)
  1.step(n, k - 2){|i|
    b_ary = Array.new(i + 1, 0)
    b_ary[0], b_ary[-1] = 1, -1
    ary = mul(ary, b_ary, n)
  }
  s = ary.size
  # 形を整えておく
  ary += [0] * (n + 1 - s) if s < n + 1
  ary
end

# k角数
def k_number(k, n)
  n * ((k - 2) * n + k - 4) / 2
end

def rhs(k, n)
  ary = Array.new(n + 1, 0)
  i = 0
  j = k_number(k, i)
  while j <= n
    ary[j] = (-1) ** i
    i += 1
    j = k_number(k, i)
  end
  i = -1
  j = k_number(k, i)
  while j <= n
    ary[j] = (-1) ** i
    i -= 1
    j = k_number(k, i)
  end
  ary
end

n = 150
(5..10).each{|k|
  # lhs = rhs となることを確認する(一致したらT、しないならF)
  p (0..n).map{|i| lhs(k, i) == rhs(k, i) ? 'T' : 'F'}
  p [k, lhs(k, n)]
}

出力結果
["T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T"]
[5, [1, -1, -1, 0, 0, 1, 0, 1, 0, 0, 0, 0, -1, 0, 0, -1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0]]
["T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T"]
[6, [1, -1, 0, -1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]]
["T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T"]
[7, [1, -1, 0, 0, -1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0]]
["T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T"]
[8, [1, -1, 0, 0, 0, -1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]]
["T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T"]
[9, [1, -1, 0, 0, 0, 0, -1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0]]
["T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T"]
[10, [1, -1, 0, 0, 0, 0, 0, -1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]]

2015年9月24日木曜日

150924

Ruby


オイラー関数のベキ(1)

一昨日ダイソンが見つけた公式を確認したが、クラインが見つけた公式も確認しておく。

# m次まで計算
def K(m, n)
  # i<=j<=kとし、n = [-i, k].maxとする
  ary = Array.new(m + 1, 0)
  (-n).upto(0){|i|
    n.downto(0){|k|
      j = 1 - i - k
      if i <= j && j <= k
        m0 = i * j + i * k + k * j
        if -m0 <= m
          # i = j = kとはならないので、以下の条件はちょうど2つ同じものがある場合を表している
          if i == j || i == k || j == k
            # i,j,kの大小関係を置かないときは3通り
            s = 0.5 * (2 + 9 * (3 * i * j * k - m0))
          else
            # i,j,kの大小関係を置かないときは6通り
            s = 2 + 9 * (3 * i * j * k - m0)
          end
          p [-m0, [i, j, k], s]
          ary[-m0] += s
        end
      end
    }
  }
  ary.map(&:to_i)
end
ary = K(200, 200)
p ary

# m次以下を取り出す
def mul(f_ary, b_ary, m)
  s1, s2 = f_ary.size, b_ary.size
  ary = Array.new(s1 + s2 - 1, 0)
  (0..s1 - 1).each{|i|
    (0..s2 - 1).each{|j|
      ary[i + j] += f_ary[i] * b_ary[j]
    }
  }
  ary[0..m]
end

# m次以下を取り出す
def power(ary, n, m)
  return [1] if n == 0
  mul(ary, power(ary, n - 1, m), m)
end

def phi_8(n)
  ary = [1]
  # 無限積のうち必要なところだけ取り出す
  (1..n).each{|i|
    b_ary = Array.new(i + 1, 0)
    b_ary[0], b_ary[-1] = 1, -1
    ary = mul(ary, b_ary, n)
  }
  # 8乗
  power(ary, 8, n)
end
ary0 = phi_8(200)

# 一致の確認
p ary == ary0

出力結果
[200, [-16, 8, 9], -29302]
[192, [-15, 4, 12], -17710]
[185, [-15, 5, 11], -20608]
[180, [-15, 6, 10], -22678]
[177, [-15, 7, 9], -23920]
[176, [-15, 8, 8], -12167.0]
[196, [-14, 1, 14], -3526]
[184, [-14, 2, 13], -8170]
[174, [-14, 3, 12], -12040]
[166, [-14, 4, 11], -15136]
[160, [-14, 5, 10], -17458]
[156, [-14, 6, 9], -19006]
[154, [-14, 7, 8], -19780]
[197, [-13, -1, 15], 7040]
[182, [-13, 0, 14], 1640]
[169, [-13, 1, 13], -3040]
[158, [-13, 2, 12], -7000]
[149, [-13, 3, 11], -10240]
[142, [-13, 4, 10], -12760]
[137, [-13, 5, 9], -14560]
[134, [-13, 6, 8], -15640]
[133, [-13, 7, 7], -8000.0]
[186, [-12, -2, 15], 11396]
[170, [-12, -1, 14], 6068]
[156, [-12, 0, 13], 1406]
[144, [-12, 1, 12], -2590]
[134, [-12, 2, 11], -5920]
[126, [-12, 3, 10], -8584]
[120, [-12, 4, 9], -10582]
[116, [-12, 5, 8], -11914]
[114, [-12, 6, 7], -12580]
[196, [-11, -4, 16], 20774]
[177, [-11, -3, 15], 14960]
[160, [-11, -2, 14], 9758]
[145, [-11, -1, 13], 5168]
[132, [-11, 0, 12], 1190]
[121, [-11, 1, 11], -2176]
[112, [-11, 2, 10], -4930]
[105, [-11, 3, 9], -7072]
[100, [-11, 4, 8], -8602]
[97, [-11, 5, 7], -9520]
[96, [-11, 6, 6], -4913.0]
[190, [-10, -5, 16], 23312]
[170, [-10, -4, 15], 17732]
[152, [-10, -3, 14], 12710]
[136, [-10, -2, 13], 8246]
[122, [-10, -1, 12], 4340]
[110, [-10, 0, 11], 992]
[100, [-10, 1, 10], -1798]
[92, [-10, 2, 9], -4030]
[86, [-10, 3, 8], -5704]
[82, [-10, 4, 7], -6820]
[80, [-10, 5, 6], -7378]
[186, [-9, -6, 16], 25004]
[165, [-9, -5, 15], 19712]
[146, [-9, -4, 14], 14924]
[129, [-9, -3, 13], 10640]
[114, [-9, -2, 12], 6860]
[101, [-9, -1, 11], 3584]
[90, [-9, 0, 10], 812]
[81, [-9, 1, 9], -1456]
[74, [-9, 2, 8], -3220]
[69, [-9, 3, 7], -4480]
[66, [-9, 4, 6], -5236]
[65, [-9, 5, 5], -2744.0]
[184, [-8, -7, 16], 25850]
[162, [-8, -6, 15], 20900]
[142, [-8, -5, 14], 16400]
[124, [-8, -4, 13], 12350]
[108, [-8, -3, 12], 8750]
[94, [-8, -2, 11], 5600]
[82, [-8, -1, 10], 2900]
[72, [-8, 0, 9], 650]
[64, [-8, 1, 8], -1150]
[58, [-8, 2, 7], -2500]
[54, [-8, 3, 6], -3400]
[52, [-8, 4, 5], -3850]
[161, [-7, -7, 15], 10648.0]
[140, [-7, -6, 14], 17138]
[121, [-7, -5, 13], 13376]
[104, [-7, -4, 12], 10010]
[89, [-7, -3, 11], 7040]
[76, [-7, -2, 10], 4466]
[65, [-7, -1, 9], 2288]
[56, [-7, 0, 8], 506]
[49, [-7, 1, 7], -880]
[44, [-7, 2, 6], -1870]
[41, [-7, 3, 5], -2464]
[40, [-7, 4, 4], -1331.0]
[120, [-6, -6, 13], 6859.0]
[102, [-6, -5, 12], 10640]
[86, [-6, -4, 11], 7904]
[72, [-6, -3, 10], 5510]
[60, [-6, -2, 9], 3458]
[50, [-6, -1, 8], 1748]
[42, [-6, 0, 7], 380]
[36, [-6, 1, 6], -646]
[32, [-6, 2, 5], -1330]
[30, [-6, 3, 4], -1672]
[85, [-5, -5, 11], 4096.0]
[70, [-5, -4, 10], 6032]
[57, [-5, -3, 9], 4160]
[46, [-5, -2, 8], 2576]
[37, [-5, -1, 7], 1280]
[30, [-5, 0, 6], 272]
[25, [-5, 1, 5], -448]
[22, [-5, 2, 4], -880]
[21, [-5, 3, 3], -512.0]
[56, [-4, -4, 9], 2197.0]
[44, [-4, -3, 8], 2990]
[34, [-4, -2, 7], 1820]
[26, [-4, -1, 6], 884]
[20, [-4, 0, 5], 182]
[16, [-4, 1, 4], -286]
[14, [-4, 2, 3], -520]
[33, [-3, -3, 7], 1000.0]
[24, [-3, -2, 6], 1190]
[17, [-3, -1, 5], 560]
[12, [-3, 0, 4], 110]
[9, [-3, 1, 3], -160]
[8, [-3, 2, 2], -125.0]
[16, [-2, -2, 5], 343.0]
[10, [-2, -1, 4], 308]
[6, [-2, 0, 3], 56]
[4, [-2, 1, 2], -70]
[5, [-1, -1, 3], 64.0]
[2, [-1, 0, 2], 20]
[1, [-1, 1, 1], -8.0]
[0, [0, 0, 1], 1.0]
[1, -8, 20, 0, -70, 64, 56, 0, -125, -160, 308, 0, 110, 0, -520, 0, 57, 560, 0, 0, 182, -512, -880, 0, 1190, -448, 884, 0, 0, 0, -1400, 0, -1330, 1000, 1820, 0, -646, 1280, 0, 0, -1331, -2464, 380, 0, 1120, 0, 2576, 0, 0, -880, 1748, 0, -3850, 0, -3400, 0, 2703, 4160, -2500, 0, 3458, 0, 0, 0, -1150, -456, -5236, 0, 0, -4480, 6032, 0, 6160, 0, -3220, 0, 4466, 0, 0, 0, -7378, -1456, -3920, 0, 0, 4096, 2200, 0, 0, 7040, 812, 0, -4030, 0, 5600, 0, -4913, -9520, 0, 0, -10400, 3584, 10640, 0, 10010, -7072, 0, 0, 8750, 0, 992, 0, -4930, 0, -5720, 0, -11914, 0, 0, 0, -3723, 11200, 4340, 0, 12350, 0, -8584, 0, 0, 10640, 0, 0, 1190, -8000, -21560, 0, 8246, -14560, 0, 0, 17138, 0, 3640, 0, -2590, 5168, 14924, 0, 0, -10240, 0, 0, 12710, 0, -19780, 0, -17600, 0, -7000, 0, -7700, 10648, 20900, 0, 0, 19712, -15136, 0, 0, -3040, 23800, 0, 0, 0, -12040, 0, -12167, -8960, 0, 0, -22678, 0, 1640, 0, 17680, -20608, 36400, 0, 0, 0, 23312, 0, -17710, 0, 0, 0, 17248, 7040, 0, 0, -29302]
true

2015年9月22日火曜日

150922(2)

Ruby


フリーマン・ダイソンによるτ関数に関する公式

「ラマヌジャンの遺した関数」を読んでいると、τ関数に関する公式が出てきたので
自分で確かめたくなった。
オンライン整数列大辞典の
A000594(http://oeis.org/A000594/list)
と比較し、答え合わせしてみる。

def ary(i, m)
  i.step(m, 5).to_a + (i - 5).step(-m, -5).to_a
end

def f(a, b, c, d, e)
  (a - b) * (a - c) * (a - d) * (a - e) * (b - c) * (b - d) * (b - e) * (c - d) * (c - e) * (d - e)
end

def tau_function(n)
  sum = 0
  # -mからmまで調べれば十分
  m = Math.sqrt(10 * n).to_i + 1
  ary(1, m).each{|a|
    ary(2, m).each{|b|
      ary(3, m).each{|c|
        ary(4, m).each{|d|
          ary(5, m).each{|e|
            if a + b + c + d + e == 0
              if a * a + b * b + c * c + d * d + e * e == 10 * n
                f = f(a, b, c, d, e)
                p [n, [a, b, c, d, e], f]
                sum += f
              end
            end
          }
        }
      }
    }
  }
  # 288 = 1!2!3!4!
  sum / 288
end

def A000594(n)
  (1..n).map{|i| tau_function(i)}
end
ary = A000594(28)

# OEIS A000594のデータ
ary0 =
[1,-24,252,-1472,4830,-6048,-16744,84480,-113643,
 -115920,534612,-370944,-577738,401856,1217160,
 987136,-6905934,2727432,10661420,-7109760,
 -4219488,-12830688,18643272,21288960,-25499225,
 13865712,-73279080,24647168]
# 一致の確認
p ary == ary0

出力結果
[1, [1, 2, -2, -1, 0], 288]
[2, [1, -3, 3, -1, 0], -6912]
[3, [1, -3, -2, 4, 0], 36288]
[3, [-4, 2, 3, -1, 0], 36288]
[4, [1, 2, 3, -1, -5], -64512]
[4, [1, -3, -2, -1, 5], -64512]
[4, [-4, 2, -2, 4, 0], -294912]
[5, [1, 2, 3, -6, 0], 36288]
[5, [1, 2, -2, 4, -5], 489888]
[5, [6, -3, -2, -1, 0], 36288]
[5, [-4, 2, -2, -1, 5], 489888]
[5, [-4, -3, 3, 4, 0], 338688]
[6, [1, -3, 3, 4, -5], -870912]
[6, [-4, -3, 3, -1, 5], -870912]
[7, [1, 2, -2, -6, 5], -2483712]
[7, [1, 2, -7, 4, 0], -266112]
[7, [6, 2, -2, -1, -5], -2483712]
[7, [-4, 2, 3, 4, -5], 338688]
[7, [-4, 7, -2, -1, 0], -266112]
[7, [-4, -3, -2, 4, 5], 338688]
[8, [1, 2, -7, -1, 5], 2239488]
[8, [1, 7, -2, -1, -5], 2239488]
[8, [1, -3, 3, -6, 5], 6386688]
[8, [6, 2, -2, -6, 0], 7077888]
[8, [6, -3, 3, -1, -5], 6386688]
[9, [1, 7, -2, -6, 0], -4953312]
[9, [1, -8, 3, 4, 0], 684288]
[9, [6, 2, -7, -1, 0], -4953312]
[9, [6, -3, 3, -6, 0], -17006112]
[9, [6, -3, -2, 4, -5], -3592512]
[9, [-4, 2, 3, -6, 5], -3592512]
[9, [-4, -3, 8, -1, 0], 684288]
[10, [1, 7, -7, -1, 0], 3161088]
[10, [1, -3, 8, -1, -5], -6918912]
[10, [1, -3, -7, 4, 5], -11354112]
[10, [1, -8, 3, -1, 5], -6918912]
[10, [-4, 7, 3, -1, -5], -11354112]
[11, [1, -3, 8, -6, 0], 13039488]
[11, [1, -8, -2, 4, 5], 12737088]
[11, [6, 2, 3, -6, -5], 6386688]
[11, [6, -3, -2, -6, 5], 6386688]
[11, [6, -3, -7, 4, 0], 36324288]
[11, [6, -8, 3, -1, 0], 13039488]
[11, [-4, 2, 8, -1, -5], 12737088]
[11, [-4, 2, -7, 4, 5], 9237888]
[11, [-4, 7, 3, -6, 0], 36324288]
[11, [-4, 7, -2, 4, -5], 9237888]
[11, [-4, -3, -2, 9, 0], -741312]
[11, [-9, 2, 3, 4, 0], -741312]
[12, [1, 7, 3, -6, -5], -22643712]
[12, [1, -3, -2, 9, -5], 6386688]
[12, [6, -3, -7, -1, 5], -22643712]
[12, [6, -8, -2, 4, 0], -37158912]
[12, [-4, 2, 8, -6, 0], -37158912]
[12, [-9, 2, 3, -1, 5], 6386688]
[13, [1, 2, 3, 4, -10], 288288]
[13, [1, 2, 8, -6, -5], 17978688]
[13, [1, -8, 8, -1, 0], -8128512]
[13, [6, 2, -7, 4, -5], -28540512]
[13, [6, -8, -2, -1, 5], 17978688]
[13, [-4, 2, -2, 9, -5], -14126112]
[13, [-4, 7, -2, -6, 5], -28540512]
[13, [-4, 7, -7, 4, 0], -95622912]
[13, [-4, -3, 8, 4, -5], -6918912]
[13, [-4, -3, -2, -1, 10], 288288]
[13, [-4, -8, 3, 4, 5], -6918912]
[13, [-9, 2, -2, 4, 5], -14126112]
[14, [1, 7, -7, 4, -5], 86220288]
[14, [1, -3, -7, 9, 0], -37158912]
[14, [-4, 7, -7, -1, 5], 86220288]
[14, [-4, -3, 3, 9, -5], 8805888]
[14, [-9, 7, 3, -1, 0], -37158912]
[14, [-9, -3, 3, 4, 5], 8805888]
[15, [1, -3, -2, -6, 10], -22643712]
[15, [1, -8, -2, 9, 0], 34898688]
[15, [6, 2, 3, -1, -10], -22643712]
[15, [6, 2, -7, -6, 5], 17791488]
[15, [6, 7, -2, -6, -5], 17791488]
[15, [6, -8, 3, 4, -5], 26345088]
[15, [-4, 2, -7, 9, 0], 118879488]
[15, [-4, -3, 8, -6, 5], 26345088]
[15, [-9, 2, 8, -1, 0], 34898688]
[15, [-9, 7, -2, 4, 0], 118879488]
[16, [1, 2, 3, -11, 5], -1677312]
[16, [1, 2, -7, 9, -5], -75866112]
[16, [1, 7, 3, -1, -10], 67212288]
[16, [1, 7, -7, -6, 5], -64576512]
[16, [1, -3, -7, -1, 10], 67212288]
[16, [6, 2, -2, 4, -10], 66060288]
[16, [6, 7, -7, -1, -5], -64576512]
[16, [11, -3, -2, -1, -5], -1677312]
[16, [-4, 2, -2, -6, 10], 66060288]
[16, [-4, -8, 8, 4, 0], 301989888]
[16, [-9, 7, -2, -1, 5], -75866112]
[17, [1, 2, 8, -1, -10], -48498912]
[17, [1, 7, -2, 4, -10], -183218112]
[17, [1, -8, 8, 4, -5], -305690112]
[17, [1, -8, -2, -1, 10], -48498912]
[17, [6, 2, 3, -11, 0], 14702688]
[17, [6, 7, -7, -6, 0], 50083488]
[17, [6, -3, 3, 4, -10], -46230912]
[17, [6, -3, 8, -6, -5], -28540512]
[17, [6, -8, 3, -6, 5], -28540512]
[17, [11, -3, -2, -6, 0], 14702688]
[17, [-4, 2, -7, -1, 10], -183218112]
[17, [-4, -3, 3, -6, 10], -46230912]
[17, [-4, -8, 3, 9, 0], -352864512]
[17, [-4, -8, 8, -1, 5], -305690112]
[17, [-9, 2, -2, 9, 0], -138311712]
[17, [-9, -3, 8, 4, 0], -352864512]
[18, [1, 7, 3, -11, 0], -33530112]
[18, [1, -8, 3, 9, -5], 325721088]
[18, [11, -3, -7, -1, 0], -33530112]
[18, [-4, -3, -7, 9, 5], -103514112]
[18, [-9, 7, 3, 4, -5], -103514112]
[18, [-9, -3, 3, 9, 0], 408146688]
[18, [-9, -3, 8, -1, 5], 325721088]
[19, [1, 2, 8, -11, 0], 21909888]
[19, [1, 2, -2, 9, -10], 148313088]
[19, [1, 2, -7, -6, 10], 78962688]
[19, [1, 2, -12, 4, 5], 3564288]
[19, [1, -3, 8, 4, -10], 502020288]
[19, [1, -8, 8, -6, 5], 339026688]
[19, [6, 2, -2, -11, 5], -85542912]
[19, [6, 7, -2, -1, -10], 78962688]
[19, [6, -8, 8, -1, -5], 339026688]
[19, [6, -8, -7, 4, 5], 7495488]
[19, [11, 2, -2, -6, -5], -85542912]
[19, [11, -8, -2, -1, 0], 21909888]
[19, [-4, 7, 3, 4, -10], 137225088]
[19, [-4, 7, 8, -6, -5], 7495488]
[19, [-4, 12, -2, -1, -5], 3564288]
[19, [-4, -3, -7, 4, 10], 137225088]
[19, [-4, -8, 3, -1, 10], 502020288]
[19, [-4, -8, -2, 9, 5], 382269888]
[19, [-9, 2, 8, 4, -5], 382269888]
[19, [-9, 2, -2, -1, 10], 148313088]
[20, [1, 7, -2, -11, 5], 282175488]
[20, [1, -3, 3, 9, -10], -525837312]
[20, [6, 2, -12, 4, 0], -37158912]
[20, [6, -3, 3, -11, 5], 78962688]
[20, [6, -3, -7, 9, -5], 166053888]
[20, [6, -8, 8, -6, 0], -346816512]
[20, [11, 2, -7, -1, -5], 282175488]
[20, [11, -3, 3, -6, -5], 78962688]
[20, [-4, 2, 8, 4, -10], -501645312]
[20, [-4, 12, -2, -6, 0], -37158912]
[20, [-4, -8, -2, 4, 10], -501645312]
[20, [-9, 2, 3, 9, -5], -312947712]
[20, [-9, 7, 3, -6, 5], 166053888]
[20, [-9, -3, 3, -1, 10], -525837312]
[20, [-9, -3, -2, 9, 5], -312947712]
[21, [1, 7, -12, 4, 0], 71705088]
[21, [1, 12, -2, -6, -5], 71251488]
[21, [1, -8, 3, -6, 10], -452656512]
[21, [6, 2, -12, -1, 5], 71251488]
[21, [6, 7, -2, -11, 0], -183218112]
[21, [6, -3, 8, -1, -10], -452656512]
[21, [6, -8, -2, 9, -5], -522510912]
[21, [11, 2, -7, -6, 0], -183218112]
[21, [-4, 2, 3, 9, -10], 407822688]
[21, [-4, 12, -7, -1, 0], 71705088]
[21, [-9, 2, 8, -6, 5], -522510912]
[21, [-9, -3, -2, 4, 10], 407822688]
[22, [1, 7, -12, -1, 5], -212838912]
[22, [1, 12, -7, -1, -5], -212838912]
[22, [1, -3, 8, -11, 5], -862912512]
[22, [1, -8, -7, 9, 5], -391053312]
[22, [1, -13, 3, 4, 5], -3290112]
[22, [11, -3, -7, 4, -5], -312947712]
[22, [11, -8, 3, -1, -5], -862912512]
[22, [-4, 7, 3, -11, 5], -312947712]
[22, [-4, 7, -7, 9, -5], -64576512]
[22, [-4, -3, 13, -1, -5], -3290112]
[22, [-9, 7, 8, -1, -5], -391053312]
[22, [-9, 7, -7, 4, 5], -64576512]
[23, [1, 2, -2, -11, 10], -305690112]
[23, [1, 2, -12, 9, 0], -46230912]
[23, [1, 12, -7, -6, 0], 106178688]
[23, [1, -8, -7, 4, 10], 471132288]
[23, [6, 7, 3, -6, -10], -238298112]
[23, [6, 7, -12, -1, 0], 106178688]
[23, [6, -3, 8, -11, 0], 810425088]
[23, [6, -3, -2, 9, -10], 485388288]
[23, [6, -3, -7, -6, 10], -238298112]
[23, [6, -3, -12, 4, 5], -44416512]
[23, [6, -8, -7, 9, 0], 449100288]
[23, [6, -13, 3, 4, 0], 29023488]
[23, [11, 2, -2, -1, -10], -305690112]
[23, [11, -8, 3, -6, 0], 810425088]
[23, [11, -8, -2, 4, -5], 968018688]
[23, [-4, 2, 8, -11, 5], 968018688]
[23, [-4, 7, 8, -1, -10], 471132288]
[23, [-4, 12, 3, -6, -5], -44416512]
[23, [-4, -3, 13, -6, 0], 29023488]
[23, [-9, 2, 3, -6, 10], 485388288]
[23, [-9, 7, 8, -6, 0], 449100288]
[23, [-9, 12, -2, -1, 0], -46230912]
[24, [1, -3, 3, -11, 10], 1109541888]
[24, [1, -3, 13, -6, -5], -66189312]
[24, [6, 2, 8, -6, -10], 891813888]
[24, [6, 7, 3, -11, -5], 325721088]
[24, [6, -8, -2, -6, 10], 891813888]
[24, [6, -13, 3, -1, 5], -66189312]
[24, [11, -3, 3, -1, -10], 1109541888]
[24, [11, -3, -7, -6, 5], 325721088]
[24, [-9, 2, -7, 9, 5], 804722688]
[24, [-9, 7, -2, 9, -5], 804722688]
[25, [1, 2, -12, -1, 10], 209297088]
[25, [1, 7, 8, -6, -10], -720431712]
[25, [1, 12, -2, -1, -10], 209297088]
[25, [1, -13, 8, 4, 0], -174650112]
[25, [6, 2, 8, -11, -5], -1210521312]
[25, [6, 7, -7, 4, -10], 137225088]
[25, [6, -8, -7, -1, 10], -720431712]
[25, [6, -13, -2, 4, 5], 42977088]
[25, [11, 2, -2, -11, 0], 583041888]
[25, [11, -3, -2, 4, -10], -880955712]
[25, [11, -8, -2, -6, 5], -1210521312]
[25, [11, -8, -7, 4, 0], -778643712]
[25, [-4, 2, 3, -11, 10], -880955712]
[25, [-4, 2, 13, -6, -5], 42977088]
[25, [-4, 7, 8, -11, 0], -778643712]
[25, [-4, 7, -2, 9, -10], -877960512]
[25, [-4, 7, -7, -6, 10], 137225088]
[25, [-4, 7, -12, 4, 5], 196466688]
[25, [-4, 12, -7, 4, -5], 196466688]
[25, [-4, -3, -2, 14, -5], 1116288]
[25, [-4, -8, 8, 9, -5], 92671488]
[25, [-4, -8, 13, -1, 0], -174650112]
[25, [-9, 2, -7, 4, 10], -877960512]
[25, [-9, -8, 8, 4, 5], 92671488]
[25, [-14, 2, 3, 4, 5], 1116288]
[26, [1, 7, 8, -11, -5], 968018688]
[26, [1, -3, -12, 9, 5], 2053029888]
[26, [1, -8, 13, -1, -5], 576108288]
[26, [1, -13, 3, 9, 0], 166053888]
[26, [1, -13, 8, -1, 5], 576108288]
[26, [11, -3, 3, -11, 0], -1803174912]
[26, [11, -8, -7, -1, 5], 968018688]
[26, [-9, 7, -7, 9, 0], -1024192512]
[26, [-9, 12, 3, -1, -5], 2053029888]
[26, [-9, -3, 8, 9, -5], -352864512]
[26, [-9, -3, 13, -1, 0], 166053888]
[26, [-9, -8, 3, 9, 5], -352864512]
[27, [1, 12, -2, -11, 0], -302968512]
[27, [1, -3, -12, 4, 10], -2428538112]
[27, [1, -8, 13, -6, 0], -376451712]
[27, [6, 2, -7, 9, -10], -1720922112]
[27, [6, 7, -12, 4, -5], -273030912]
[27, [6, -3, -2, -11, 10], -1154829312]
[27, [6, -3, -12, 9, 0], -2142770112]
[27, [6, -13, 8, -1, 0], -376451712]
[27, [11, 2, 3, -6, -10], -1154829312]
[27, [11, 2, -12, -1, 0], -302968512]
[27, [-4, 2, -12, 9, 5], -2357776512]
[27, [-4, 12, 3, -1, -10], -2428538112]
[27, [-4, 12, -7, -6, 5], -273030912]
[27, [-4, -3, 8, 9, -10], 295783488]
[27, [-4, -3, -7, 14, 0], -90683712]
[27, [-9, 7, -2, -6, 10], -1720922112]
[27, [-9, 12, 3, -6, 0], -2142770112]
[27, [-9, 12, -2, 4, -5], -2357776512]
[27, [-9, -8, 3, 4, 10], 295783488]
[27, [-14, 7, 3, 4, 0], -90683712]
[28, [1, 7, -7, 9, -10], 1833689088]
[28, [1, -3, 13, -1, -10], -685504512]
[28, [1, -3, -7, 14, -5], 270885888]
[28, [1, -13, 3, -1, 10], -685504512]
[28, [1, -13, -2, 9, 5], -1803174912]
[28, [6, 7, -7, -11, 5], -85542912]
[28, [6, -8, 8, 4, -10], -346816512]
[28, [11, 2, 3, -11, -5], 1549836288]
[28, [11, 7, -7, -6, -5], -85542912]
[28, [11, -3, -2, -11, 5], 1549836288]
[28, [-4, 2, -12, 4, 10], 2543321088]
[28, [-4, 12, -2, 4, -10], 2543321088]
[28, [-4, -8, 8, -6, 10], -346816512]
[28, [-4, -8, -2, 14, 0], 272498688]
[28, [-9, 2, 13, -1, -5], -1803174912]
[28, [-9, 7, -7, -1, 10], 1833689088]
[28, [-14, 2, 8, 4, 0], 272498688]
[28, [-14, 7, 3, -1, 5], 270885888]
true

150922

Ruby


Ulam spiral

素数を塗りつぶす場合、p角数を塗りつぶす場合両方に対応。

# -*- coding: cp932 -*-

require 'prime'

# mはp角数か?
def p_number?(p, m)
  i = 0
  a = ((p - 2) * i - p + 4) * i / 2
  while a < m
    i += 1
    a = ((p - 2) * i - p + 4) * i / 2
  end
  a == m
end

# (x, y)に埋まる数字を算出
def cell(n, x, y, start = 1)
  y, x = y - n / 2, x - (n - 1) / 2
  l = 2 * [x.abs, y.abs].max
  if y >= x
    d = l * 3 + x + y
  else 
    d = l - x - y
  end
  (l - 1) * (l - 1) + d + start - 1
end

# condition = 0 のとき素数を、それ以外のときcondition角数を塗りつぶす
def show_spiral(condition, n, symbol, start = 1)
  puts "\nN : #{condition} : #{n}"
  n.times{|y|
    n.times{|x|
      m = cell(n, x, y, start)
      if condition == 0
        print m.prime? ? symbol[0] : symbol[1]
      else
        print p_number?(condition, m) ? symbol[0] : symbol[1]
      end
    }
    puts
  }
end

show_spiral(0, 40, "■□")
show_spiral(3, 40, "■□")
show_spiral(4, 40, "■□")
show_spiral(5, 40, "■□")
show_spiral(6, 40, "■□")

出力結果(実際より縦長になっていますが、コピペしてメモ帳に貼り付けるときれいな図になります。)

N : 0 : 40
□□□■□□□□□□□□□□□□□■□□□■□□□□□□□■□□□■□□□□□□
□□□□□□■□□□□□■□□□■□■□□□■□□□□□□□□□□□□□■□□□
□■□□□□□■□■□□□□□■□□□■□■□□□□□□□□□□□□□□□□□■
■□□□□□■□■□□□□□□□□□□□□□□□□□□□□□■□□□□□■□□□
□□□□□□□■□■□□□□□■□□□■□□□□□□□□□□□■□□□□□■□□
□□□□□□□□□□□□□□□□□□■□□□■□■□□□■□□□□□□□□□□□
□■□□□□□□□□□□□□□□□■□□□■□□□□□□□■□□□■□■□□□□
■□□□□□■□□□■□□□□□□□□□□□■□■□□□□□■□□□□□□□□□
□■□□□■□■□□□□□■□■□□□□□■□□□□□■□□□□□□□□□□□■
■□■□□□□□□□□□□□■□□□□□□□□□□□■□□□■□□□□□■□■□
□□□■□□□□□■□□□■□□□□□□□■□□□□□■□□□□□□□□□□□□
□□□□■□□□■□□□□□□□□□■□□□■□■□□□■□■□■□□□□□□□
□■□■□□□□□□□■□□□□□■□□□□□□□□□■□■□□□■□□□□□■
□□□□□□■□□□□□■□□□■□■□□□□□□□□□□□□□□□■□□□□□
□□□□□□□□□□□□□□□□□□□■□■□□□□□■□□□■□□□■□■□□
■□□□■□□□■□□□■□■□□□■□□□□□□□■□□□■□■□□□□□□□
□□□□□□□□□□□□□□□□□□□■□■□□□■□□□□□□□□□□□□□□
□□■□□□□□□□■□□□■□■□□□□□■□■□■□□□□□■□■□■□□□
□□□■□■□■□■□■□■□■□■□□□■□□□□□□□■□□□□□□□□□■
□□□□□□□□□□□□□□□□□□■□■□■□□□□□□□□□□□■□□□□□
□□□□□□□□□□□□□■□□□■□□■■□■□■□■□□□■□■□■□□□□
□□□□□□■□□□□□□□■□■□■□□□□□□□□□□□□□□□□□□□□□
□□□□□□□□□□□□□□□■□□□■□□□□□□□□□□□□□□□□□□□□
□□□□■□□□■□■□□□■□■□□□■□□□■□■□□□■□□□■□■□□□
□■□□□□□■□□□■□□□■□□□□□■□□□□□■□■□□□■□□□□□□
□□□□□□□□□□□□□□□□■□□□□□□□□□□□■□□□□□□□□□□□
□■□□□□□□□□□■□■□□□□□■□□□■□□□■□□□□□□□■□■□□
■□■□□□□□■□□□■□□□□□□□□□□□■□□□□□□□■□□□□□■□
□□□■□□□□□■□□□□□■□□□■□■□□□□□□□□□□□□□□□□□□
□□□□□□□□□□□□□□■□■□□□■□□□□□■□□□■□□□□□■□□□
□□□■□■□■□■□□□□□□□□□■□■□□□□□■□□□□□■□■□□□■
□□□□□□■□□□■□□□□□□□□□□□■□■□□□□□□□□□□□□□□□
□■□□□■□■□□□□□■□□□□□■□□□■□■□□□□□□□□□□□■□□
□□■□■□□□□□□□■□□□□□□□□□■□□□□□□□■□□□□□■□□□
□□□□□□□□□□□□□■□■□□□■□■□□□□□□□□□■□□□□□■□□
□□□□□□□□□□■□□□■□□□□□■□□□□□■□□□□□□□□□■□■□
□□□□□□□■□■□□□□□■□□□□□□□□□□□□□□□□□■□□□□□□
■□□□■□□□□□□□■□□□□□□□□□□□■□□□■□□□□□■□□□□□
□□□□□□□□□□□□□□□□□□□□□□□□□□□□□■□□□□□■□□□■
■□□□■□■□□□■□□□□□■□□□□□□□□□□□■□□□□□□□□□□□

N : 3 : 40
□□□□■□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□
□□□□□□□□□□□□□□■□□□□□□□□□□□□□□□□□□□□□□□□□
□□□□□□□□□□□□□□□□□□□□□□□■□□□□□□□□□□□□□□□□
□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□■□□□□□□□□
□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□
□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□
□□□□□□□□□□■□□□□□□□□□□□□□□□□□□□□□□□□□□□□□
□□□□■□□□□□□□□□□□□■□□□□□□□□□□□□□□□□□■□□□□
□□□□□□□□□□□□□□□□□□□□□□□■□□□□□□□□□□□□□□□□
□□□□□□□□□□□□□□□□□□□□□□□□□□□□■□□□□□□□□□□□
□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□
□□□□□□□□□□■□□□□□□□□□□□□□□□□□□□□□□□□□□□□□
□□□□□□□□□□□□□□□■□□□□□□□□□□□□□□□□□□□□□□□□
□□□□□□□□□□□□□□□□□□□■□□□□□□□□□■□□□□□□□□□□
□□□■□□□□□□□□□□□□□□□□□□■□□□□□□□□□□□□□□□□□
□□□□□□□□□■□□□□□□□□□□□□□□■□□□□□□□□□■□□□□□
□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□
□□□□□□□□□□□□□□□■□■□□□□□□□□□□□□□□□□□□□□□□
□□□□□□□□□□□□□□□□□□□■□□□■□□□□■□□□□□□□□□□□
□□□□□□□□□□□□□□■□□□□□■□□□□□□□□□□□□□□□□□□□
□□□□□□□□■□□□□□□□□□■■□□■□□□□□□□□□□□□□□□□□
□□□□□□□□□□□□□□□□□□□□□■□□□□□□□□□□□□□□□□□■
□□■□□□□□□□□□□■□□□■□□□□□□□□□■□□□□□■□□□□□□
□□□□□□□□□□□□□□□□□□■□□□□□□□□□□□□□□□□□□□□□
□□□□□□□□□□□□□□□□□□□□■□□□□□□□□□□□□□□□□□□□
□□□□□□□□□□□□□□□□□□□□□□□■□□■□□□□□□□□□□□□□
□□□□□□□■□□□□■□□□□□□□□□□□□□□□□□□□□□□□□□□□
□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□
□□□□□□□□□□□□□□■□□□□□□□□□□□□□□□□□■□□□□□□□
□□□□□□□□□□□□□□□□□□■□□□□□□□□□□□□□□□□□□□□□
□□□□□□□□□□□□□□□□□□□□□□□■□□□□□□□□□□□□□□■□
□■□□□□□□□□□□□□□□□□□□□□□□□□□□□■□□□□□□□□□□
□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□
□□□□□□■□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□
□□□□□□□□□□□□■□□□□□□□□□□□□□□□□□□□□□□□□□□□
□□□□□□□□□□□□□□□□□□□■□□□□□□□□□□□□□□□□□□□□
□□□□□□□□□□□□□□□□□□□□□□□□□□□■□□□□□□□□□□□□
□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□■□□□
□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□
□□■□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□

N : 4 : 40
■□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□
□■□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□
□□■□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□
□□□■□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□
□□□□■□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□
□□□□□■□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□
□□□□□□■□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□
□□□□□□□■□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□
□□□□□□□□■□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□
□□□□□□□□□■□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□
□□□□□□□□□□■□□□□□□□□□□□□□□□□□□□□□□□□□□□□□
□□□□□□□□□□□■□□□□□□□□□□□□□□□□□□□□□□□□□□□□
□□□□□□□□□□□□■□□□□□□□□□□□□□□□□□□□□□□□□□□□
□□□□□□□□□□□□□■□□□□□□□□□□□□□□□□□□□□□□□□□□
□□□□□□□□□□□□□□■□□□□□□□□□□□□□□□□□□□□□□□□□
□□□□□□□□□□□□□□□■□□□□□□□□□□□□□□□□□□□□□□□□
□□□□□□□□□□□□□□□□■□□□□□□□□□□□□□□□□□□□□□□□
□□□□□□□□□□□□□□□□□■□□□□□□□□□□□□□□□□□□□□□□
□□□□□□□□□□□□□□□□□□■□□□□□□□□□□□□□□□□□□□□□
□□□□□□□□□□□□□□□□□□□■□□□□□□□□□□□□□□□□□□□□
□□□□□□□□□□□□□□□□□□□■□□□□□□□□□□□□□□□□□□□□
□□□□□□□□□□□□□□□□□□□□■□□□□□□□□□□□□□□□□□□□
□□□□□□□□□□□□□□□□□□□□□■□□□□□□□□□□□□□□□□□□
□□□□□□□□□□□□□□□□□□□□□□■□□□□□□□□□□□□□□□□□
□□□□□□□□□□□□□□□□□□□□□□□■□□□□□□□□□□□□□□□□
□□□□□□□□□□□□□□□□□□□□□□□□■□□□□□□□□□□□□□□□
□□□□□□□□□□□□□□□□□□□□□□□□□■□□□□□□□□□□□□□□
□□□□□□□□□□□□□□□□□□□□□□□□□□■□□□□□□□□□□□□□
□□□□□□□□□□□□□□□□□□□□□□□□□□□■□□□□□□□□□□□□
□□□□□□□□□□□□□□□□□□□□□□□□□□□□■□□□□□□□□□□□
□□□□□□□□□□□□□□□□□□□□□□□□□□□□□■□□□□□□□□□□
□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□■□□□□□□□□□
□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□■□□□□□□□□
□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□■□□□□□□□
□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□■□□□□□□
□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□■□□□□□
□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□■□□□□
□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□■□□□
□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□■□□
□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□■□

N : 5 : 40
□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□
□□□□□□□□□□□□□□□□□□□■□□□□□□□□□□□□□□□□□□□□
□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□
□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□
□□□□□□□□□□□□□□□□□□□□□□□□□□□■□□□□□□□□□□□□
□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□
□□□□□□□□■□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□
□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□■□□□□□□□
□□■□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□
□□□□□□□□□□□□□□□□■□□□□□□□□□□□□□□□□□□□□□□□
□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□
□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□
□□□□□□□□□□□□□□□□□□□□□■□□□□□□□□□□□□□□□□□□
□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□
□□□□□□□□□□□□□■□□□□□□□□□□□□□□□□□□□□□□□□□□
□□□□□□□□□□□□□□□□□□□□□□□■□□□□□■□□□□□□□□□□
□□□□□□□□□□■□□□□□□□□□□□□□□□□□□□□□□□□□□■□□
□□□□□□□□□□□□□□□□□□■□□□□□□□□□□□□□□□□□□□□□
□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□
□□□□□□□□□□□□□□□□□□■□□■□□□□□□□□□□□□□□□□□□
□□□□□□□□□□□□□□□□□□□■□□□□□□■□□□□□□□□□□□□□
□□□□□□□■□□□□□□□■□□□□□□□□□□□□□□□□□□□□□□□□
□□□□□□□□□□□□□□□□□□■□□□□■□□□□□□□□□□□□□□□□
□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□
□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□■□□□□□
□□□□□□□□□□□□□□□□□□□□■□□□□□□□□□□□□□□□□□□□
□□□□□□□□□□□□■□□□□□□□□□□□□□□□□□□□□□□□□□□□
□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□
□□□□□□□□□□□□□□□□□□□□□□□□□■□□□□□□□□□□□□□□
□□□□■□□□□□□□□□□□□□□□□□□□□□□□□□□■□□□□□□□□
□□□□□□□□□□□□□■□□□□□□□□□□□□□□□□□□□□□□□□□□
□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□
□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□
□□□□□□□□□□□□□□□□□□■□□□□□□□□□□□□□□□□□□□□□
□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□
□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□
□□□□□□□□□□□□□□□□□□□□□□□□□□■□□□□□□□□□□□□□
□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□
□□□■□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□
□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□■□□

N : 6 : 40
□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□
□□□□□□□□□□□□□□■□□□□□□□□□□□□□□□□□□□□□□□□□
□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□
□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□■□□□□□□□□
□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□
□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□
□□□□□□□□□□■□□□□□□□□□□□□□□□□□□□□□□□□□□□□□
□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□
□□□□□□□□□□□□□□□□□□□□□□□■□□□□□□□□□□□□□□□□
□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□
□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□
□□□□□□□□□□■□□□□□□□□□□□□□□□□□□□□□□□□□□□□□
□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□
□□□□□□□□□□□□□□□□□□□■□□□□□□□□□■□□□□□□□□□□
□□□■□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□
□□□□□□□□□□□□□□□□□□□□□□□□■□□□□□□□□□■□□□□□
□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□
□□□□□□□□□□□□□□□■□□□□□□□□□□□□□□□□□□□□□□□□
□□□□□□□□□□□□□□□□□□□■□□□□□□□□□□□□□□□□□□□□
□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□
□□□□□□□□■□□□□□□□□□■■□□■□□□□□□□□□□□□□□□□□
□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□■
□□□□□□□□□□□□□■□□□□□□□□□□□□□■□□□□□□□□□□□□
□□□□□□□□□□□□□□□□□□■□□□□□□□□□□□□□□□□□□□□□
□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□
□□□□□□□□□□□□□□□□□□□□□□□■□□□□□□□□□□□□□□□□
□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□
□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□
□□□□□□□□□□□□□□■□□□□□□□□□□□□□□□□□■□□□□□□□
□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□
□□□□□□□□□□□□□□□□□□□□□□□■□□□□□□□□□□□□□□□□
□■□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□
□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□
□□□□□□■□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□
□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□
□□□□□□□□□□□□□□□□□□□■□□□□□□□□□□□□□□□□□□□□
□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□
□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□■□□□
□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□
□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□

2015年9月21日月曜日

150921(3)

Ruby


階段状に現れるフィボナッチ数列

(n が増えると形が崩れてくるが)きれいに並んでいる。

def f(m, n)
  l = m - n
  ary = Array.new(l, 1)
  p ary
  n.times{|i|
    new_ary = ary.clone
    new_ary.shift
    (1..new_ary.size - 1).each{|i|
      new_ary[i] += new_ary[i - 1]
    }
    new_ary.push(new_ary[-1])
    ary = new_ary
    p [0] * (i + 1) + ary
  }
end

l = 4
n = 6
m = n + l
f(m, n)

出力結果
[1, 1, 1, 1]
[0, 1, 2, 3, 3]
[0, 0, 2, 5, 8, 8]
[0, 0, 0, 5, 13, 21, 21]
[0, 0, 0, 0, 13, 34, 55, 55]
[0, 0, 0, 0, 0, 34, 89, 144, 144]
[0, 0, 0, 0, 0, 0, 89, 233, 377, 377]

150921(2)

Ruby


縦読み、横読みの一般化

以下のサイトで掲題について質問してみた。
(http://ja.stackoverflow.com/questions/16776/%E5%A4%A7%E3%81%8D%E3%81%AA%E8%A1%8C%E5%88%97%E3%81%8B%E3%82%89%E6%8C%87%E5%AE%9A%E3%81%95%E3%82%8C%E3%81%9F%E6%96%87%E5%AD%97%E5%88%97%E3%82%92%E6%8E%A2%E3%81%97%E5%87%BA%E3%81%99%E3%81%AB%E3%81%AF)

orangecat さんの回答のコードを少しアレンジしてみた。

# -*- coding: cp932 -*-

W = 4
ary1 = [
'す', 'す', 'ま', '番兵',
'き', 'す', 'す', '番兵',
'す', 'き', 'だ', '番兵'
]
ary2 = [
'す', 'す', 'ま', '番兵',
'き', 'す', 'す', '番兵',
'よ', 'め', 'だ', '番兵'
]

def dpsearch(ary, str)
  # 番兵行を上に追加
  ary = Array.new(W, '番兵') + ary
  ss = Array.new(ary.size, [])
  last = str.size - 1
  W.upto(ary.size - 1){|pos|
    pre = (ss[pos - 1] + ss[pos - W]).uniq + [-1]
    # ary[pos] == str[s]のとき、str[0..s]まで一致している
    ss[pos] = pre.map{|s| s + 1}.select{|s| ary[pos] == str[s]}
    if ss[pos].include?(last)
      # posは番兵行を含んでいるが、元々はpos - W
      return pos - W
    end
  }
  nil
end

[ary1, ary2, ary2 * 1000 + ary1].each{|ary|
  pos = dpsearch(ary, 'すすき')
  if pos
    puts "Found (last char #{ary[pos]} at #{pos % W}, #{pos / W})"
  else
    puts "Not found"
  end
}

出力結果
Found (last char き at 1, 2)
Not found
Found (last char き at 1, 3002)

150921

Ruby


Half-Catalan number

オンライン整数列大辞典の
A000992(http://oeis.org/A000992/list)
と比較し、答え合わせしてみる。

def A000992(n)
  ary = [0, 1]
  i = 2
  while i <= n
    s = 0
    (1..i / 2).each{|j| s += ary[j] * ary[i - j]}
    ary[i] = s
    i += 1
  end
  ary[1..-1]
end
ary = A000992(32)

# OEIS A000992のデータ
ary0 =
[1,1,1,2,3,6,11,24,47,103,214,481,1030,2337,5131,
 11813,26329,60958,137821,321690,734428,1721998,
 3966556,9352353,21683445,51296030,119663812,
 284198136,666132304,1586230523,3734594241,
 8919845275]
# 一致の確認
p ary == ary0

2015年9月20日日曜日

150920

Ruby


分割が絡んだ係数について

Handbook of Mathematical Functions: with Formulas, Graphs, and Mathematical Tables
に載っているTable 24.2のM3を求めるコードを書いてみた。
(ただし、順番が異なっている箇所があります。)

# 階乗
def f(ary)
  ary.map{|i| (1..i).inject(:*)}.inject(:*)
end

# nの分割を列挙
def partion_ary(n)
  ary = [[n]]
  # nの分割になっていないものは以下の操作を繰り返す
  f_ary = []
  (n - 1).downto(1){|i| f_ary.push([i])}
  while f_ary.size > 0
    b_ary = []
    f_ary.each{|c|
      i = [n - c.inject(:+), c[-1]].min
      (1..i).each{|j|
        d = c.clone
        d.push(j)
        # nの分割になったら、aryに加える
        d.inject(:+) == n ? ary.push(d) : b_ary.push(d)
      }
    }
    f_ary = b_ary
  end
  ary
end

def multinomials_and_partitions(n)
  m = (1..n).inject(:*)
  ary = []
  partion_ary(n).each{|a|
    ary << m / (f(a) * f(a.group_by(&:to_i).map{|i| i.last.size}))
  }
  ary
end

(1..15).each{|i| p multinomials_and_partitions(i)}

出力結果
[1]
[1, 1]
[1, 3, 1]
[1, 4, 3, 6, 1]
[1, 5, 10, 10, 15, 10, 1]
[1, 6, 15, 10, 15, 60, 15, 20, 45, 15, 1]
[1, 7, 21, 35, 21, 105, 105, 70, 35, 210, 105, 35, 105, 21, 1]
[1, 8, 28, 56, 35, 28, 168, 210, 280, 280, 56, 420, 840, 280, 105, 70, 560, 420, 56, 210, 28, 1]
[1, 9, 36, 84, 126, 36, 252, 378, 504, 1260, 315, 280, 84, 756, 1890, 1260, 1260, 2520, 126, 1260, 3780, 840, 945, 126, 1260, 1260, 84, 378, 36, 1]
[1, 10, 45, 120, 210, 126, 45, 360, 630, 840, 2520, 1260, 2100, 1575, 120, 1260, 3780, 2520, 3150, 12600, 1575, 6300, 2800, 210, 2520, 9450, 4200, 12600, 12600, 945, 252, 3150, 12600, 2100, 4725, 210, 2520, 3150, 120, 630, 45, 1]
[1, 11, 55, 165, 330, 462, 55, 495, 990, 1320, 4620, 2310, 4620, 6930, 1386, 5775, 165, 1980, 6930, 4620, 6930, 27720, 6930, 34650, 23100, 17325, 15400, 330, 4620, 20790, 9240, 34650, 69300, 5775, 17325, 69300, 15400, 462, 6930, 34650, 11550, 69300, 46200, 10395, 462, 6930, 34650, 4620, 17325, 330, 4620, 6930, 165, 990, 55, 1]
[1, 12, 66, 220, 495, 792, 462, 66, 660, 1485, 1980, 7920, 3960, 9240, 13860, 5544, 27720, 8316, 5775, 220, 2970, 11880, 7920, 13860, 55440, 13860, 83160, 55440, 83160, 8316, 138600, 51975, 69300, 15400, 495, 7920, 41580, 18480, 83160, 166320, 27720, 51975, 415800, 138600, 103950, 138600, 184800, 792, 13860, 83160, 27720, 207900, 277200, 17325, 207900, 415800, 61600, 10395, 924, 16632, 103950, 27720, 277200, 138600, 62370, 792, 13860, 83160, 9240, 51975, 495, 7920, 13860, 220, 1485, 66, 1]
[1, 13, 78, 286, 715, 1287, 1716, 78, 858, 2145, 2860, 12870, 6435, 17160, 25740, 10296, 60060, 36036, 6006, 45045, 36036, 286, 4290, 19305, 12870, 25740, 102960, 25740, 180180, 120120, 180180, 36036, 360360, 270270, 360360, 108108, 200200, 450450, 75075, 715, 12870, 77220, 34320, 180180, 360360, 60060, 135135, 1081080, 360360, 540540, 36036, 900900, 1801800, 675675, 450450, 600600, 200200, 1287, 25740, 180180, 60060, 540540, 720720, 90090, 675675, 2702700, 600600, 450450, 270270, 1801800, 1201200, 1716, 36036, 270270, 72072, 900900, 900900, 45045, 1351350, 1801800, 200200, 135135, 1716, 36036, 270270, 60060, 900900, 360360, 270270, 1287, 25740, 180180, 17160, 135135, 715, 12870, 25740, 286, 2145, 78, 1]
[1, 14, 91, 364, 1001, 2002, 3003, 1716, 91, 1092, 3003, 4004, 20020, 10010, 30030, 45045, 18018, 120120, 72072, 24024, 105105, 168168, 42042, 126126, 364, 6006, 30030, 20020, 45045, 180180, 45045, 360360, 240240, 360360, 72072, 840840, 630630, 840840, 504504, 42042, 560560, 2522520, 630630, 378378, 504504, 1051050, 525525, 1001, 20020, 135135, 60060, 360360, 720720, 120120, 315315, 2522520, 840840, 1261260, 168168, 2522520, 5045040, 3783780, 2522520, 756756, 6306300, 2802800, 1576575, 6306300, 525525, 1401400, 2002, 45045, 360360, 120120, 1261260, 1681680, 210210, 1891890, 7567560, 1681680, 2522520, 126126, 945945, 12612600, 12612600, 4729725, 2102100, 3153150, 8408400, 1401400, 3003, 72072, 630630, 168168, 2522520, 2522520, 252252, 4729725, 12612600, 2102100, 1576575, 3783780, 12612600, 5605600, 135135, 3432, 84084, 756756, 168168, 3153150, 2522520, 105105, 6306300, 6306300, 560560, 945945, 3003, 72072, 630630, 120120, 2522520, 840840, 945945, 2002, 45045, 360360, 30030, 315315, 1001, 20020, 45045, 364, 3003, 91, 1]
[1, 15, 105, 455, 1365, 3003, 5005, 6435, 105, 1365, 4095, 5460, 30030, 15015, 50050, 75075, 30030, 225225, 135135, 45045, 225225, 360360, 180180, 25740, 630630, 210210, 126126, 455, 8190, 45045, 30030, 75075, 300300, 75075, 675675, 450450, 675675, 135135, 1801800, 1351350, 1801800, 1081080, 180180, 1401400, 6306300, 1576575, 1891890, 2522520, 630630, 6306300, 4729725, 3783780, 1891890, 2627625, 1365, 30030, 225225, 100100, 675675, 1351350, 225225, 675675, 5405400, 1801800, 2702700, 360360, 6306300, 12612600, 9459450, 6306300, 3783780, 210210, 18918900, 8408400, 9459450, 37837800, 4729725, 5675670, 3783780, 21021000, 23648625, 15765750, 7882875, 1401400, 3003, 75075, 675675, 225225, 2702700, 3603600, 450450, 4729725, 18918900, 4204200, 6306300, 630630, 2837835, 37837800, 37837800, 28378350, 12612600, 3783780, 23648625, 94594500, 21021000, 23648625, 47297250, 2627625, 21021000, 21021000, 5005, 135135, 1351350, 360360, 6306300, 6306300, 630630, 14189175, 37837800, 6306300, 9459450, 378378, 14189175, 94594500, 63063000, 23648625, 7882875, 4729725, 47297250, 63063000, 7007000, 6435, 180180, 1891890, 420420, 9459450, 7567560, 630630, 23648625, 47297250, 6306300, 4729725, 28378350, 63063000, 21021000, 2027025, 6435, 180180, 1891890, 360360, 9459450, 6306300, 225225, 23648625, 18918900, 1401400, 4729725, 5005, 135135, 1351350, 225225, 6306300, 1801800, 2837835, 3003, 75075, 675675, 50050, 675675, 1365, 30030, 75075, 455, 4095, 105, 1]

ちなみに、面白い性質を持っている。
例えば、n = 4 のとき、
1×(x + 3) + 4×(x + 3)(x + 2) + 3×(x + 3)(x + 2) + 6×(x + 3)(x + 2)(x + 1) + 1×(x + 3)(x + 2)(x + 1)x
= (x + 3)^4
となっている。

2015年9月19日土曜日

150919

Ruby


二重根号が外れてきれいになる式

√(( 5+2√3)( 4+√13)) - √(( 4+ √3)( 5+√13)) = 1
√(( 7+3√3)( 5+√22)) - √(( 5+ √3)( 7+√22)) = 2
√((23+8√8)( 7+√17)) - √(( 7+2√8)(23+√17)) = 4
√((13+9√2)( 5+√ 7)) - √(( 5+3√2)(13+√ 7)) = 2
√((16+9√3)(11+√13)) - √((11+6√3)(16+√13)) = 1
を以下のコードで見つけ、
http://www.artofproblemsolving.com/community/c4h1142129_curious_equation
で証明した方法で全て(手計算で)確認した。

def square_number?(n)
  (Math.sqrt(n).to_i) ** 2 == n
end

M = 10
N = 30
(1..M).each{|f2|
  (f2 + 1..M).each{|d|
    (2..M).each{|x|
      if !square_number?(x)
        (x + 1..N).each{|y|
          if x.gcd(y) == 1 && !square_number?(y)
            (1..N).each{|e2|
              (e2 + 1..N).each{|c|
                m0 = Math.sqrt(c + d * Math.sqrt(x)) * Math.sqrt(e2 + Math.sqrt(y))
                m1 = Math.sqrt(e2 + f2 * Math.sqrt(x)) * Math.sqrt(c + Math.sqrt(y))
                z = m0 - m1
                p [[c, d, e2, f2, x, y], z.to_i] if (z - z.to_i).abs < 0.0000001 && z > 0
              }
            }
          end
        }
      end
    }
  }
}

出力結果
[[5, 2, 4, 1, 3, 13], 1]
[[7, 3, 5, 1, 3, 22], 2]
[[23, 8, 7, 2, 8, 17], 4]
[[13, 9, 5, 3, 2, 7], 2]
[[16, 9, 11, 6, 3, 13], 1]

2015年9月15日火曜日

150915

Ruby


ラマヌジャンが見つけた等式

http://www.nn.iij4u.or.jp/~hsat/misc/math/ramanujan.html
上記ページに載っている等式の両辺をそれぞれ計算してみた。

p (2 ** (1.0 / 3) - 1) ** (1.0 / 3)
p (1.0 / 9) ** (1.0 / 3) - (2.0 / 9) ** (1.0 / 3) + (4.0 / 9) ** (1.0 / 3)

p (4 ** (1.0 / 5) + 1) ** (1.0 / 2)
p (16 ** (1.0 / 5) + 8 ** (1.0 / 5) + 2 ** (1.0 / 5) - 1) / (5 ** (1.0 / 2))

p ((3 + 2 * 5 ** (1.0 / 4)) / (3 - 2 * 5 ** (1.0 / 4))) ** (1.0 / 4)
p (5 ** (1.0 / 4) + 1) / (5 ** (1.0 / 4) - 1)

p (5 ** (1.0 / 3) - 4 ** (1.0 / 3)) ** (1.0 / 2)
p (2 ** (1.0 / 3) + 20 ** (1.0 / 3) - 25 ** (1.0 / 3)) / 3

出力結果
0.6381858208606442
0.6381858208606441
1.5229930764034663
1.522993076403466
5.037559141801549
5.037559141801561
0.3501069760923045
0.3501069760923044