2022年3月13日日曜日

220313

Ruby


Expansion of e.g.f. 1/(1 - f(x)).

この形のe.g.f. を2通りで求めてみた。

def f(n)
  return 1 if n < 2
  (1..n).inject(:*)
end

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

def gf_to_egf(ary)
  (0..ary.size - 1).map{|i| f(i) * ary[i]}
end

def I(ary, n)
  a = [1]
  (0..n - 1).each{|i| a << -(0..i).inject(0){|s, j| s + ary[1 + i - j] * a[j]}}
  a
end

def I_egf(ary, n)
  a = [1]
  (1..n).each{|i| a << -(1..i).inject(0){|s, j| s + ncr(i, j) * ary[j] * a[-j]}}
  a
end

# ary[0] = 0として扱われる
def A_1(ary, n)
  a = [1] + (1..n).map{|i| -ary[i]}
  gf_to_egf(I(a, n))
end

# a[0] = 0として扱われる
def A_2(ary, n)
  a = gf_to_egf(ary)
  b = [1] + (1..n).map{|i| -a[i]}
  I_egf(b, n) 
end

def A000670_1(n)
  ary = (0..n).map{|i| 1r / f(i)}
  A_1(ary, n).map(&:to_i)
end

def A000670_2(n)
  ary = (0..n).map{|i| 1r / f(i)}
  A_2(ary, n).map(&:to_i)
end

def A006153_1(n)
  ary = [0] + (0..n).map{|i| 1r / f(i)}
  A_1(ary, n).map(&:to_i)
end

def A006153_2(n)
  ary = [0] + (0..n).map{|i| 1r / f(i)}
  A_2(ary, n).map(&:to_i)
end

n = 10
p A000670_1(n)
p A000670_2(n)
p A006153_1(n)
p A006153_2(n)

出力結果
[1, 1, 3, 13, 75, 541, 4683, 47293, 545835, 7087261, 102247563]
[1, 1, 3, 13, 75, 541, 4683, 47293, 545835, 7087261, 102247563]
[1, 1, 4, 21, 148, 1305, 13806, 170401, 2403640, 38143377, 672552730]
[1, 1, 4, 21, 148, 1305, 13806, 170401, 2403640, 38143377, 672552730]

2022年2月11日金曜日

220211

Ruby


A010754とA010755

計算してみた。

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

def A(n)
  (0..n).map{|i| (0..i / 2).map{|j| ncr(i - j, j)}.inject(:+)}
end

def A010754(n)
  (0..n).map{|i| (0..i / 2 / 2).map{|j| ncr(i - j, j)}.inject(:+)}
end

def A010755(n)
  (0..n).map{|i| (0..(i / 2 - 1) / 2).map{|j| ncr(i - j, j)}.inject(:+).to_i}
end

n = 50
p A(n)
p A010754(n)
p A010755(n)

出力結果
[1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584, 4181, 6765, 10946, 17711, 28657, 46368, 75025, 121393, 196418, 317811, 514229, 832040, 1346269, 2178309, 3524578, 5702887, 9227465, 14930352, 24157817, 39088169, 63245986, 102334155, 165580141, 267914296, 433494437, 701408733, 1134903170, 1836311903, 2971215073, 4807526976, 7778742049, 12586269025, 20365011074]
[1, 1, 1, 1, 4, 5, 6, 7, 23, 30, 38, 47, 141, 188, 245, 313, 888, 1201, 1594, 2080, 5676, 7756, 10429, 13817, 36622, 50439, 68497, 91804, 237821, 329625, 451166, 610247, 1551727, 2161974, 2978230, 4058629, 10161409, 14220038, 19694622, 27007760, 66732392, 93740152, 130427529, 179815516, 439267525, 619083041, 864813846, 1197799127, 2897064773, 4094863900, 5740250973]
[0, 0, 1, 1, 1, 1, 6, 7, 8, 9, 38, 47, 57, 68, 245, 313, 393, 486, 1594, 2080, 2673, 3388, 10429, 13817, 18058, 23307, 68497, 91804, 121541, 159081, 451166, 610247, 816256, 1080399, 2978230, 4058629, 5474584, 7313138, 19694622, 27007760, 36687377, 49387987, 130427529, 179815516, 245730805, 332985281, 864813846, 1197799127, 1645387073, 2242380904, 5740250973]

2022年1月18日火曜日

220118

