多角数
著者:梅谷 武
語句:フェルマー,メルセンヌ,ガウス,ウェアリング,ラグランジュ,コーシー,整数論,多角数,三角数,四角数,平方数,五角数,六角数
多角数と整数の三角数分解。
作成:2006-04-19
更新:2021-03-17
2以上の数kに対して、初項1、公差k-2の等差数列を考えます。
1, 1+(k-2), 1+2(k-2), ⋯, 1+(n-1)(k-2), ⋯
この第n項までの和をn次のk角数と呼び、pk(n)と書くことにします。等差数列の和の公式から次の公式が導かれます。
(1.1)
pk(n)
=
n + (k-2)Δn-1
=
(k-2)n2 - (k-4)n
2
このような数を総称して多角数たかくすう, polygonal numberといいます。多角数という名前はこれらが小石を図のように並べることで得られることから付けられました。
図1.7.2 多角数
多角数
二角数とは自然数のことです。
p2(n) = n
三角数さんかくすう, triangular numberはすでに述べたものと一致します。
p3(n) = Δn
四角数しかくすう, square number平方数へいほうすう, square numberと一致します。
p4(n) = n2 = Δn + Δn-1
五角数ごかくすう, pentagonal numberは三角数と四角数の和として表すことができます。
p5(n) = n2 +
n(n-1)
2
= n2 + Δn-1
六角数ろっかくすう, hexagonal numberは三角数として表すことができます。
p6(n) =
2n(2n-1)
2
= Δ2n-1
このように見てきますと、どの数も三角数の和で表されていることに気が付きます。試しに1から20までの数を三角数で表してみることにしましょう。
  1 = 1
  2 = 1 + 1
  3 = 3
  4 = 3 + 1
  5 = 3 + 1 + 1
  6 = 6
  7 = 6 + 1
  8 = 6 + 1 + 1
  9 = 6 + 3
  10 = 10
  11 = 10 + 1
  12 = 10 + 1 + 1
  13 = 10 + 3 + 1
  14 = 10 + 3 + 1
  15 = 15
  16 = 15 + 1
  17 = 15 + 1 + 1
  18 = 15 + 3
  19 = 15 + 3 + 1
  20 = 10 + 10
どの数も3個以下の三角数で表すことができますし、この先も同じように3個以下の三角数で表すことができるようにも思われます。この事実にはフェルマーFermat, Pierre de, 1608-1665が気が付いていて、1636年のメルセンヌMersenne, Marin, 1588-1648宛書簡で「任意の正整数は高々n個のn角数の和として書き表される」と主張しています。n=3の場合、「任意の正整数は高々3個の三角数の和として書き表される」ということになりますが、これはガウスGauss, Johann Carl Friedrich, 1777-1855が1801年に出版した『整数論Disquisitiones Arithmeticae』の中で証明しています。
n=4の場合はウェアリングWaring, Edward, 1734-1798が1770年に予想した、任意の正整数は4個の平方数の和、9個の立方数の和、19個の四乗数の和で表される等々という「ウェアリングの問題」と呼ばれているものと重なります。これは1772年にラグランジュLagrange, Joseph-Louis, 1736-1813によって証明が与えられています。n ≧ 5の場合は1813年にコーシーCauchy, Augustin Louis, 1789-1857によって解決されました。
 「任意の正整数は高々3個の三角数の和として書き表される」ことのガウスの証明は三元二次形式の理論を応用したもので、今の段階ではまだ解説することができません。この節では計算機を使って数を三角数に分解する実験を行ってみましょう。
 まず、任意の正整数aを与えたときにそれを超えない最大の三角数Δnを求めることが必要になりますが、これにはプログラムを簡単にするために、まだ導入されていない実数と実数の範囲での2次方程式の公式を利用します。(実数や代数方程式の解法は続巻の『代数学事始』で基礎から解説される予定です。)
a=
n(n+1)
2
nに関する2次方程式と考えるとその正数解は次のようになります。
n =
1 + 1+8a
2
この小数点以下を切り捨てた正整数をnとおくとΔnが求めるものとなります。これを使って次のような算法をプログラミングしてみます。

算法1.7.6 正整数の三角数分解

 任意の正整数aを与えたときにそれを3個以下の三角数の和に分解する。
Step 1. aを超えない最大の三角数d = Δ_nを求める。
Step 2. もしa = dであれば終了する。
Step 3. a - dが2個以下の三角数の和に分解できるかどうか調べる。
Step 4. 分解できれば終了する。
Step 5. nをn-1と置き換え、d = Δ_nを再計算してStep 3.へ。

sample1.7.1.py

import math
 
def SearchDeltaSum2( a, val = [ 0, 0, 0 ] ):
  n1 = int( math.sqrt( 8.0*a + 1.0 ) / 2.0 - 0.5 )
  d1 = ( n1*n1 + n1 ) / 2
  s = a
  if s == d1:
    val[0] = 1
    val[1] = d1
    return
  s = a - d1
  while 1:
    n2 = int( math.sqrt( 8.0*s + 1.0 ) / 2.0 - 0.5 )
    d2 = ( n2*n2 + n2 ) / 2
    if s == d2:
      val[0] = 1
      val[1] = d1
      val[2] = d2
      return
    else:
      n1 = n1 - 1
      if n1 == 0:
        return
      d1 = ( n1*n1 + n1 ) / 2
      s = a - d1
      continue
 
