算額(その102)
東京都千代田区 神田明神 平成30年(2018)3月
http://www.wasan.jp/tokyo/kanda.html
一辺が二の正五角形の頂点を結んでできた星の中に等円が六個入っている。等円一つの面積を求めよ。
一辺が二ということは,下図のように座標を決め,五角形が内接する円の半径を r とすると,r = 1 / sin(36/180*π)
更に,x1 = 2r1*cos(18/180*π), y1 = 2r1*sin(18/180*π)
「点 (x1, y1) から 直線 AB までの距離が等円の半径 r1 に等しい」とする方程式を解いて,r1 を得る。
using SymPy
function distance(x1, y1, x2, y2, x0, y0)
p1, p2 = sympy.Point(x1, y1), sympy.Point(x2, y2)
l = sympy.Line(p1, p2)
l.distance(sympy.Point(x0, y0))
end;
@syms r, x1, y1, r1;
r = 1 / sind(Sym(36));
x1 = 2r1*cosd(Sym(18));
y1 = 2r1*sind(Sym(18));
eq1 = distance(r*cosd(Sym(18)), r*sind(Sym(18)), -r*cosd(Sym(18)), r*sind(Sym(18)), x1, y1) - r1;
r1 = solve(eq1, r1)[1];
r1 |> println
(-(5 - 3*sqrt(5))*sqrt(5 - sqrt(5))*(-3*sqrt(2) + sqrt(10)) + 4*(-5 + 3*sqrt(5))*sqrt(5 - 2*sqrt(5)))/(2*(5 - 3*sqrt(5))^2)
r1.evalf() |> println
0.324919696232906
小円の面積は以下の通り。
(r1^2 * π).evalf() |> println
0.331666761173503
算額の答えは,「1 引く,2 を 平方根 5 で割,次数のπ倍」とあり,次数って何?また,π倍のパイが若干読み取りにくかったが,
1 - 2/√5 が r1^2 であることがわかれば,等円の面積は (1 - 2/√5)* π ということだ。r1 = √(1 - 2/√5) である。
r1 = (-(5 - 3*sqrt(5))*sqrt(5 - sqrt(5))*(-3*sqrt(2) + sqrt(10)) + 4*(-5 + 3*sqrt(5))*sqrt(5 - 2*sqrt(5)))/(2*(5 - 3*sqrt(5))^2) は簡単にならないが,r1^2 は簡単になる。実に短く 1 - 2/√5 である。
昔の算額は円の径を求めるものが多く,面積を求めるものは少ない。この問題が面積を求めるのには,そういう理由があったのだなと感動した。
r12 = expand(r1^2) |> simplify |> sympy.sqrtdenest |> simplify |> println
1 - 2*sqrt(5)/5
using Plots
using Printf
function circle(ox, oy, r, color=:red; beginangle=0, endangle=360, fill=false)
θ = beginangle:0.1:endangle
x = r.*cosd.(θ)
y = r.*sind.(θ)
if fill
plot!(ox .+ x, oy .+ y, color=color, linewidth=0.5, seriestype=:shape, fillcolor=color)
else
plot!(ox .+ x, oy .+ y, color=color, linewidth=0.5)
end
end;
function point(x, y, string="", color=:green, position=:left, vertical=:top; mark=true)
mark && scatter!([x], [y], color=color, markerstrokewidth=0)
annotate!(x, y, text(string, 10, position, color, vertical))
end;
function segment(x1, y1, x2, y2, color=:black; linestyle=:solid, linewidth=0.5)
plot!([x1, x2], [y1, y2], color=color, linestyle=linestyle, linewidth=linewidth)
end;
function draw(more=false)
pyplot(size=(500, 500), grid=false, aspectratio=1, label="", fontfamily="IPAMincho")
r = 1 / sind(36)
r1 = sqrt(1 - 2/sqrt(5))
println("r1 = $r1, S = $(π * r1^2)")
plot()
circle(0, 0, r)
θ = 18:72:378
x = r.*cosd.(θ)
y = r.*sind.(θ)
plot!(x, y, color=:black, lw=0.5)
circle(0, 0, r1, :blue)
for i in 1:5
j = (i + 1) % 5 + 1
segment(x[i], y[i], x[j], y[j])
x1 = 2r1 * cosd(θ[i])
y1 = 2r1 * sind(θ[i])
circle(x1, y1, r1, :red)
end
if more
x1 = 2r1*cosd(18)
y1 = 2r1*sind(18)
info = @sprintf("r1 = %.3f, 等円の面積 = %.3f\nx1 = %.3f, y1 = %.3f\n", r1, π*r1^2, x1, y1)
point(-0.8, -1.4, info, :black, :left, mark=false)
point(0, 0, "0 ", :red, :right)
point(x[1], y[1], " A", :blue)
point(-x[1], y[1], "B ", :blue, :right)
point(2r1 * cosd(θ[1]), 2r1 * sind(θ[1]), "(x1,y1)", :blue, :center)
vline!([0], color=:black, lw=0.5)
hline!([0], color=:black, lw=0.5)
end
end;
draw(true)
savefig("fig1.png")
r1 = 0.32491969623290634, S = 0.3316667611735027
using Plots
function draw()
pyplot(size=(500, 500), grid=false, aspectratio=1, label="", fontfamily="IPAMincho")
r = 1 / sind(36)
r1 = sqrt(1 - 2/sqrt(5))
plot(showaxis=false)
#circle(0, 0, r)
θ = 18:72:378
x = r.*cosd.(θ)
y = r.*sind.(θ)
plot!(x, y, color=:black, lw=0.5)
circle(0, 0, r1, :red, fill=true)
r2 = r*sind(18)/cosd(36)
for i in 1:5
j = i + 1
#point(r2*cosd(θ[i]+36), r2*sind(θ[i]+36), string(i))
#point(x[i], y[i], string(10+i))
plot!([x[i], x[j], r2*cosd(θ[i]+36), x[i]], [y[i], y[j], r2*sind(θ[i]+36), y[i]], seriestype=:shape, fillcolor=:blue)
#segment(x[1], y[1], x[3], y[3])
x1 = 2r1 * cosd(θ[i])
y1 = 2r1 * sind(θ[i])
circle(x1, y1, r1, :red, fill=true)
end
end;