PARI


分割における最小の数と分割の数に関する数列

次のような美しい式が成り立つ。

N=40; x='x+O('x^N);

f_x = sum(k=0, N, x^(k*(k+1)/2)  /prod(j=1, k, 1-x^j));
f_y = sum(k=0, N, x^(k*(3*k-1)/2)/prod(j=1, k, 1-x^j));
f_z = sum(k=0, N, x^(k*(3*k+1)/2)/prod(j=1, k, 1-x^j));

g_x = sum(k=0, N, x^k            /prod(j=1, k, 1-x^j));
g_y = sum(k=0, N, x^k^2          /prod(j=1, k, 1-x^j));
g_z = sum(k=0, N, x^(k*(k+1))    /prod(j=1, k, 1-x^j));

print(Vec(f_x))       \\ A000009
print(Vec(f_y))       \\ A025157
print(Vec(f_z))       \\ A237979
print(Vec(f_y - f_z)) \\ A096401
print(Vec(f_x - f_y)) \\ A237976
print(Vec(f_x - f_z)) \\ A237977

print(Vec(g_x))       \\ A000041
print(Vec(g_y))       \\ A003114
print(Vec(g_z))       \\ A003106
print(Vec(g_y - g_z)) \\ A006141
print(Vec(g_x - g_y)) \\ A039899
print(Vec(g_x - g_z)) \\ A039900

出力結果
[1, 1, 1, 2, 2, 3, 4, 5, 6, 8, 10, 12, 15, 18, 22, 27, 32, 38, 46, 54, 64, 76, 89, 104, 122, 142, 165, 192, 222, 256, 296, 340, 390, 448, 512, 585, 668, 760, 864, 982]
[1, 1, 1, 1, 1, 2, 2, 3, 3, 4, 4, 5, 6, 7, 8, 10, 11, 13, 15, 17, 19, 22, 25, 28, 32, 36, 41, 46, 52, 58, 66, 73, 82, 91, 102, 113, 126, 139, 155, 171]
[1, 0, 1, 1, 1, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 7, 7, 9, 10, 12, 13, 16, 17, 20, 22, 25, 28, 32, 35, 40, 45, 50, 56, 63, 70, 78, 87, 96, 107, 118, 131]
[1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 8, 8, 10, 11, 13, 14, 17, 18, 21, 23, 26, 28, 32, 35, 39, 43, 48, 53]
[1, 1, 1, 2, 2, 3, 4, 6, 7, 9, 11, 14, 17, 21, 25, 31, 37, 45, 54, 64, 76, 90, 106, 124, 146, 170, 198, 230, 267, 308, 357, 410, 472, 542, 621, 709, 811]
[1, 0, 1, 1, 2, 3, 3, 4, 5, 7, 8, 11, 13, 17, 20, 25, 29, 36, 42, 51, 60, 72, 84, 100, 117, 137, 160, 187, 216, 251, 290, 334, 385, 442, 507, 581, 664, 757, 864]
[1, 1, 2, 3, 5, 7, 11, 15, 22, 30, 42, 56, 77, 101, 135, 176, 231, 297, 385, 490, 627, 792, 1002, 1255, 1575, 1958, 2436, 3010, 3718, 4565, 5604, 6842, 8349, 10143, 12310, 14883, 17977, 21637, 26015, 31185]
[1, 1, 1, 1, 2, 2, 3, 3, 4, 5, 6, 7, 9, 10, 12, 14, 17, 19, 23, 26, 31, 35, 41, 46, 54, 61, 70, 79, 91, 102, 117, 131, 149, 167, 189, 211, 239, 266, 299, 333]
[1, 0, 1, 1, 1, 1, 2, 2, 3, 3, 4, 4, 6, 6, 8, 9, 11, 12, 15, 16, 20, 22, 26, 29, 35, 38, 45, 50, 58, 64, 75, 82, 95, 105, 120, 133, 152, 167, 190, 210, 237]
[1, 0, 0, 1, 1, 1, 1, 1, 2, 2, 3, 3, 4, 4, 5, 6, 7, 8, 10, 11, 13, 15, 17, 19, 23, 25, 29, 33, 38, 42, 49, 54, 62, 69, 78, 87, 99, 109, 123]
[1, 2, 3, 5, 8, 12, 18, 25, 36, 49, 68, 91, 123, 162, 214, 278, 362, 464, 596, 757, 961, 1209, 1521, 1897, 2366, 2931, 3627, 4463, 5487, 6711, 8200, 9976, 12121, 14672, 17738, 21371, 25716, 30852]
[1, 1, 2, 4, 6, 9, 13, 19, 27, 38, 52, 71, 95, 127, 167, 220, 285, 370, 474, 607, 770, 976, 1226, 1540, 1920, 2391, 2960, 3660, 4501, 5529, 6760, 8254, 10038, 12190, 14750, 17825, 21470, 25825, 30975]

