東ロボくんのこと(8)二重根号

 大学入試程度しかもparametricでないなら,MinimalPolynomialを用いて根号内のQ上の共役を求め,和と積の値を取り出せばよい訳ですが,今回はaの値によってはSqrt[1+a^2]∈Qとなることもあり,この手は使えません.

 そこでメタレベル,つまり,Mathematicaの強力なパターンマッチングを駆って

test0[Sqrt[s_ + t_*Sqrt[u_]]] := 
 Simplify[Abs[
   Sqrt[s + Sqrt[s^2 - t^2 u]]/
     Sqrt[2] + ((s - Sqrt[s^2 - t^2 u]) Sqrt[
        s + Sqrt[s^2 - t^2 u]])/(Sqrt[2] t Sqrt[u])]]
test0[Sqrt[s_ + Sqrt[u_]]] := 
 Simplify[Abs[
   Sqrt[s + Sqrt[s^2 - u]]/
     Sqrt[2] + ((s - Sqrt[s^2 - u]) Sqrt[s + Sqrt[s^2 - u]])/(Sqrt[
        2] Sqrt[u])]]

とすればparameterの有無に寄らず処理ができます.ただし,一般の計算結果に代入する方法では別途簡約が入用となるのが普通です.

 なら引数を直接用いてその場で計算すれば良いだろうと

test0[Sqrt[s_ + t_*Sqrt[u_]]] := 
 Module[{x, y}, 
  Abs[x + y] /. 
   Simplify[
     Solve[{s + t*Sqrt[u], 
        s - t*Sqrt[u]} == {(x + y)^2, (x - y)^2}, {x, y}]][[1]]]
test0[Sqrt[s_ + Sqrt[u_]]] := 
 Module[{x, y}, 
  Abs[x + y] /. 
   Simplify[
     Solve[{s + Sqrt[u], s - Sqrt[u]} == {(x + y)^2, (x - y)^2}, {x, 
       y}]][[1]]]
test01[x_] := test0[Expand[x]]

とすれば

といった感じになり,(1)なら

Simplify[test01[Sqrt[(A - P).(A - P)]] - test01[Sqrt[(Q - A).(Q - A)]], 0 <= a <= 1]

だけで 2 となります.

 ただし,肝心の(2)ではSqrt[(A - P).(A - P)]は良くても,後の2つは上記の形ではなく,test01を適用すると大変なことになります.また,方針として,aの項を相殺させるなら人間のように
・(1)の結果
・A∈線分QBならばQA+AB=QB
を利用する訳ですが,非対話的に行うことは容易ではないかも知れません.