「探索を逆方向から攻める」は不完全であった。条件を満たす最小の整数を漏らしていた。
b = 0.111111 * 1:9 # b は 0.111111 ~ 0.999999 の 9 種類
b2 = 2 * b
b.sq = b^2
n = 1e+05 # 探索範囲上限
for (a in 1:n) {
x = a * b2 + b.sq # 求める整数から a^2 を引いたものの近似値
if (any(abs(round(x) - x) < 1e-05)) { # round(x) が実際の求めるべき整数から a^2 を引いたもの(チェックを緩めた)
index = which.min(abs(round(x) - x))
y = sqrt(round((a + b[index])^2)) # 実際に平方根をとって,小数点以下に 6 個の数字が並ぶかをチェックする
z = unlist(strsplit(as.character(y), ""))
if (any(grepl("\\.", z))) {
i = which(z == ".")
u = z[(i + 1):(i + 6)] # 小数点以下 6 桁を取り出す
if (all(u[1] == u)) { # 全部同じか
options(digits=15)
cat("sqrt(", round((a + b[index])^2), ") =", y, "\n")
break
}
}
}
}
実行結果
sqrt( 48273160 ) = 6947.88888800044
実行時間は,0.052 秒であった。