裏 RjpWiki

Julia ときどき R, Python によるコンピュータプログラム,コンピュータ・サイエンス,統計学

算額(その1549)

2025年01月18日 | Julia

算額(その1549)

百三 群馬県高崎市八幡町 八幡宮 安政7年(1860)
群馬県和算研究会:群馬の算額,上武印刷株式会社,高崎市,1987年3月31日.
キーワード:数列,部分和
#Julia, #SymPy, #算額, #和算,#数学

逐増する「平方垜」がある,第 1 項(底子 1)では 1 個,第 2 項までの合計は 6 個(5 個増えたことになる。この増え方が平方垜になる),第 3 項までの合計は 20個(14 個増えたことになる)であるとき,第 n 項までの合計は何個か。

注:垜(だ)とは,球,土嚢などを一番下から順次規則的に積み上げた構造物である。

規則はいろいろあるが
1. 三角数の積み上げ
三角数は、上から順に**1、2、3…**と増加する層で構成される。Tn = n(n + 1)/2
2. 四角数の積み上げ
四角数は正方形の形を形成する。Qn = n^2
3. 五角数の積み上げ
五角数は星型や角形を意識した積み方Pn = n(3n - 1)/2
4. 六角数(蜂の巣型) Hn = n(2n - 1)
など

平方垜は四角数の積み上げと思いきや,合計が 1, 6, 20, ... となり,差分が(問題文にもあるが)5, 14 となる。例が少ないが前を補うと 0, 1, 5, 14, ... で,更に差分を取ると 1, 4, 9, ...となるこれは平方数の数列であろうと推測できる。
当時の人は,平方垜といえばすぐにこの数列を書き下せるほど,常識だったのであろう。
ひとまずその仮定に基づくと,平方垜の第 n 項までの合計の数列は,
0, 1, 6, 20, 50, 105, ... 合計
0, 1, 5, 14, 30, 55, ... 各段の個数
  1, 4, 9, 16, 25, ... 差分

オンライン整数列大辞典」を参照すれば以下のものが見つかる。
A002415 4-dimensional pyramidal numbers: a(n) = n^2*(n^2-1)/12.
0, 0, 1, 6, 20, 50, 105, 196, 336, ...
ただし,この数式は n = 0 から始まっているので,その調整をする必要がある。

using SymPy
@syms n
an = n^2*(n^2-1)/12  # A002415
an |> println

    n^2*(n^2 - 1)/12

an(n => n + 1) |> factor|> println  # 項の調整

    n*(n + 1)^2*(n + 2)/12

各項を計算して,推定どおりであることを確認する。

for n = 1:10
    println("n = $n, an = $(n*(n + 1)^2*(n + 2)/12)")
end

    n = 1, an = 1.0
    n = 2, an = 6.0
    n = 3, an = 20.0
    n = 4, an = 50.0
    n = 5, an = 105.0
    n = 6, an = 196.0
    n = 7, an = 336.0
    n = 8, an = 540.0
    n = 9, an = 825.0
    n = 10, an = 1210.0

「術」は n*(n^3 +4n^2 + 5n + 2)/12 であるが,因数分解すると同じであることがわかる。

n*(n^3 +4n^2 + 5n + 2)/12 |> factor |> println

    n*(n + 1)^2*(n + 2)/12


整数列大辞典に見つからないような場合は,以下のように多項式の係数を推定するというアプローチを取る。

using SymPy
@syms a1, a2, a3, a4
f(n) = a1*n + a2*n^2 + a3*n^3 + a4*n^4;
eq1 = f(1) - 1
eq2 = f(2) - 6
eq3 = f(3) - 20
eq4 = f(4) - 50
res = solve([eq1, eq2, eq3, eq4], (a1, a2, a3, a4))
res |> println

    Dict{Sym{PyCall.PyObject}, Sym{PyCall.PyObject}}(a3 => 1/3, a1 => 1/6, a2 => 5/12, a4 => 1/12)

一般項を表す,同じ多項式が得られた。

@syms n
res[a1]*n + res[a2]*n^2 + res[a3]*n^3 + res[a4]*n^4 |> factor |> println


    n*(n + 1)^2*(n + 2)/12


一般項がわかっている場合の和の数列は summatin 関数で求めることができる。

using SymPy
@syms n, m
# 一般項
#    an = n*(n + 1)*(2n + 1)/6
# 和の一般項
summation(n*(n + 1)*(2n + 1)/6, (n, 1, m)) |> factor |> println

    m*(m + 1)^2*(m + 2)/12

 


コメント    この記事についてブログを書く
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする
« 算額(その1548) | トップ | 算額(その1550) »
最新の画像もっと見る

コメントを投稿

ブログ作成者から承認されるまでコメントは反映されません。

Julia」カテゴリの最新記事