2015年10月11日日曜日

151011

Ruby


整数零点

「リーマン予想を解こう」の第7章の問題を実装してみた。

# n - 1を2進表記したときの1の個数
def d(n)
  (n - 1).to_s(2).count('1')
end

def sign(n)
  n % 2 == 0 ? 1 : -1
end

# nが0以上のとき
def power(a, n)
  return 1 if n == 0
  k = power(a, n >> 1)
  k *= k
  return k if n & 1 == 0
  return k * a
end

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

def z(r, s)
  ans = 0
  (1..2 << (r - 1)).each{|n| ans += sign(d(n)) * power(n, - s)}
  ans
end

(1..7).each{|r|
  # 1 - r ≦ s ≦ 0のときzは0
  0.downto(1 - r - 1){|s| p [r, s, z(r, s)]}
}

def z_bin(r, s)
  ans = 0
  (1..r).each{|n| ans += sign(n - 1) * ncr(r - 1, n - 1) * power(n, - s)}
  ans
end

# 多重フルビッツゼータ関数(負位数)のs = 0, -1, -2, …における零点
(1..7).each{|r|
  # 2 - r ≦ s ≦ 0のときz_binは0、1 - rのときz_binは(-1)^(r - 1)*(r - 1)!
  0.downto(1 - r){|s| p [r, s, z_bin(r, s)]}
}

出力結果
[1, 0, 0]
[1, -1, -1]
[2, 0, 0]
[2, -1, 0]
[2, -2, 4]
[3, 0, 0]
[3, -1, 0]
[3, -2, 0]
[3, -3, -48]
[4, 0, 0]
[4, -1, 0]
[4, -2, 0]
[4, -3, 0]
[4, -4, 1536]
[5, 0, 0]
[5, -1, 0]
[5, -2, 0]
[5, -3, 0]
[5, -4, 0]
[5, -5, -122880]
[6, 0, 0]
[6, -1, 0]
[6, -2, 0]
[6, -3, 0]
[6, -4, 0]
[6, -5, 0]
[6, -6, 23592960]
[7, 0, 0]
[7, -1, 0]
[7, -2, 0]
[7, -3, 0]
[7, -4, 0]
[7, -5, 0]
[7, -6, 0]
[7, -7, -10569646080]
[1, 0, 1]
[2, 0, 0]
[2, -1, -1]
[3, 0, 0]
[3, -1, 0]
[3, -2, 2]
[4, 0, 0]
[4, -1, 0]
[4, -2, 0]
[4, -3, -6]
[5, 0, 0]
[5, -1, 0]
[5, -2, 0]
[5, -3, 0]
[5, -4, 24]
[6, 0, 0]
[6, -1, 0]
[6, -2, 0]
[6, -3, 0]
[6, -4, 0]
[6, -5, -120]
[7, 0, 0]
[7, -1, 0]
[7, -2, 0]
[7, -3, 0]
[7, -4, 0]
[7, -5, 0]
[7, -6, 720]

0 件のコメント:

コメントを投稿

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