2015年3月31日火曜日

150331

Ruby


Sylvester's sequence

短いコードを書いてみた。
オンライン整数列大辞典の
A000058(http://oeis.org/A000058/list)
と比較し、答え合わせしてみる。

a, n = 1, 0
ary = [2]
while n < 8
  a *= (a + 1)
  ary << a + 1
  n += 1
end

# OEIS A000058のデータ
ary0 =
[2,3,7,43,1807,3263443,10650056950807,
 113423713055421844361000443,
 12864938683278671740537145998360961546653259485195807]
# 一致の確認
p ary == ary0

2015年3月30日月曜日

150330

Ruby


Heterosquare

3次のHeterosquareが何個あるか?
ただし、

123  345  567  781
894  296  498  692
765  187  321  543

187  321  543  765
296  498  692  894
345  567  781  123

は同一のものとする。

cnt = 0
(1..9).to_a.permutation{|a|
  ary = []
  # 縦
  (0..2).each{|i| ary << a[i] + a[3 + i] + a[6 + i]}
  # 横
  (0..2).each{|i| ary << a[3 * i, 3].inject(:+)}
  # ななめ
  ary << a[0] + a[4] + a[8]
  ary << a[2] + a[4] + a[6]
  cnt += 1 if ary.size == ary.uniq.size
}
p cnt / 8

出力結果
3120

2015年3月29日日曜日

150329(4)

Ruby


Connell Sequence

まずは素直にコードを書いてみた。
オンライン整数列大辞典の
A001614(http://oeis.org/A001614/list)
と比較し、答え合わせしてみる。

M = 122
ary = []
m, n = 0, 1
while m < M
  m += 1
  ary << m
  (1..n - 1).each{|i|
    m += 2
    ary << m if m <= M
  }
  n += 1
end

# OEIS A001614のデータ
ary0 =
[1,2,4,5,7,9,10,12,14,16,17,19,21,23,25,26,28,30,
 32,34,36,37,39,41,43,45,47,49,50,52,54,56,58,60,
 62,64,65,67,69,71,73,75,77,79,81,82,84,86,88,90,
 92,94,96,98,100,101,103,105,107,109,111,113,115,
 117,119,121,122]
# 一致の確認
p ary == ary0

一般項を利用してコードを書いてみた。

M = 122
ary = []
i, m = 0, 0
while m < M
  i += 1
  m = 2 * i - ((1 + Math.sqrt(8 * i - 7)) / 2.0).to_i
  ary << m if m <= M
end

# OEIS A001614のデータ
ary0 =
[1,2,4,5,7,9,10,12,14,16,17,19,21,23,25,26,28,30,
 32,34,36,37,39,41,43,45,47,49,50,52,54,56,58,60,
 62,64,65,67,69,71,73,75,77,79,81,82,84,86,88,90,
 92,94,96,98,100,101,103,105,107,109,111,113,115,
 117,119,121,122]
# 一致の確認
p ary == ary0

150329(3)

Ruby


21397

二乗したとき各桁の数字が互いに異なる最大の素数
らしい。(https://primes.utm.edu/curios/page.php?rank=1753)
これを確かめてみよう。

require 'prime'
Math.sqrt(9876543210).to_i.downto(1){|i|
  a = (i * i).to_s.split("")
  if a.size == a.uniq.size && i.prime?
    p i
    break
  end
}

150329(2)

Ruby


Göbel's Sequence(1)

MathWorldに載っている定義に従い、コードを書いてみた。

N = 6
n = 0
ary = [1]
sum = 2
while n < N
  n += 1
  if sum % n == 0
    x = sum / n
    ary.push(x)
    sum += x * x
  # 整数でなかったら止める(そんなことが起こる前にArgumentErrorが発生)
  else
    break
  end
end
p ary

150329

Ruby


Somos-k sequence

「k≦7の場合、各項は全て自然数である」という性質を利用してコードを書いてみた。
オンライン整数列大辞典の
A006720(http://oeis.org/A006720/list)、
A006721(http://oeis.org/A006721/list)、
A006722(http://oeis.org/A006722/list)、
A006723(http://oeis.org/A006723/list)
と比較し、答え合わせしてみる。

def somos(ary, k)
  s = 0
  for i in (1..k / 2)
    s += ary[i] * ary[k - i]
  end
  s /= ary[0]
end

def somos_sequence(k, n)
  ary = Array.new(k, 1)
  list = ary
  i = k - 1
  while i < n
    ary0 = ary[1..-1]
    j = somos(ary, k)
    ary = ary0.push(j)
    list.push(j)
    i += 1
  end
  return list
end

list = somos_sequence(4, 23)
# OEIS A006720のデータ
list0 =
[1,1,1,1,2,3,7,23,59,314,1529,8209,83313,620297,
 7869898,126742987,1687054711,47301104551,
 1123424582771,32606721084786,1662315215971057,
 61958046554226593,4257998884448335457,
 334806306946199122193]
# 一致の確認
p list == list0

list = somos_sequence(5, 26)
# OEIS A00671のデータ
list0 =
[1,1,1,1,1,2,3,5,11,37,83,274,1217,6161,22833,
 165713,1249441,9434290,68570323,1013908933,
 11548470571,142844426789,2279343327171,
 57760865728994,979023970244321,23510036246274433,
 771025645214210753]
# 一致の確認
p list == list0

list = somos_sequence(6, 25)
# OEIS A00672のデータ
list0 =
[1,1,1,1,1,1,3,5,9,23,75,421,1103,5047,41783,
 281527,2534423,14161887,232663909,3988834875,
 45788778247,805144998681,14980361322965,
 620933643034787,16379818848380849,
 369622905371172929]
# 一致の確認
p list == list0

list = somos_sequence(7, 28)
# OEIS A00673のデータ
list0 =
[1,1,1,1,1,1,1,3,5,9,17,41,137,769,1925,7203,
 34081,227321,1737001,14736001,63232441,702617001,
 8873580481,122337693603,1705473647525,
 22511386506929,251582370867257,9254211194697641,
 215321535159114017]
# 一致の確認
p list == list0

2015年3月28日土曜日

150328

Ruby


Perrin Pseudoprime

1〜10^6までで調べてみる。

require 'prime'

a, b, c = 2, 0, 3
i = 2
while i < 10 ** 6
  a, b, c = b + c, a, b
  i += 1
  if a % i == 0
    p i if !i.prime?
  end
end

出力結果
271441
904631

2015年3月23日月曜日

150323

Ruby


sigma(n)

sigma(n) = 2n + 2 となる n は
オンライン整数列大辞典のA088831(https://oeis.org/A088831/list)
によると
[20,104,464,650,1952,130304,522752,8382464,
 134193152,549754241024,8796086730752]

また、sigma(n) = 2n - 2 となる n は
オンライン整数列大辞典のA191363(http://oeis.org/A191363/list)
によると
[3,10,136,32896,2147516416]

これらのうち、200000以下のものを出力するコードを書いてみた。

def sum_of_divisors(p)
  sum = 0
  q = Math.sqrt(p).to_i
  for i in (1..q - 1)
    if p % i == 0
      sum += i + p / i
    end
  end
  if p % q == 0
    if p == q * q
      sum += q
    else
      sum += q + p / q
    end
  end
  return sum
end

def sigma(min, max)
  ary088831 = []
  ary191363 = []
  for i in (min..max)
    j = sum_of_divisors(i) - i * 2
    if j == 2
      ary088831 << i
    elsif j == - 2
      ary191363 << i
    else
    end
  end
  return [ary088831, ary191363]
end

p sigma(1, 200000)

2015年3月15日日曜日

150315

Ruby


不思議数

minからmaxまでの不思議数を出力するコードを書いてみた。
オンライン整数列大辞典の
A006037(http://oeis.org/A006037/list)
と比較し、答え合わせしてみる。

N0 = 19700

def sum_of_divisors(p)
  sum = 0
  q = Math.sqrt(p).to_i
  for i in (1..q - 1)
    if p % i == 0
      sum += i + p / i
    end
  end
  if p % q == 0
    if p == q * q
      sum += q
    else
      sum += q + p / q
    end
  end
  return sum
end

def divisors(p)
  ary = []
  q = Math.sqrt(p).to_i
  for i in (1..q - 1)
    if p % i == 0
      ary << i
      ary << p / i
    end
  end
  if p % q == 0
    if p == q * q
      ary << q
    else
      ary << q
      ary << p / q
    end
  end
  return ary
end

def weird?(i, j)
  # weirdなら、「sum_of_divisors(i)からj分だけ引ける」ということは起こらない
  ary1 = divisors(i).select{|n| n <= j}
  ary2 = [0]
  for k in (0..ary1.size - 1)
    ary3 = []
    for l in (0..ary2.size - 1)
      m = ary2[l] + ary1[k]
      if m == j
        return false
      elsif m < j
        ary3 << m
      else
      end
    end
    ary2 |= ary3
  end
  return true
end

def weird_numbers(min, max)
  ary = []
  for i in (min..max)
    j = sum_of_divisors(i) - i * 2
    # 過剰数か?
    if j > 0
      ary << i if weird?(i, j)
    end
  end
  return ary
end

ary = weird_numbers(1, N0)

# OEIS A006037のデータ
ary0 =
[70,836,4030,5830,7192,7912,9272,10430,10570,
 10792,10990,11410,11690,12110,12530,12670,13370,
 13510,13790,13930,14770,15610,15890,16030,16310,
 16730,16870,17272,17570,17990,18410,18830,18970,
 19390,19670]
# 一致の確認
p ary == ary0

2015年3月1日日曜日

150301(2)

Ruby


√の小数部分の先頭に自身が現れる整数

1〜10^9 - 1までで調べてみる。

S = 9
for s in (1..S)
  m0 = 10 ** (s - 1)
  m1 = 10 ** s
  for i in (m0..m1 - 1)
    p i if Math.sqrt(i * m1 * m1).to_i % m1 == i
  end
end

出力結果
8
77
5711
9797
997997
8053139
60755907
99979997

見ると、99…799…7がこの性質をもっていそうなので調べる。

S = 20
for s in (1..S)
  m1 = 10 ** s
  m2 = (m1 - 3) * (m1 + 1)
  p m2 if Math.sqrt(m2 * (m1 ** 4)).to_i % (m1 ** 2) == m2
end

出力結果
77
9797
997997
99979997

残念ながら、99979997までしかこの性質をもっていないようだ。

150301

Ruby


Silverman's Sequence

以下のコードより次のことがわかる。
 最初からN個取り出すに十分なaryは、
    N≦ 11のとき、[1, 2, 2]
 12≦N≦ 38のとき、[1, 2, 2, 3, 3]
 39≦N≦122のとき、[1, 2, 2, 3, 3, 4, 4, 4]
 …
 である。

N = 122

ary = [1, 2, 2]
s = 1 + 2 * (6 - 1)
i = 3
while s < N
  j = ary.size
  k = j + ary[i - 1]
  ary += [i] * ary[i - 1] 
  s += i * ((k * (k + 1)) / 2 - (j * (j + 1)) / 2)
  i += 1
end
p ary

s_ary = []
s1 = 0
s2 = 0
i = 0
for j in (1..N)
  while s2 + ary[i] * (i + 1) < j
    s1 += ary[i]
    s2 += ary[i] * (i + 1)
    i += 1
  end
  s_ary << s1 + ((j - s2) * 1.0 / (i + 1)).ceil
end
p s_ary