算額(その287)
中村信弥「改訂増補 長野県の算額」
http://www.wasan.jp/zoho/zoho.html
県内の算額(251)
長野県諏訪市中洲 諏訪大社上社 明治12年(1897)
鉤股弦で,
股×弦 - 鉤×弦 = 425 平方寸
弦 - 鉤 = 18 寸
のとき,鉤,股,弦を求めよ。
以下の連立方程式を解く。
(鉤^2 + 股^2) - 弦^2 を使わないのは,虚数解を除くため。
include("julia-source.txt");
using SymPy
@syms 鉤::positive, 股::positive, 弦::positive;
eq1 = (股*弦 - 鉤*弦) - 425
eq2 = (弦 - 鉤) - 18
eq3 = (鉤^2 + 股^2) - 弦^2
eq3 = sqrt(鉤^2 + 股^2) - 弦
res = solve([eq1, eq2, eq3], (鉤, 股, 弦));
解は 2 組ある。
(鉤, 股, 弦) = res[1];
鉤.evalf(), 股.evalf(), 弦.evalf()
(7.00000000000000, 24.0000000000000, 25.0000000000000)
(鉤, 股, 弦) = res[2];
鉤.evalf(), 股.evalf(), 弦.evalf()
(25.3934598546653, 35.1875625010877, 43.3934598546653)
---
算額への招待 第4章 で術および現代解法が紹介されているが,方程式の係数に誤りがあるため,a=7, 25.3934598546653 の片方しか求めていない。
@syms a, b, c, A, B
A = 425
B = 18
eq1 = a^2 + b^2 - c^2
eq2 = b*c - a*c - A
eq3 = c - a - B;
solve(eq3, c)[1] |> println # c
a + 18
eq12 = eq2(c => a + 18)
eq12 |> println
-a*(a + 18) + b*(a + 18) - 425
solve(eq12, b)[1] |> println # b
(a^2 + 18*a + 425)/(a + 18)
eq11 = eq1(c => a + 18, b => (a^2 + 18*a + 425)/(a + 18))
eq111 = eq11 |> simplify
eq111|> println
(a^4 - 446*a^2 - 8028*a + 75649)/(a^2 + 36*a + 324)
factor(numerator(eq111)) |> println
(a - 7)*(a^3 + 7*a^2 - 397*a - 10807)
pyplot(size=(200, 200), grid=false, aspectratio=:none, label="", fontfamily="IPAMincho")
plot(eq111, xlims=(0, 30))
hline!([0])
res = solve(eq111)
res[1].evalf() |> println
res[2].evalf() |> println
res[3].evalf() |> println
res[4].evalf() |> println
7.00000000000000
-16.1967299273327 - 12.7768525871672*I
-16.1967299273327 + 12.7768525871672*I
25.3934598546653
件の現代解法では定数項が + 10807 となっており,もう一つの解が見逃されている。
A^2 - B^4 + (2A*B - 4B^3)a + (2A - 4B^2)a^2 + a^4 |> factor |> println
(a - 7)*(a^3 + 7*a^2 - 397*a - 10807)
SymPy の solve() は,ここに展開したような式変形と求解を間違いなくやってくれている。