2015年8月22日土曜日

150822

連続する自然数の積は平方数ではない

連続する自然数の積は平方数ではないことを
1939年にP.Erdosが示した。
(http://www.renyi.hu/~p_erdos/1939-03.pdf)
また、より一般化し
連続する自然数の積は累乗数ではないことを
1975年にP.Erdosが示した。
(https://projecteuclid.org/download/pdf_1/euclid.ijm/1256050816)

2015年6月14日日曜日

150614(2)

Ruby


Dirichlet's theorem on arithmetic progressions(2)

昨日思い浮かんだ予想について、幅を任意の整数に変えても同じことが成り立ちそう。

require 'prime'

# nを割り切る最大の平方数を探す
def f(n)
  Prime.int_from_prime_division(
    n.prime_division.map{|p, q| [p, q / 2]}
  )
end

(1..9).each{|x|
  (1..7).each{|i|
    h1 = {}
    h2 = {}
    cnt = 0
    # x + 1以上10^i以下について調べる
    Prime.each(10 ** i){|n|
      if n > x
        l = f(n + x)
        m = f(n - x)
        h1.key?(l) ? h1[l] += 1 : h1[l] = 1
        h2.key?(m) ? h2[m] += 1 : h2[m] = 1
        cnt += 1
      end
    }
    # h1, h2 を全部出力させると見にくいので、一部を出力
    p [x, 10 ** i]
    p (1..6).map{|j| h1[j] == nil ? 0 : h1[j]}
    p (1..6).map{|j| h2[j] == nil ? 0 : h2[j]}
  }
}

出力結果
[1, 10]
[2, 2, 0, 0, 0, 0]
[3, 1, 0, 0, 0, 0]
[1, 100]
[8, 9, 3, 3, 0, 1]
[13, 7, 1, 2, 0, 2]
[1, 1000]
[59, 52, 12, 13, 2, 9]
[68, 46, 11, 11, 3, 10]
[1, 10000]
[462, 343, 83, 92, 24, 61]
[467, 350, 82, 84, 28, 62]
[1, 100000]
[3573, 2703, 655, 673, 164, 477]
[3599, 2688, 636, 672, 195, 479]
[1, 1000000]
[29290, 22002, 5205, 5507, 1482, 3954]
[29397, 22055, 5238, 5475, 1500, 3903]
[1, 10000000]
[248523, 186419, 44187, 46616, 12555, 33134]
[248568, 186430, 44220, 46553, 12565, 33162]
[2, 10]
[2, 0, 1, 0, 0, 0]
[3, 0, 0, 0, 0, 0]
[2, 100]
[16, 0, 4, 0, 2, 0]
[20, 0, 3, 0, 0, 0]
[2, 1000]
[128, 0, 20, 0, 7, 0]
[127, 0, 24, 0, 7, 0]
[2, 10000]
[923, 0, 157, 0, 49, 0]
[925, 0, 171, 0, 46, 0]
[2, 100000]
[7192, 0, 1263, 0, 369, 0]
[7175, 0, 1277, 0, 349, 0]
[2, 1000000]
[58692, 0, 10460, 0, 2985, 0]
[58653, 0, 10416, 0, 2941, 0]
[2, 10000000]
[497234, 0, 88330, 0, 25148, 0]
[496952, 0, 88328, 0, 25133, 0]
[3, 10]
[1, 1, 0, 0, 0, 0]
[1, 1, 0, 0, 0, 0]
[3, 100]
[11, 7, 0, 2, 1, 0]
[10, 9, 0, 2, 1, 0]
[3, 1000]
[77, 52, 0, 14, 5, 0]
[74, 59, 0, 17, 5, 0]
[3, 10000]
[558, 411, 0, 98, 26, 0]
[548, 417, 0, 105, 28, 0]
[3, 100000]
[4315, 3223, 0, 801, 218, 0]
[4292, 3244, 0, 823, 225, 0]
[3, 1000000]
[35332, 26371, 0, 6609, 1778, 0]
[35153, 26468, 0, 6642, 1802, 0]
[3, 10000000]
[298348, 223477, 0, 55966, 15088, 0]
[298133, 223858, 0, 55820, 15049, 0]
[4, 10]
[1, 0, 1, 0, 0, 0]
[2, 0, 0, 0, 0, 0]
[4, 100]
[18, 0, 4, 0, 1, 0]
[17, 0, 3, 0, 2, 0]
[4, 1000]
[125, 0, 24, 0, 7, 0]
[124, 0, 23, 0, 7, 0]
[4, 10000]
[912, 0, 172, 0, 46, 0]
[912, 0, 164, 0, 47, 0]
[4, 100000]
[7180, 0, 1278, 0, 350, 0]
[7140, 0, 1285, 0, 371, 0]
[4, 1000000]
[58726, 0, 10412, 0, 2970, 0]
[58740, 0, 10446, 0, 2948, 0]
[4, 10000000]
[497101, 0, 88323, 0, 25134, 0]
[497077, 0, 88362, 0, 25036, 0]
[5, 10]
[0, 1, 0, 0, 0, 0]
[1, 0, 0, 0, 0, 0]
[5, 100]
[9, 7, 1, 2, 0, 2]
[10, 7, 2, 2, 0, 1]
[5, 1000]
[68, 50, 9, 13, 0, 10]
[69, 45, 11, 15, 0, 9]
[5, 10000]
[484, 361, 89, 90, 0, 63]
[482, 346, 91, 101, 0, 72]
[5, 100000]
[3781, 2843, 672, 690, 0, 508]
[3749, 2808, 691, 730, 0, 512]
[5, 1000000]
[30869, 23210, 5508, 5810, 0, 4111]
[30923, 23143, 5485, 5805, 0, 4120]
[5, 10000000]
[261503, 196366, 46534, 49068, 0, 34816]
[261750, 196082, 46416, 49006, 0, 34889]
[6, 10]
[1, 0, 0, 0, 0, 0]
[1, 0, 0, 0, 0, 0]
[6, 100]
[20, 0, 0, 0, 1, 0]
[21, 0, 0, 0, 1, 0]
[6, 1000]
[147, 0, 0, 0, 7, 0]
[148, 0, 0, 0, 7, 0]
[6, 10000]
[1101, 0, 0, 0, 57, 0]
[1102, 0, 0, 0, 56, 0]
[6, 100000]
[8613, 0, 0, 0, 426, 0]
[8614, 0, 0, 0, 440, 0]
[6, 1000000]
[70401, 0, 0, 0, 3547, 0]
[70404, 0, 0, 0, 3550, 0]
[6, 10000000]
[596439, 0, 0, 0, 30142, 0]
[596499, 0, 0, 0, 30092, 0]
[7, 10]
[0, 0, 0, 0, 0, 0]
[0, 0, 0, 0, 0, 0]
[7, 100]
[7, 6, 3, 3, 1, 1]
[8, 7, 2, 1, 0, 2]
[7, 1000]
[65, 47, 12, 11, 3, 9]
[60, 48, 12, 14, 5, 7]
[7, 10000]
[477, 351, 81, 92, 23, 67]
[466, 355, 81, 89, 27, 62]
[7, 100000]
[3694, 2725, 654, 685, 180, 501]
[3675, 2772, 643, 698, 185, 501]
[7, 1000000]
[30131, 22492, 5363, 5622, 1519, 3994]
[30007, 22637, 5333, 5655, 1512, 4036]
[7, 10000000]
[254528, 190900, 45435, 47676, 12918, 33828]
[254552, 190999, 45161, 47761, 12901, 33971]
[8, 10]
[0, 0, 0, 0, 0, 0]
[0, 0, 0, 0, 0, 0]
[8, 100]
[15, 0, 2, 0, 2, 0]
[16, 0, 3, 0, 1, 0]
[8, 1000]
[118, 0, 23, 0, 7, 0]
[124, 0, 24, 0, 7, 0]
[8, 10000]
[920, 0, 160, 0, 44, 0]
[916, 0, 160, 0, 50, 0]
[8, 100000]
[7159, 0, 1267, 0, 355, 0]
[7181, 0, 1281, 0, 374, 0]
[8, 1000000]
[58765, 0, 10403, 0, 2945, 0]
[58709, 0, 10447, 0, 2992, 0]
[8, 10000000]
[496885, 0, 88409, 0, 25124, 0]
[497122, 0, 88356, 0, 25114, 0]
[9, 10]
[0, 0, 0, 0, 0, 0]
[0, 0, 0, 0, 0, 0]
[9, 100]
[8, 9, 0, 2, 1, 0]
[10, 7, 0, 2, 1, 0]
[9, 1000]
[70, 56, 0, 17, 5, 0]
[76, 56, 0, 12, 4, 0]
[9, 10000]
[546, 419, 0, 105, 26, 0]
[554, 408, 0, 99, 27, 0]
[9, 100000]
[4307, 3247, 0, 810, 212, 0]
[4318, 3213, 0, 815, 217, 0]
[9, 1000000]
[35145, 26414, 0, 6610, 1782, 0]
[35312, 26350, 0, 6602, 1783, 0]
[9, 10000000]
[298129, 223569, 0, 55884, 15061, 0]
[298440, 223566, 0, 55863, 14993, 0]


ちなみに、f(n)を列挙するには次のようにすればよい。

require 'prime'

# nを割り切る最大の平方数を探す
def f(n)
  Prime.int_from_prime_division(
    n.prime_division.map{|p, q| [p, q / 2]}
  )
end

p (1..10 ** 3).map{|i| f(i)}

出力結果
[1, 1, 1, 2, 1, 1, 1, 2, 3, 1, 1, 2, 1, 1, 1, 4, 1, 3, 1, 2, 1, 1, 1, 2, 5, 1, 3
, 2, 1, 1, 1, 4, 1, 1, 1, 6, 1, 1, 1, 2, 1, 1, 1, 2, 3, 1, 1, 4, 7, 5, 1, 2, 1,
3, 1, 2, 1, 1, 1, 2, 1, 1, 3, 8, 1, 1, 1, 2, 1, 1, 1, 6, 1, 1, 5, 2, 1, 1, 1, 4,
 9, 1, 1, 2, 1, 1, 1, 2, 1, 3, 1, 2, 1, 1, 1, 4, 1, 7, 3, 10, 1, 1, 1, 2, 1, 1,
1, 6, 1, 1, 1, 4, 1, 1, 1, 2, 3, 1, 1, 2, 11, 1, 1, 2, 5, 3, 1, 8, 1, 1, 1, 2, 1
, 1, 3, 2, 1, 1, 1, 2, 1, 1, 1, 12, 1, 1, 7, 2, 1, 5, 1, 2, 3, 1, 1, 2, 1, 1, 1,
 4, 1, 9, 1, 2, 1, 1, 1, 2, 13, 1, 3, 2, 1, 1, 5, 4, 1, 1, 1, 6, 1, 1, 1, 2, 1,
1, 1, 2, 3, 1, 1, 8, 1, 1, 1, 14, 1, 3, 1, 10, 1, 1, 1, 2, 1, 1, 3, 4, 1, 1, 1,
2, 1, 1, 1, 6, 1, 1, 1, 2, 1, 1, 1, 4, 15, 1, 1, 2, 1, 1, 1, 2, 1, 3, 1, 2, 1, 1
, 1, 4, 1, 11, 9, 2, 7, 1, 1, 2, 1, 5, 1, 6, 1, 1, 1, 16, 1, 1, 1, 2, 3, 1, 1, 2
, 1, 1, 1, 2, 1, 3, 1, 4, 1, 1, 5, 2, 1, 1, 3, 2, 1, 1, 1, 2, 1, 1, 1, 12, 17, 1
, 1, 2, 1, 7, 1, 2, 3, 1, 1, 10, 1, 1, 1, 4, 1, 3, 1, 2, 1, 1, 1, 2, 1, 1, 3, 2,
 1, 1, 1, 8, 1, 1, 1, 18, 5, 1, 1, 2, 1, 1, 1, 2, 3, 1, 1, 4, 1, 13, 1, 2, 1, 3,
 7, 2, 1, 1, 1, 2, 1, 5, 3, 4, 1, 1, 1, 2, 1, 1, 1, 6, 19, 1, 11, 2, 1, 1, 1, 4,
 3, 1, 1, 2, 1, 1, 5, 2, 1, 3, 1, 2, 1, 1, 1, 8, 1, 1, 3, 2, 1, 1, 1, 14, 1, 1,
1, 6, 1, 1, 1, 20, 1, 1, 1, 2, 9, 1, 1, 2, 1, 1, 1, 2, 1, 3, 1, 4, 1, 1, 1, 2, 1
, 1, 3, 2, 5, 1, 1, 2, 1, 1, 1, 12, 1, 1, 1, 2, 1, 1, 1, 2, 21, 1, 1, 2, 1, 1, 1
, 8, 1, 15, 1, 2, 1, 1, 1, 2, 1, 1, 3, 2, 1, 1, 1, 4, 1, 1, 1, 6, 1, 1, 1, 2, 1,
 1, 5, 2, 3, 1, 1, 4, 1, 1, 1, 22, 1, 9, 1, 2, 1, 7, 1, 2, 1, 1, 3, 4, 1, 1, 1,
10, 1, 1, 1, 6, 1, 1, 13, 2, 1, 1, 1, 16, 3, 1, 1, 2, 1, 1, 1, 2, 1, 3, 1, 2, 5,
 1, 1, 4, 23, 1, 3, 2, 1, 1, 1, 2, 1, 1, 7, 6, 1, 1, 1, 4, 1, 1, 1, 2, 3, 5, 1,
2, 1, 1, 1, 2, 1, 3, 1, 4, 1, 1, 1, 2, 1, 1, 9, 2, 1, 1, 1, 2, 1, 1, 5, 24, 1, 1
7, 1, 2, 1, 1, 1, 2, 3, 1, 1, 14, 1, 1, 1, 4, 1, 3, 1, 2, 1, 1, 1, 10, 1, 1, 3,
2, 11, 1, 1, 4, 1, 1, 1, 6, 1, 1, 1, 2, 1, 1, 1, 2, 3, 1, 1, 4, 25, 1, 1, 2, 1,
3, 1, 2, 1, 1, 1, 2, 7, 1, 3, 8, 1, 1, 1, 2, 1, 1, 1, 18, 1, 5, 1, 2, 1, 1, 1, 4
, 3, 1, 1, 2, 1, 1, 1, 2, 1, 3, 1, 2, 1, 1, 1, 4, 1, 1, 15, 26, 1, 1, 1, 2, 1, 1
, 1, 6, 1, 7, 1, 4, 1, 1, 1, 2, 3, 1, 1, 2, 1, 1, 1, 10, 1, 3, 1, 8, 1, 1, 1, 2,
 1, 1, 3, 2, 1, 1, 1, 2, 1, 1, 1, 12, 1, 19, 1, 2, 5, 11, 1, 2, 27, 1, 1, 2, 1,
1, 7, 4, 1, 3, 1, 2, 1, 1, 1, 2, 1, 1, 3, 2, 1, 5, 1, 4, 1, 1, 1, 6, 1, 1, 1, 2,
 1, 1, 1, 2, 3, 1, 1, 16, 1, 1, 1, 2, 1, 3, 5, 2, 1, 1, 1, 2, 1, 1, 3, 28, 1, 1,
 1, 2, 1, 1, 1, 6, 1, 1, 1, 2, 1, 1, 1, 20, 3, 1, 1, 2, 1, 1, 1, 2, 1, 9, 1, 2,
1, 1, 1, 4, 1, 1, 3, 2, 1, 1, 1, 2, 5, 1, 1, 6, 1, 1, 1, 8, 7, 1, 1, 2, 3, 1, 1,
 2, 29, 1, 1, 2, 13, 3, 11, 4, 1, 5, 1, 2, 1, 1, 3, 2, 1, 1, 1, 2, 1, 1, 1, 12,
1, 1, 17, 2, 1, 1, 1, 2, 3, 1, 5, 2, 1, 1, 1, 4, 1, 21, 1, 2, 1, 1, 1, 2, 1, 1,
9, 2, 1, 1, 1, 8, 1, 1, 1, 30, 1, 1, 1, 2, 1, 1, 1, 2, 3, 1, 1, 4, 1, 1, 1, 2, 1
, 3, 1, 2, 1, 1, 1, 2, 5, 1, 3, 4, 1, 1, 7, 2, 1, 1, 1, 6, 1, 1, 1, 2, 1, 1, 1,
4, 3, 1, 1, 2, 1, 5, 1, 2, 1, 3, 1, 2, 1, 1, 1, 8, 31, 1, 3, 2, 1, 1, 1, 22, 1,
1, 1, 18, 1, 1, 5, 4, 1, 1, 1, 14, 3, 1, 1, 2, 1, 1, 1, 2, 1, 3, 1, 4, 1, 1, 1,
2, 1, 1, 3, 10]

平方因子を持たないとき、f(n) = 1 となっている。
n が平方数のとき、f(n) = √n となる。

150614

Ruby


Dirichlet's theorem on arithmetic progressions(1)

昨日ウィキで上記記事を見ていたとき、
以下の予想が思い浮かぶ。

まず予想を述べる前に実験してみる。

2 = 3 × 1^2 - 1 = 1 × 1^2 + 1,
3 = 1 × 2^2 - 1 = 2 × 1^2 + 1,
5 = 6 × 1^2 - 1 = 1 × 2^2 + 1,
7 = 2 × 2^2 - 1 = 6 × 1^2 + 1,
11 = 3 × 2^2 - 1 = 10 × 1^2 + 1,
13 = 14 × 1^2 - 1 = 3 × 2^2 + 1,
17 = 2 × 3^2 - 1 = 1 × 4^2 + 1,
19 = 5 × 2^2 - 1 = 2 × 3^2 + 1
(赤文字はなるべく大きな数字になるようにする。)

さて、N = 20以下の素数について上記変形をしたところ、
「 - 1」の方は、1が3個、2が4個、3が1個現れ、
「 + 1」の方は、1が4個、2が2個、3が1個、4が1個現れる。

N を増やすとどうなるか調べるために、以下を実行。

require 'prime'

# nを割り切る最大の平方数を探す
def f(n)
  i = Math.sqrt(n).to_i
  while n % (i * i) > 0
    i -= 1
  end
  i
end

(1..7).each{|i|
  h1 = {}
  h2 = {}
  cnt = 0
  Prime.each(10 ** i){|n|
    l = f(n + 1)
    m = f(n - 1)
    h1.key?(l) ? h1[l] += 1 : h1[l] = 1
    h2.key?(m) ? h2[m] += 1 : h2[m] = 1
    cnt += 1
  }
  # h1, h2 を全部出力させると見にくいので、一部を出力
  p 10 ** i
  p (1..6).map{|j| h1[j] == nil ? 0 : h1[j]}
  p (1..6).map{|j| h2[j] == nil ? 0 : h2[j]}
  p (1..6).map{|j| h1[j] == nil ? 0 : h1[j] / (cnt + 0.0)}
  p (1..6).map{|j| h2[j] == nil ? 0 : h2[j] / (cnt + 0.0)}
}

出力結果
10
[2, 2, 0, 0, 0, 0]
[3, 1, 0, 0, 0, 0]
[0.5, 0.5, 0, 0, 0, 0]
[0.75, 0.25, 0, 0, 0, 0]
100
[8, 9, 3, 3, 0, 1]
[13, 7, 1, 2, 0, 2]
[0.32, 0.36, 0.12, 0.12, 0, 0.04]
[0.52, 0.28, 0.04, 0.08, 0, 0.08]
1000
[59, 52, 12, 13, 2, 9]
[68, 46, 11, 11, 3, 10]
[0.35119047619047616, 0.30952380952380953, 0.07142857142857142, 0.07738095238095
238, 0.011904761904761904, 0.05357142857142857]
[0.40476190476190477, 0.27380952380952384, 0.06547619047619048, 0.06547619047619
048, 0.017857142857142856, 0.05952380952380952]
10000
[462, 343, 83, 92, 24, 61]
[467, 350, 82, 84, 28, 62]
[0.37591537835638733, 0.2790886899918633, 0.06753458096013018, 0.074857607811228
65, 0.01952807160292921, 0.04963384865744508]
[0.3799837266069976, 0.2847843775427177, 0.06672091131000814, 0.0683482506102522
4, 0.022782750203417412, 0.05044751830756713]
100000
[3573, 2703, 655, 673, 164, 477]
[3599, 2688, 636, 672, 195, 479]
[0.3724979149291076, 0.2817973311092577, 0.0682860717264387, 0.07016263552960801
, 0.017097581317764805, 0.04972894078398665]
[0.37520850708924103, 0.28023352793994993, 0.06630525437864887, 0.07005838198498
748, 0.020329441201000834, 0.04993744787322769]
1000000
[29290, 22002, 5205, 5507, 1482, 3954]
[29397, 22055, 5238, 5475, 1500, 3903]
[0.3731305256184871, 0.2802873958572193, 0.06630742184514254, 0.0701546536217483
3, 0.018879461897118397, 0.05037071008178552]
[0.3744936176717878, 0.2809625722948355, 0.06672781472139418, 0.0697469999235649
4, 0.019108767102346557, 0.049721012000305743]
10000000
[248523, 186419, 44187, 46616, 12555, 33134]
[248568, 186430, 44220, 46553, 12565, 33162]
[0.3739555417790812, 0.2805069073804619, 0.06648870939346564, 0.070143654855179,
 0.018891659230881507, 0.049857127595063944]
[0.37402325381933527, 0.28052345921252403, 0.06653836488965195, 0.07004885799882
332, 0.01890670635093796, 0.04989925953122202]

このように N を増えるにつれ、
「 - 1」の方に現れる赤文字の分布と、
「 + 1」の方に現れる赤文字の分布が似てくる。

予想
N → ∞ とすると、
「 - 1」の方に現れる赤文字の分布と
「 + 1」の方に現れる赤文字の分布が一致する。