多角数
著者:梅谷 武
語句:フェルマー,メルセンヌ,ガウス,ウェアリング,ラグランジュ,コーシー,整数論,多角数,三角数,四角数,平方数,五角数,六角数
語句:フェルマー,メルセンヌ,ガウス,ウェアリング,ラグランジュ,コーシー,整数論,多角数,三角数,四角数,平方数,五角数,六角数
多角数と整数の三角数分解。
作成:2006-04-19
更新:2021-03-17
更新:2021-03-17
2以上の数kに対して、初項1、公差k-2の等差数列を考えます。
この第n項までの和をn次のk角数と呼び、pk(n)と書くことにします。等差数列の和の公式から次の公式が導かれます。
このような数を総称して多角数たかくすう, polygonal numberといいます。多角数という名前はこれらが小石を図のように並べることで得られることから付けられました。
1, 1+(k-2), 1+2(k-2), ⋯, 1+(n-1)(k-2), ⋯ |
(1.1) |
|
|
| ||||
|
|
p2(n) = n |
p3(n) = Δn |
p4(n) = n2 = Δn + Δn-1 |
p5(n) = n2 + |
| = n2 + Δn-1 |
p6(n) = |
| = Δ2n-1 |
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次方程式の公式を利用します。(実数や代数方程式の解法は続巻の『代数学事始』で基礎から解説される予定です。)
をnに関する2次方程式と考えるとその正数解は次のようになります。
この小数点以下を切り捨てた正整数をnとおくとΔnが求めるものとなります。これを使って次のような算法をプログラミングしてみます。
a= |
|
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
人 物
フェルマー 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.