2021年12月13日月曜日

211213

Ruby


ナゴヤ三角形について(3)

一つの角が90度の、全ての辺の長さが整数の三角形について考えます。
このうち、辺の長さが互いに素な場合(原始ピタゴラス数)を計算すると以下のようになります。

def A(n)
  ary = []
  (1..n).each{|i|
    (i + 1..n).each{|j|
      if i.gcd(j) == 1 && (i - j) % 2 > 0
        x, y, z = j * j, i * j, i * i
        b = y + y
        c = x + z 
        a = x - z
        ary << [a, b, c]
      end
    }
  }
  ary
end

n = 10
A(n).sort.each{|i| p i}

出力結果
[3, 4, 5]
[5, 12, 13]
[7, 24, 25]
[9, 40, 41]
[11, 60, 61]
[13, 84, 85]
[15, 8, 17]
[15, 112, 113]
[17, 144, 145]
[19, 180, 181]
[21, 20, 29]
[33, 56, 65]
[35, 12, 37]
[39, 80, 89]
[45, 28, 53]
[51, 140, 149]
[55, 48, 73]
[63, 16, 65]
[65, 72, 97]
[77, 36, 85]
[91, 60, 109]
[99, 20, 101]

2021年12月12日日曜日

211212

Ruby


ナゴヤ三角形について(2)

一つの角が120度の、全ての辺の長さが整数の三角形について考えます。
このうち、辺の長さが互いに素な場合を計算すると以下のようになります。

def A(n)
  ary = []
  (1..n).each{|i|
    (i + 1..n).each{|j|
      if i.gcd(j) == 1 && (i - j) % 3 > 0
        x, y, z = j * j, i * j, i * i
        b = x + y + y
        c = x + y + z 
        a = y + y + z
        ary << [b - a, a, c]
      end
    }
  }
  ary
end

n = 10
A(n).sort.each{|i| p i}

出力結果
[3, 5, 7]
[5, 16, 19]
[7, 33, 37]
[8, 7, 13]
[9, 56, 61]
[11, 85, 91]
[13, 120, 127]
[15, 161, 169]
[16, 39, 49]
[17, 208, 217]
[19, 261, 271]
[24, 11, 31]
[24, 95, 109]
[32, 175, 193]
[35, 13, 43]
[40, 51, 79]
[45, 32, 67]
[55, 57, 97]
[56, 115, 151]
[63, 17, 73]
[65, 88, 133]
[77, 40, 103]
[80, 19, 91]
[91, 69, 139]

2021年12月11日土曜日

211211

Ruby


ナゴヤ三角形について(1)

この記事は
日曜数学 Advent Calendar 2021
の12/11 分として書いております。

ナゴヤ三角形とは、一松 信氏命名の三角形の名称で、
一つの角が60度の、全ての辺の長さが整数の三角形(ただし、正三角形は除く)
のことです。
大学受験数学で頻出のものに、(3, 7, 8)や(5, 7, 8)があります。
辺の長さが互いに素な場合を原始的(primitive)とよびます。

原始的なナゴヤ三角形は、適当な正の整数m, n(0 < n < m)により、
2*m*n+n^2, m^2+m*n+n^2, m^2+2*m*n
もしくは
m^2 - n^2, m^2+m*n+n^2, m^2+2*m*n
のいずれかの形で一通りで表されます。

ここで注意しないといけない事は、
m, nに適当な値を入れると原始的でなくなる
ということです。
(m, n)=1, m-nが3で割り切れない
という条件が必要です。 

これらをもとに、原始的なナゴヤ三角形を計算すると以下のようになります。

def A(n)
  ary = []
  (1..n).each{|i|
    (i + 1..n).each{|j|
      if i.gcd(j) == 1 && (i - j) % 3 > 0
        x, y, z = j * j, i * j, i * i
        b = x + y + y
        c = x + y + z 
        a = y + y + z
        ary << [    a, b, c]
        ary << [b - a, b, c]
      end
    }
  }
  ary
