以前の記事で,「SymPy では二重根号を外せない」と書いたが,そんなことはなかった。
sqrtdenest() があった。Maxima にもあるようだが,SymPy の sqrtdenest() に言及した日本語の記事は 1 つしか見つからなかった。
ちなみに,そこには「二重根号外しを二重にやらなければいけないケースにどのくらい対応できているか試してみた」とあり,うまく行かないという以下の例が示されていた。
Python の場合
import sympy as S
S.init_printing()
a = S.sqrt(S.sqrt(49 + 20 * S.sqrt(6)))
a
S.sqrtdenest(a)
うまくやるためには sqrtdenest を 2 回使うことである(Python の sqrtdenest のソースドキュメントにヒントが書いてあった)。
S.sqrtdenest(S.sqrt(S.sqrtdenest(S.sqrt(49+20*S.sqrt(6)))))
Julia の場合
Julia では,ルート中の整数は Sym() でシンボリックナンバーにすることもできる(そのようにすれば sqrt は自動的に対応する)。しかし,sqrtdenest() はインポートされていないので sympy.sqrtdenest() として使用する。
using SymPy
a = sqrt(sqrt(49 + 20sqrt(Sym(6))))
a |> N
3.1462643699419723423291350657155704455124771291873287012324867174426654953709
sympy.sqrtdenest(sqrt(sqrt(49 + 20sqrt(Sym(6)))))
`sqrtdenest` を 2 回使う。
c = sympy.sqrtdenest(sqrt(sympy.sqrtdenest(sqrt(49 + 20sqrt(Sym(6))))))
c |> N
3.1462643699419723423291350657155704455124771291873287012324867174426654953709
---------------------------------
なお,以下のような場合には 1 回 `sqrtdenest` を使うだけでちゃんと動く。
Python の場合
b = S.sqrt(1 + S.sqrt(40 + 16 * S.sqrt(6)))
b
N(b)
3.1462643699419723423291350657155704455124771291873287012324867174426654953709
S.sqrtdenest(b)
Julia の場合
b = sqrt(1 + sqrt(40 + 16 * sqrt(Sym(6))))
sympy.sqrtdenest(b)
※コメント投稿者のブログIDはブログ作成者のみに通知されます