def SearchDeltaSum3( a, val3 = [ 0, 0, 0, 0 ] ):
  val2 = [ 0, 0, 0 ]
  n = int( math.sqrt( 8.0*a + 1.0 ) / 2.0 - 0.5 )
  d = ( n*n + n ) / 2
  if a == d:
    val3[0] = 1
    val3[1] = d
    return
  while 1:
    SearchDeltaSum2( a - d, val2 )
    if val2[0] == 1:
      val3[0] = 1
      val3[1] = d
      val3[2] = val2[1]
      val3[3] = val2[2]
      return
    else:
      n = n - 1
      if n == 0:
        return
      d = ( n*n + n ) / 2
      continue
 
for i in range( 1, 10001 ):
  v = [ 0, 0, 0, 0 ]
  SearchDeltaSum3( i, v )
  if v[0] == 0:
    print '%d can not decomposed.'
    break
  else:
    print '%d = %d + %d + %d' % ( i, v[1], v[2], v[3] )
このプログラムを実行すると10000までは3個以下の三角数の和に分解できることがわかります。

sample1.7.1.pyの実行結果

…
9990 = 9870 + 120 + 0
9991 = 9870 + 120 + 1
9992 = 9730 + 171 + 91
9993 = 9870 + 120 + 3
9994 = 9591 + 325 + 78
9995 = 9730 + 210 + 55
9996 = 9870 + 120 + 6
9997 = 9870 + 91 + 36
9998 = 9730 + 253 + 15
9999 = 9180 + 741 + 78
10000 = 9870 + 120 + 10

sample1.7.1.rb

include Math
 
def SearchDeltaSum2(a, val = [0, 0, 0])
  n1 = (sqrt(8.0*a + 1.0) / 2.0 - 0.5).to_i
  d1 = (n1*n1 + n1) / 2
  s = a
  if s == d1
    val[0] = 1
    val[1] = d1
    return
  end
  s = a - d1
  while 1
    n2 = (sqrt(8.0*s + 1.0) / 2.0 - 0.5).to_i
    d2 = (n2*n2 + n2) / 2
    if s == d2
      val[0] = 1
      val[1] = d1
      val[2] = d2
      return
    else
      n1 = n1 - 1
      if n1 == 0
        return
      end
      d1 = (n1*n1 + n1) / 2
      s = a - d1
    end
  end
end
 
def SearchDeltaSum3(a, val3 = [0, 0, 0, 0])
  val2 = [0, 0, 0]
  n = (sqrt(8.0*a + 1.0) / 2.0 - 0.5).to_i
  d = (n*n + n) / 2
  if a == d
    val3[0] = 1
    val3[1] = d
    return
  end
  while 1
    SearchDeltaSum2(a - d, val2)
    if val2[0] == 1
      val3[0] = 1
      val3[1] = d
      val3[2] = val2[1]
      val3[3] = val2[2]
      return
    else
      n = n - 1
      if n == 0
        return
      end
      d = (n*n + n) / 2
    end
  end
end
 
for i in 1..10000
  v = [0, 0, 0, 0]
  SearchDeltaSum3(i, v)
  if v[0] == 0
    print "%d can not decomposed.\n", i
    break
  else
    printf "%d = %d + %d + %d\n", i, v[1], v[2], v[3]
  end
end

sample1.7.1.rbの実行結果

…
9990 = 9870 + 120 + 0
9991 = 9870 + 120 + 1
9992 = 9730 + 171 + 91
9993 = 9870 + 120 + 3
9994 = 9591 + 325 + 78
9995 = 9730 + 210 + 55
9996 = 9870 + 120 + 6
9997 = 9870 + 91 + 36
9998 = 9730 + 253 + 15
9999 = 9180 + 741 + 78
10000 = 9870 + 120 + 10
[1] カール・フリードリヒ ガウス, ガウス 整数論, 朝倉書店, 1995
img
 
 
[2] ア・ヤ ヒンチン, 数論の3つの真珠, 日本評論社, 2000
img
 
 
[3] アンドレ ヴェイユ, 数論―歴史からのアプローチ, 日本評論社, 1987
img
 
 
人  物
フェルマー Fermat, Pierre de, 1608-1665
フランスの法律家。30歳頃にディオファントス「数論」の注釈本を入手して以来、数学に傾倒し、後に有名になる48の書き込みを残す。
メルセンヌ Mersenne, Marin, 1588-1648
フランスの僧侶。数学や物理を研究し、パリの修道院で科学に関する議論の場を提供する。これが後のパリ科学アカデミー(1666年創立)となる。
ガウス Gauss, Johann Carl Friedrich, 1777-1855
ドイツの大数学者。さまざまな分野に膨大な業績を残す。
ウェアリング Waring, Edward, 1734-1798
イギリスの医師、数学者。数論・代数。
ラグランジュ Lagrange, Joseph-Louis, 1736-1813
イタリアの数学者。解析学・解析力学・数論。
コーシー Cauchy, Augustin Louis, 1789-1857
フランスの数学者。少年時代にラグランジュの指導を受ける。収束級数論・複素関数論・微分方程式論。
 
物  品
整数論 Disquisitiones Arithmeticae
高瀬正仁訳, 『ガウス整数論』, 朝倉書店, 1995
 
数  学
多角数 たかくすう, polygonal number
多角数はピュタゴラス派によって研究されていたことがわかっている。
三角数 さんかくすう, triangular number
四角数 しかくすう, square number
平方数 へいほうすう, square number
五角数 ごかくすう, pentagonal number
六角数 ろっかくすう, hexagonal number
 
Published by SANENSYA Co.,Ltd.