2025年2月25日火曜日

250225

PARI


A059297, A185951 and A136630

最近よく使っている係数を出力してみた。

N=10;

a059297(n, k) = my(x='x+O('x^(n+1)), t='t+O('t^(k+1))); n!*polcoef(polcoef(exp(t*x* exp(x)), n), k);
a185951(n, k) = my(x='x+O('x^(n+1)), t='t+O('t^(k+1))); n!*polcoef(polcoef(exp(t*x*cosh(x)), n), k);
a136630(n, k) = my(x='x+O('x^(n+1)), t='t+O('t^(k+1))); n!*polcoef(polcoef(exp(t  *sinh(x)), n), k);

for(n=0, N, for(k=0, n, print1(a059297(n, k),", ")); print)
for(n=0, N, for(k=0, n, print1(a185951(n, k),", ")); print)
for(n=0, N, for(k=0, n, print1(a136630(n, k),", ")); print)

出力結果
1, 
0, 1, 
0, 2, 1, 
0, 3, 6, 1, 
0, 4, 24, 12, 1, 
0, 5, 80, 90, 20, 1, 
0, 6, 240, 540, 240, 30, 1, 
0, 7, 672, 2835, 2240, 525, 42, 1, 
0, 8, 1792, 13608, 17920, 7000, 1008, 56, 1, 
0, 9, 4608, 61236, 129024, 78750, 18144, 1764, 72, 1, 
0, 10, 11520, 262440, 860160, 787500, 272160, 41160, 2880, 90, 1, 
1, 
0, 1, 
0, 0, 1, 
0, 3, 0, 1, 
0, 0, 12, 0, 1, 
0, 5, 0, 30, 0, 1, 
0, 0, 120, 0, 60, 0, 1, 
0, 7, 0, 735, 0, 105, 0, 1, 
0, 0, 896, 0, 2800, 0, 168, 0, 1, 
0, 9, 0, 15372, 0, 8190, 0, 252, 0, 1, 
0, 0, 5760, 0, 114240, 0, 20160, 0, 360, 0, 1, 
1, 
0, 1, 
0, 0, 1, 
0, 1, 0, 1, 
0, 0, 4, 0, 1, 
0, 1, 0, 10, 0, 1, 
0, 0, 16, 0, 20, 0, 1, 
0, 1, 0, 91, 0, 35, 0, 1, 
0, 0, 64, 0, 336, 0, 56, 0, 1, 
0, 1, 0, 820, 0, 966, 0, 84, 0, 1, 
0, 0, 256, 0, 5440, 0, 2352, 0, 120, 0, 1, 

2025年1月26日日曜日

250126

Ruby


Stirling number(2)

|Stirling1(n,k)| のk列目を求める方とわかっている場合、以下の方が高速。(Stirling2(n,k) も同様のことが言える)

def f(n)
  return 1 if n == 0
  (1..n).inject(:*)
end

# 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
  k = power(ary, n >> 1, m)
  k = mul(k, k, m)
  return k if n & 1 == 0
  return mul(k, ary, m)
end

# 符号は無視
def stirling(n, k, m = 1)
  return [1] + [0] * n if k == 0
  if m == 1
    ary = [0] + (1..n).map{|i| 1r / i}
  else
    ary = [0] + (1..n).map{|i| 1r / f(i)}
  end
  ary = power(ary, k, n)
  fk = f(k)
  (0..n).map{|i| (ary[i] * f(i) / fk).to_i}
end

n = 10
(0..10).each{|i| p [i, stirling(n, i)]}
p ""
(0..10).each{|i| p [i, stirling(n, i, 2)]}

出力結果
[0, [1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]]
[1, [0, 1, 1, 2, 6, 24, 120, 720, 5040, 40320, 362880]]
[2, [0, 0, 1, 3, 11, 50, 274, 1764, 13068, 109584, 1026576]]
[3, [0, 0, 0, 1, 6, 35, 225, 1624, 13132, 118124, 1172700]]
[4, [0, 0, 0, 0, 1, 10, 85, 735, 6769, 67284, 723680]]
[5, [0, 0, 0, 0, 0, 1, 15, 175, 1960, 22449, 269325]]
[6, [0, 0, 0, 0, 0, 0, 1, 21, 322, 4536, 63273]]
[7, [0, 0, 0, 0, 0, 0, 0, 1, 28, 546, 9450]]
[8, [0, 0, 0, 0, 0, 0, 0, 0, 1, 36, 870]]
[9, [0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 45]]
[10, [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1]]
""
[0, [1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]]
[1, [0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]]
[2, [0, 0, 1, 3, 7, 15, 31, 63, 127, 255, 511]]
[3, [0, 0, 0, 1, 6, 25, 90, 301, 966, 3025, 9330]]
[4, [0, 0, 0, 0, 1, 10, 65, 350, 1701, 7770, 34105]]
[5, [0, 0, 0, 0, 0, 1, 15, 140, 1050, 6951, 42525]]
[6, [0, 0, 0, 0, 0, 0, 1, 21, 266, 2646, 22827]]
[7, [0, 0, 0, 0, 0, 0, 0, 1, 28, 462, 5880]]
[8, [0, 0, 0, 0, 0, 0, 0, 0, 1, 36, 750]]
[9, [0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 45]]
[10, [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1]]

2025年1月25日土曜日

250125

Julia


128ビット整数型

Julia にはプリミティブ型に128ビット整数型があるので、確認してみた。

println("最大値")
x = Int128(2)^127 - 1
println(x)
println("+1する")
println(x + 1)

println("最小値")
y = -Int128(2)^127
println(y)
println("-1する")
println(y - 1)

出力結果
最大値
170141183460469231731687303715884105727
+1する
-170141183460469231731687303715884105728
最小値
-170141183460469231731687303715884105728
-1する
170141183460469231731687303715884105727