end

n = 10
A(n).sort.each{|i| p i}

出力結果
[3, 8, 7]
[5, 8, 7]
[5, 21, 19]
[7, 15, 13]
[7, 40, 37]
[8, 15, 13]
[9, 65, 61]
[11, 35, 31]
[11, 96, 91]
[13, 48, 43]
[13, 133, 127]
[15, 176, 169]
[16, 21, 19]
[16, 55, 49]
[17, 80, 73]
[17, 225, 217]
[19, 99, 91]
[19, 280, 271]
[24, 35, 31]
[24, 119, 109]
[32, 77, 67]
[32, 207, 193]
[33, 40, 37]
[35, 48, 43]
[39, 55, 49]
[40, 91, 79]
[40, 117, 103]
[45, 77, 67]
[51, 91, 79]
[55, 112, 97]
[56, 65, 61]
[56, 171, 151]
[57, 112, 97]
[63, 80, 73]
[65, 153, 133]
[69, 160, 139]
[77, 117, 103]
[80, 99, 91]
[85, 96, 91]
[88, 153, 133]
[91, 160, 139]
[95, 119, 109]
[115, 171, 151]
[120, 133, 127]
[161, 176, 169]
[175, 207, 193]
[208, 225, 217]
[261, 280, 271]

2021年11月6日土曜日

211106

Ruby


Numbers k such that k^2 is palindromic in base b

出力してみた。

def A(k, n)
  i = (n * n).to_s(k)
  i == i.reverse
end

def B(k, n)
  m = 0
  cnt = 0
  ary = []
  while cnt < n
    if A(k, m)
      cnt += 1
      ary << m
    end
    m += 1
  end
  ary
end

n = 10
(2..36).each{|i|
  p [i, B(i, n)]
}

出力結果
[2, [0, 1, 3, 4523, 11991, 18197, 141683, 1092489, 3168099, 6435309]]
[3, [0, 1, 2, 4, 10, 11, 20, 22, 28, 34]]
[4, [0, 1, 5, 17, 21, 65, 71, 83, 257, 273]]
[5, [0, 1, 2, 6, 26, 31, 66, 126, 156, 626]]
[6, [0, 1, 2, 7, 37, 43, 76, 91, 217, 259]]
[7, [0, 1, 2, 4, 8, 10, 11, 20, 32, 40]]
[8, [0, 1, 2, 3, 6, 9, 11, 27, 65, 73]]
[9, [0, 1, 2, 10, 20, 82, 91, 100, 164, 730]]
[10, [0, 1, 2, 3, 11, 22, 26, 101, 111, 121]]
[11, [0, 1, 2, 3, 6, 12, 24, 26, 72, 84]]
[12, [0, 1, 2, 3, 13, 26, 145, 157, 169, 179]]
[13, [0, 1, 2, 3, 14, 28, 170, 183, 196, 209]]
[14, [0, 1, 2, 3, 15, 24, 30, 47, 165, 197]]
[15, [0, 1, 2, 3, 4, 8, 12, 16, 19, 32]]
[16, [0, 1, 2, 3, 17, 34, 257, 273, 289, 305]]
[17, [0, 1, 2, 3, 4, 6, 12, 18, 28, 36]]
[18, [0, 1, 2, 3, 4, 19, 38, 49, 65, 325]]
[19, [0, 1, 2, 3, 4, 10, 20, 40, 60, 64]]
[20, [0, 1, 2, 3, 4, 21, 42, 45, 63, 273]]
[21, [0, 1, 2, 3, 4, 22, 29, 44, 56, 66]]
[22, [0, 1, 2, 3, 4, 23, 39, 46, 51, 69]]
[23, [0, 1, 2, 3, 4, 12, 24, 48, 57, 58]]
[24, [0, 1, 2, 3, 4, 5, 10, 15, 20, 25]]
[25, [0, 1, 2, 3, 4, 26, 52, 66, 78, 626]]
[26, [0, 1, 2, 3, 4, 5, 9, 18, 27, 54]]
[27, [0, 1, 2, 3, 4, 5, 14, 28, 56, 84]]
[28, [0, 1, 2, 3, 4, 5, 29, 58, 87, 785]]
[29, [0, 1, 2, 3, 4, 5, 30, 60, 69, 81]]
[30, [0, 1, 2, 3, 4, 5, 31, 41, 62, 93]]
[31, [0, 1, 2, 3, 4, 5, 8, 16, 24, 32]]
[32, [0, 1, 2, 3, 4, 5, 33, 66, 70, 99]]
[33, [0, 1, 2, 3, 4, 5, 34, 43, 60, 68]]
[34, [0, 1, 2, 3, 4, 5, 35, 70, 105, 127]]
[35, [0, 1, 2, 3, 4, 5, 6, 12, 18, 24]]
[36, [0, 1, 2, 3, 4, 5, 37, 74, 111, 133]]

