算額(その1532)
藤田貞資(1789):神壁算法巻上
http://www.wasan.jp/jinpeki/jinpekisanpo1.pdf
所懸于東都湯嶋天満宮者二事
天明8年戌申二月
中術 關流神谷幸吉定令門人 東都本郷金助町住 矢崎新九郎永維
正六角形の中に 3 本の矢を設け,3 個の正方形を容れる。正六角形の一辺の長さが 1666 寸,矢の長さが,2499 寸のとき,正方形の一辺の長さはいかほどか。
この算題は,算額(その1497),算額(その1462),算額(その1459),算額(その597),算額(その381),算額(その770)のような「多角形の頂点から矢を引き,内部に多角形と相似な多角形を作る」の類題である。基本的な解法は共通している。本問では「正六角形」が表に出ているが,実は「正三角形」に関する問題でもある。
正六角形の一辺の長さを 「六」,正方形の一辺の長さを「四」,矢の長さを「矢」とおく。
三角形 ABC において,BC = a, AC = BD = b, AD = c
∠BAC = 120° で第二余弦定理(eq2),∠ABC = θ で第二余弦定理(eq3)を適用。
また,F は BE 上に,G は AB 上にあり,FH = FG/2 である。
これらの条件を記述する,以下の連立方程式を解く。
include("julia-source.txt")
# julia-source.txt ソース https://blog.goo.ne.jp/r-de-r/e/ad3a427b84bb416c4f5b73089ae813cf
using SymPy
@syms a, b, c, θ, 四, 六, 矢
a = √Sym(3)*六 # 1666
eq1 = b + c - 矢 # 2499
eq2 = b^2 + (b + c)^2 + 2b*(b + c)/2 - a^2
eq3 = a^2 + (b + c)^2 - 2a*(b + c)*cosd(θ) - b^2
eq4 = (tand(Sym(30))*(a/2 - 四/2) + tand(θ)*(a/2 - 四/2)) - 四;
res = solve([eq1, eq2, eq3, eq4], (b, c, θ, 四))[4]; # 2 of 4
#b
res[1] |> factor |> println
(-矢 + sqrt(3)*sqrt(4*六^2 - 矢^2))/2
# c
res[2] |> factor |> println
-(-3*矢 + sqrt(3)*sqrt(4*六^2 - 矢^2))/2
# θ
res[3] |> println
180*acos((sqrt(3)*矢 + sqrt(4*六^2 - 矢^2))/(4*六))/pi
一般解は複雑であるが,共通項を含むので,以下のように一時変数を用いれば,若干簡単になる。
# 四
s = √3矢 + sqrt(4六^2 - 矢^2)
t = sqrt((16六^2 - s^2)/六^2)
四 = 3六*(√3六*t + s)/(3六*t + (√3 + 6)*s);
「六」,「矢」に数値を代入することにより正しい数値解 809.000681202592 を得る。
四(六 => 1666, 矢 => 2499).evalf() |> println
809.000681202592
式の段階で,「六」,「矢」に数値を代入すると式は以下のようになる。
@syms d
ans_四 = res[4](六 => 1666, 矢 => 2499) |> simplify
ans_四 = apart(ans_四, d) |> factor
ans_四 |> println
ans_四.evalf() |> println
-833*(-462 - 259*sqrt(3) + 72*sqrt(21) + 189*sqrt(7))/83
809.000681202592
正六角形の一辺の長さが 1666 寸,矢の長さが,2499 寸のとき,正方形の一辺の長さは
833*(462 + 259√3 - 72√21 - 189√7)/83 = 809.0006812025915 = 809.000 有奇である。
function transform(x, y; deg=0, dx=0, dy=0)
(x, y) = [cosd(deg) -sind(deg); sind(deg) cosd(deg)] * [x, y]
return (x .+ dx, y .+ dy)
end;
function driver(x1, y1, x2, y2, x3, y3, x4, y4)
(x31, y31, x32, y32, x33, y33, x34, y34) = (x3, y3, x4, y3, x4, y4, x3, y4)
for i = 0:2
segment(x1, y1, x2, y2, :blue)
plot!([x31, x32, x33, x34, x31], [y31, y32, y33, y34, y31], color=:red, lw=0.5)
x = [x1, x2, x31, x32, x33, x34]
y = [y1, y2, y31, y32, y33, y34]
(x, y) = transform(x, y, deg=120)
(x1, x2, x31, x32, x33, x34) = x
(y1, y2, y31, y32, y33, y34) = y
end
end;
function draw(六, 矢, more=false)
pyplot(size=(500, 500), grid=false, aspectratio=1, label="", fontfamily="IPAMincho")
θ = 180*acos((sqrt(3)*矢 + sqrt(4*六^2 - 矢^2))/(4*六))/pi
四 = 3*六*(sqrt(3)*六*sqrt((16*六^2 - (sqrt(3)*矢 + sqrt(4*六^2 - 矢^2))^2)/六^2) + sqrt(3)*矢 + sqrt(4*六^2 - 矢^2))/(3*六*sqrt((16*六^2 - (sqrt(3)*矢 + sqrt(4*六^2 - 矢^2))^2)/六^2) + (sqrt(3) + 6)*(sqrt(3)*矢 + sqrt(4*六^2 - 矢^2)))
println("四 = $四")
a = √3六
θ6 = 90:60:450
xa = @. 六*cosd(θ6)
ya = @. 六*sind(θ6)
plot()
for i = 1:6
segment(xa[i], ya[i], xa[i + 1], ya[i + 1], :green)
end
plot!([xa[2], xa[4], xa[6], xa[2]], [ya[2], ya[4], ya[6], ya[2]], color=:gray80, lw=0.5)
(x0, y0) = float.(intersection(-a/2, ya[2], 0, ya[2]-a/2*tand(θ),
a/2, ya[2], 0, ya[2]-a/2*tand(60 - θ)))
#segment(xa[2], ya[2], x0, y0, :blue)
#rect(-四/2, ya[2] + (a/2 - 四/2)/√3, 四/2, ya[2] - (a/2 - 四/2)*tand(θ), :red)
driver(xa[2], ya[2], x0, y0, -四/2, ya[2] + (a/2 - 四/2)/√3, 四/2, ya[2] - (a/2 - 四/2)*tand(θ))
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(x0, y0, " A", :blue, :left, :vcenter)
point(xa[6], ya[6], " C", :blue, :left, :vcenter)
point(xa[2], ya[2], "B ", :blue, :right, :vcenter)
θ0 = atand(y0, x0)
l0 = sqrt(x0^2 + y0^2)
x01 = l0*cosd(θ0 + 120)
y01 = l0*sind(θ0 + 120)
point(x01, y01, "D ", :blue, :right, delta=-delta/2)
point(xa[1], ya[1], "E ", :green, :center, :bottom, delta=delta)
point(-四/2, ya[2] + (a/2 - 四/2)/√3, "F ", :red, :right, :bottom)
point(0, ya[2] + (a/2 - 四/2)/√3, "H", :red, :center, :bottom, delta=delta)
point(-四/2, ya[2] + (a/2 - 四/2)/√3 - 四, "G ", :red, :right, :bottom, delta=delta)
plot!(xlims=(xa[2] - 5delta, xa[6] + 5delta))
end
end;
draw(1666, 2499, true)