東京都 足立区立郷土博物館 嘉永7年(1854)
ADACHI CITY MUSEUM 足立区立郷土博物館 収蔵資料データベース
https://jmapps.ne.jp/adachitokyo/det.html?data_id=14948
東京都 須賀家 嘉永7年(1854)
和算の館
http://www.wasan.jp/tokyo/suga.html
東京都 実相院
みんなで翻刻
https://app.honkoku.org/transcription/6e12ebdc936a3cecf53e1638fab6c581/1
キーワード:累円,帯直円
#Julia #SymPy #算額 #和算 #数学
注1:「和算の館」では,「須賀家」の項に掲載されている。「みんなで翻刻」では,所在は「実相院」となっている。現在は「足立区立郷土博物館」に所蔵されているようである。
帯直円の中に甲円 4 個,および,累円を隔てて乙円 2 個を容れる。累円の個数にはかかわらず,末円の直径と甲円の直径が与えられたとき,乙円の直径はいかほどか。
注2:明記されていないが,乙円は右側の甲円に外接し,帯直円の半円に内接し \(x\) 軸を隔てて互いに外接している。このことは,実際に乙円の直径を計算することで確認できる。

1. 準備
帯直円の中心を原点とする。
甲円の半径を \(r_0 = 1\) とする。甲円の大きさの異なる図はすべて相似なので,一般性を失わない。
甲円は互いに外接するので,右側の甲円の中心座標は \( (\sqrt{3}r_0,\ 0)\) である。
甲円の半径と中心座標を \(r_0,\ (0,\ r_0),\ (\sqrt{3}r_0,\ 0)\) とする。
帯直円を構成する半円の半径と中心座標を \(R,\ (x,\ 0)\)
\(R = 2r_0,\ x = (\sqrt{3} - 1)r_0\) とする。
初円の半径と中心座標を \(r_1,\ (x_1,\ y_1)\)
二円の半径と中心座標を \(r_2,\ (x_2,\ y_2)\)
とする。以下同様。
最後の累円の右側に \(x\) 軸に垂直な接線を引き,この接線の右側に接線と \(x\) 軸に外接し,右の甲円に内接する乙円を描く。
乙円の半径と中心座標を \(r_{99},\ (x_{99},\ 0)\) とする。
\(x_{99}\) は,「末円の中心の \(x\) 座標 + 末円の半径 + 乙円の半径」である。
include("julia-source.txt"); # julia-source.txt ソース
using SymPy
@syms R, r0, r1, x1, y1
r0 = 1
R = 2r0
x = (√Sym(3) - 1)r0;
(R, x, r0)
(2, -1 + sqrt(3), 1)
2. 初円の決定 \(x_1,\ y_1,\ r_1\)
初円は,上の甲円と右の甲円に外接し,帯直円を構成する半円に内接するという 3 つの接触条件 eq1, eq2, eq3 を満たすものである
結果は解析解として求めたが,これ以降は解析解を求めるのが困難になるので,実際は数値解に基づいて計算を進める。
eq1 = x1^2 + (y1 - r0)^2 - (r0 + r1)^2
eq2 = (x1 - √Sym(3)r0)^2 + y1^2 - (r0 + r1)^2
eq3 = (x1 - x)^2 + y1^2 - (R - r1)^2
res = solve([eq1, eq2, eq3], (r1, x1, y1))[1] # 1 of 2
(-4*sqrt(sqrt(3) + 2)/35 + 6*sqrt(3)/35 + 13/35, -4/35 + 12*sqrt(sqrt(3) + 2)/35 + 17*sqrt(3)/35, -4*sqrt(3)/35 + 16/35 + 12*sqrt(3)*sqrt(sqrt(3) + 2)/35)
(r1, x1, y1) = (-4*sqrt(sqrt(3) + 2)/35 + 6*sqrt(3)/35 + 13/35, -4/35 + 12*sqrt(sqrt(3) + 2)/35 + 17*sqrt(3)/35, -4*sqrt(3)/35 + 16/35 + 12*sqrt(3)*sqrt(sqrt(3) + 2)/35)
(0.44756852100287764, 1.3893452445602443, 1.4064165528325505)
3. 二円の決定
二円は,初円と右側の甲円に外接し,帯直円を構成する半円に内接するという 3 つの接触条件 eq4, eq5, eq6 を満たすものである。
接触する初円のパラメータは前段で決定されたものを引き継ぐ。
二円の接触条件は,初円の接触条件 eq1, eq2, eq3 における添字の 1 が 2 になっているだけではないことに注意が必要である。
(r1, x1, y1) = (0.44756852100287764, 1.3893452445602443, 1.4064165528325505)
@syms r2, x2, y2
eq4 = (x2 - x1)^2 + (y2 - y1)^2 - (r2 + r1)^2
eq5 = (x2 - √3r0)^2 + y2^2 - (r0 + r2)^2
eq6 = (x2 - x)^2 + y2^2 - (R - r2)^2
res2 = solve([eq4, eq5, eq6], (r2, x2, y2))[1] # 1 of 2
(0.232262716345949, 2.03526265853103, 1.19437597745953)
4. 三円以降の決定
三円は,二円と右側の甲円に外接し,帯直円を構成する半円に内接するという 3 つの接触条件 eq7, eq8, eq9 を満たすものである。
この接触条件は,二円の接触条件 eq4, eq5, eq6 の添字を 1 を 2,2 を 3 にしたもの,すなわち漸化式である。
(r2, x2, y2) = (0.232262716345949, 2.03526265853103, 1.19437597745953)
@syms r3, x3, y3
eq7 = (x3 - x2)^2 + (y3 - y2)^2 - (r3 + r2)^2
eq8 = (x3 - √3r0)^2 + y3^2 - (r0 + r3)^2
eq9 = (x3 - x)^2 + y3^2 - (R - r3)^2
res3 = solve([eq7, eq8, eq9], (r3, x3, y3))[1] # 1 of 2
(0.135563003339583, 2.32536179755013, 0.968238299036497)
したがって,二円の決定式を関数にすれば,現在注目している累円の次の累円のパラメータを得ることができる。
using SymPy
function nextcircle(r1, x1, y1)
#(arg_r1, arg_x1, arg_y1) = (0.232262716345949, 2.03526265853103, 1.19437597745953)
# println( (arg_r1, arg_x1, arg_y1))
#(r1, x1, y1) = (0.232262716345949, 2.03526265853103, 1.19437597745953)
# println( (r1, x1, y1))
@syms r2, x2, y2
r0 = 1
R = 2r0
x = (√3 - 1)r0
eq4 = (x2 - x1)^2 + (y2 - y1)^2 - (r2 + r1)^2
eq5 = (x2 - √3r0)^2 + y2^2 - (r0 + r2)^2
eq6 = (x2 - x)^2 + y2^2 - (R - r2)^2
res = solve([eq4, eq5, eq6], (r2, x2, y2))[1] # 1 of 2
return res
end;
二円のパラメータ (r2, x2, y2) = (0.232262716345949, 2.03526265853103, 1.19437597745953)
をあたえれば,三円のパラメータ (r3, x3, y3) を返す。
三円のパラメータ (r3, x3, y3) をあたえれば,四円のパラメータ (r4, x4, y4) を返す。
以上を繰り返すので,for ループで簡単に累円のパラメータを求めることができる。
注:初円と二円のパラメータはこの関数の生成規則に従わない。
初円のパラメータ: (0.44756852100287764, 1.3893452445602443, 1.4064165528325505)
二円のパラメータ: (0.232262716345949, 2.03526265853103, 1.19437597745953)
(r2, x2, y2) = (0.232262716345949, 2.03526265853103, 1.19437597745953)
for i = 1:10
(r3, x3, y3) = nextcircle(r2, x2, y2) # 次世代の円のパラメータ
println( (r3, x3, y3))
(r2, x2, y2) = (r3, x3, y3) # 世代交代
end
(0.135563003339583, 2.32536179755013, 0.968238299036497)
(0.0873528877224219, 2.46999214440161, 0.798610597119657)
(0.0605363776646687, 2.55044167457487, 0.674517455038254)
(0.0442670465501172, 2.59924966791852, 0.581772980739726)
(0.0337139160790343, 2.63090905933177, 0.510507887826634)
(0.0265023403441316, 2.65254378653648, 0.454312370955639)
(0.0213658361693979, 2.66795329906068, 0.408992295420652)
(0.0175824590554639, 2.67930343040248, 0.371734487924144)
(0.0147175610817898, 2.68789812432350, 0.340598936904917)
(0.0124973107388075, 2.69455887535245, 0.314211749788025)
4. 末円と乙円の関係
算題に「累円の個数にかかわらず」とあることから,既述の円のどれも末円として以下が成り立つ。
注2 に「明記されていないが,乙円は右側の甲円に外接し,帯直円の半円に内接し \(x\) 軸を隔てて互いに外接している。」と書いた。
既述のとおり,最後の累円の右側に \(x\) 軸に垂直な接線を引き,この接線の右側に接線と \(x\) 軸に外接し,右の甲円に内接する乙円を描く。
乙円の半径と中心座標を \(r_{99},\ (x_{99},\ y_{99})\) とする。
\(x_{99}\) は,「末円の中心の \(x\) 座標 + 末円の半径 + 乙円の半径」
\(y_{99} = r_{99}\)である。
末円の半径と中心座標を \(r_9,\ (x_9,\ y_9)\) とすれば,乙円が右の甲円に内接することは eq99 で表される。
四円が末円の場合を考える。
function getparameter(r9, x9)
@syms r99, x99, y99
r0 = 1
R = 2r0
x99 = x9 + r9 + r99
y99 = r99
eq99 = (x99 - √Sym(3)r0)^2 + r99^2 - (r0 - r99)^2
ans_r99 = float(solve(eq99, r99)[2])
end;
getparameter(0.0873528877224219, 2.46999214440161)
0.08535709086331093
術は,
\(子 = 甲円径 - 末円径\)
\(乙円径 = (\sqrt{子\cdot 甲円径}) - 子)\cdot 2\)
である。
子 = 1 - 0.0873528877224219
0.9126471122775781
乙円径 = (sqrt(0.9126471122775781) - 0.9126471122775781)*2
0.08535709086330923
完全に等しくはないが,演算誤差の範囲内かとも思われる。
この関係は,どれを末円としても成り立つ。
しかし,課題は,累円のパラメータ(\(r_i,\ x_i\))から,いかにしてこの術を導き出すかである。
単純な比例関係でないことは明らかである。
rxy = [
0.44756852100287764 1.3893452445602443 1.4064165528325505
0.232262716345949 2.03526265853103 1.19437597745953
0.135563003339583 2.32536179755013 0.968238299036497
0.0873528877224219 2.46999214440161 0.798610597119657
0.0605363776646687 2.55044167457487 0.674517455038254
0.0442670465501172 2.59924966791852 0.581772980739726
0.0337139160790343 2.63090905933177 0.510507887826634
0.0265023403441316 2.65254378653648 0.454312370955639
0.0213658361693979 2.66795329906068 0.408992295420652
0.0175824590554639 2.67930343040248 0.371734487924144
0.0147175610817898 2.68789812432350 0.340598936904917
0.0124973107388075 2.69455887535245 0.314211749788025
];
r0 = 1
for i = 1:12
(r9, x9) = (rxy[i, 1], rxy[i, 2])
r99 = getparameter(r9, x9)
子 = r0 - r9
術 = (sqrt(子*r0) - 子)*2
println( (i, r99, 術, abs(r99 - 術)/術 < 1e-12))
end
(1, 0.38165172945034676, 0.3816517294503461, true)
(2, 0.21693780842319343, 0.21693780842319366, true)
(3, 0.13062808697960768, 0.13062808697960704, true)
(4, 0.08535709086331093, 0.08535709086330923, true)
(5, 0.0595913880335281, 0.05959138803352815, true)
(6, 0.04376600103328998, 0.04376600103328854, true)
(7, 0.03342486564613559, 0.03342486564613134, true)
(8, 0.026324380742839142, 0.02632438074283705, true)
(9, 0.02125047571732607, 0.0212504757173253, true)
(10, 0.017504486342910363, 0.01750448634290569, true)
(11, 0.014663007236942143, 0.014663007236938252, true)
(12, 0.012458019139261128, 0.012458019139260035, true)
5. CatGPT による解説
提示された術は,**累円の半径だけから出る**と整理できます。鍵は,各累円が「半径 \(2\) の帯直円の半円」と「半径 \(1\) の右の甲円」の両方に接していることです。投稿の数値例と式は,この配置では整合しています。
半径を \(r_0=1\) とし,帯直円をつくる半円の中心を \(A=(\sqrt3-1,0)\),右の甲円の中心を \(C=(\sqrt3,0)\) とします。2つの中心の距離は \(1\) です。両方に接する末円の中心を \(P=(x,y)\),半径を \(r\) とすれば,
$
|P-A|=2-r,\qquad |P-C|=1+r.
$
この2式を二乗して引くと,
$
x=2-3r.
$
したがって,末円の右端の \(x\) 座標は \(x+r=2-2r\) です。末円の右端に引いた垂直接線の右側に半径 \(s\) の乙円を置くと,その中心は \( (x+r+s,s)\)。右の甲円に接する条件は
$
(x+r+s-\sqrt3)^2+s^2=(1+s)^2.
$
先ほどの \(x=2-3r\) を代入して正の解を取れば,
$
s=2\left(\sqrt{1-r}-(1-r)\right).
$
径で書き直すと,
$
\text{子}=2-2r=\text{甲円径}-\text{末円径},
$
$
\text{乙円径}=2s
=2\bigl(\sqrt{\text{子}\cdot 2}-\text{子}\bigr),
$
となり,術と一致します。半径を \(r_0\) に戻すと,\(\text{乙円径}=2(\sqrt{\text{子}\cdot\text{甲円径}}-\text{子})\) です。
なお,この導出で円列の個数や,末円が何番目かは使っていません。必要なのは,選んだ末円が2つの固定円に接していることと,乙円を指定の垂直接線・\(x\) 軸・右の甲円に接する位置に置くことです。そのため「どれを末円としても成り立つ」という観察も説明できます。
以上
描画関数プログラムのソースを見る
function draw(r1, more=false)
pyplot(size=(600, 600), grid=false, aspectratio=1, showaxis=false, label="", fontfamily="IPAexMincho")
R = 2r1
x = (√3 - 1)r1
(r1, x1, y1) = (0.44756852100287764, 1.3893452445602443, 1.4064165528325505)
(r2, x2, y2) = (0.232262716345949, 2.03526265853103, 1.19437597745953)
(r3, x3, y3) = (0.135563003339583, 2.32536179755013, 0.968238299036497)
(r4, x4, y4) = (0.0873528877224219, 2.46999214440161, 0.798610597119657)
r99 = 0.0853570908633109
x0 = x4 + r4
y0 = sqrt(R^2 - (x0 - x)^2)
plot()
rect(-x, -R, x, R, :black)
circle(x, 0, R, beginangle=-90, endangle=90)
circle(-x, 0, R, beginangle=90, endangle=270)
circle22(0, r0, r0, :purple)
circle2(√3r0, 0, r0, :purple)
circle4(x1, y1, r1, :orange)
circle4(x2, y2, r2, :orange)
circle4(x3, y3, r3, :orange)
circle4(x4, y4, r4, :orange)
circle22f(x4 + r4 + r99, r99, r99, :blue)
segment(x0, -y0, x0, y0, :black)
if more
delta = (fontheight = (ylims()[2]- ylims()[1]) / 500 * 10 * 2) /3 # size[2] * fontsize * 2
hline!([0], color=:gray80, lw=0.5)
vline!([0], color=:gray80, lw=0.5)
point(0, r0, "甲円:r0,(0,r0)", :purple, :center, delta=-delta)
point(√3r0, 0, "甲円:r0,(√3r0,0)", :purple, :center, delta=-delta)
point(x, 0, " 半円:R,(x,0)", :red, :left, :bottom, delta=delta/2)
point(x1, y1, "初円:r1\n(x1,y1)", :orange, :center, :bottom, delta=delta/2)
point(x2, y2, " 二円:r2,(x2,y2)", :orange, :left, :bottom, delta=delta/2, deltax=r2)
point(x3, y3, " 三円:r3,(x3,y3)", :orange, :left, :bottom, delta=delta/2, deltax=r3)
point(x4, y4, " 四円:r4,(x4,y4)", :orange, :left, :bottom, delta=delta/2, deltax=r4)
point(x0+r99, r99, " 乙円:r99,(x0+r99,r99)", :blue, :left, :vcenter, deltax=r99)
point(x0, 0, "(x0,0) ", :black, :right, :bottom, delta=delta/2)
point(0, 0, "(0,0) ", :black, :center, delta=-delta)
point(0, R, "(0,R) ", :black, :center, :bottom, delta=delta/2)
adjust_xlims!(0, right=30delta)
end
end;
draw(1, true)
「算額あれこれ」の全ページの索引
以下のアイコンをクリックして応援してください