2021年10月9日土曜日

211009

Ruby


Stirling number(1)

第1種スターリング数および第2種スターリング数を計算してみた。
第1種については
「数の本」、「コンピュータの数学」
にある通り、符号なしで出力してみる。

# 符号は無視
def stirling(n, k = 1)
  a = [1]
  p [0, a]
  (1..n).each{|i|
    a << 0
    b = [0]
    (0..i - 1).each{|j|
      if k == 2
        b[j + 1] = a[j] + (j + 1) * a[j + 1]
      else
        b[j + 1] = a[j] + (i - 1) * a[j + 1]
      end
    }
    a = b
    p [i, a]
  }
end

n = 10
stirling(n)
p ""
stirling(n, 2)

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

2021年10月7日木曜日

211007

Ruby


37で割り切れるpandigital number

2016年JJMO予選の問題をプログラミングで解いてみた。
0を含めない場合についても考えてみた。

def A(m, n)
  ary = []
  (m..n).to_a.permutation{|i|
    if i[0] > 0
      j = i.join.to_i
      ary << j if j % 37 == 0
    end
  }
  ary
end

def show(ary, n)
  p ary.size
  # 小さいものをn個表示
  p ary[0..n - 1]
  # 大きいものをn個表示
  p ary[-n..-1]
end

n = 10
show(A(0, 9), n)
# もし1から9の数字だったら
show(A(1, 9), n)

出力結果
85104
[1023654987, 1023657984, 1023684957, 1023687954, 1023745896, 1023746895, 1023795846, 1023796845, 1023845796, 1023846795]
[9876142305, 9876145302, 9876302145, 9876305142, 9876342105, 9876345102, 9876412035, 9876415032, 9876432015, 9876435012]
9072
[123564978, 123568974, 123574968, 123578964, 123645897, 123647895, 123695847, 123697845, 123845697, 123847695]
[987263415, 987265413, 987413265, 987415263, 987463215, 987465213, 987532146, 987536142, 987542136, 987546132]

2021年9月19日日曜日

210919

Ruby


π を分数で近似(4)

π = 4/(1 + 1^2/(3 + 2^2/(5 + 3^2/(7 + ...
を利用して、近似してみた。

def A(k, m, n)
  a, b = k, m
  ary = [k]
  (1..n).each{|i|
    a, b = b, (2 * i + 1) * b + i ** 2 * a
    ary << a
  }
  ary
end

n = 20
# A054765
p ary0 = A(0, 1, n)
# A012244
p ary1 = A(1, 1, n)
p (0..n).map{|i| 4 * ary0[i] / ary1[i].to_r}

出力結果
[0, 1, 3, 19, 160, 1744, 23184, 364176, 6598656, 135484416, 3108695040, 78831037440, 2189265960960, 66083318415360, 2154235544616960, 75425161203302400, 2822882994841190400, 112463980097804697600, 4752052488932268441600, 212264271642182654361600, 9993797542549672427520000]
[1, 1, 4, 24, 204, 2220, 29520, 463680, 8401680, 172504080, 3958113600, 100370793600, 2787459998400, 84139894238400, 2742857884166400, 96034297911552000, 3594206259195552000, 143193586818810528000, 6050501147565883008000, 270263264589232282368000, 12724498233251342778240000]
[(0/1), (4/1), (3/1), (19/6), (160/51), (1744/555), (644/205), (2529/805), (183296/58345), (3763456/1197945), (4317632/1374345), (54743776/17425485), (1013549056/322622685), (30594128896/9738413685), (35618973952/11337871545), (10392576224/3308059755), (3111643512832/990466892415), (123968232030208/39460313827935), (48501417558016/15438480702645), (1083228572868608/344802363740835), (4080033616887808/1298715036217599)]