裏 RjpWiki

Julia ときどき R, Python によるコンピュータプログラム,コンピュータ・サイエンス,統計学

SymPy で二重根号を外す

2022年09月30日 | ブログラミング

以前の記事で,「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)


コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

PVアクセスランキング にほんブログ村

PVアクセスランキング にほんブログ村