本日のC.A.D.

前回は S、T が ¬(0∈S) ∨ ¬(0∈T) を満たす場合でしたが,一般には

   ∃s∃t(z=s*t ∧ s∈S ∧ t∈T)
 ⇔ ∃s∃t(z=s*t ∧ s∈S ∧ t∈T ∧ (s≠0 ∨ s=0))
 ⇔ ∃s∃t(z/s=t ∧ s∈S ∧ t∈T) ∨ ∃s∃t(z=0 ∧ s=0 ∧ s∈S ∧ t∈T)
 ⇔ ∃s(s∈S ∧ z/s∈T) ∨ (z=0 ∧ 0∈S ∧ T≠{})

のように選言となり,とくに,S={w;|w-c1|=r1},T={w;|w-c2|=r2} の場合,この選言は次のように消去できます.

   ∃s∃t(z=s*t ∧ |s-c1|=r1 ∧ |t-c2|=r2) ……… (3)
 ⇔ ∃s(|s-c1|=r1 ∧ |z/s-c2|=r2) ∨ (z=0 ∧ |c1|=r1 ∧ r2≧0)
 ⇔ ∃s(|s-c1|=r1 ∧ |z-c2*s|=r2*|s| ∧ s≠0) ∨ (z=0 ∧ |c1|=r1 ∧ r2≧0)
 ⇔ ∃s(|s-c1|=r1 ∧ |z-c2*s|=r2*|s| ∧ s≠0 ∧ r2≧0) ∨ ∃u(|u-c1|=r1 ∧ |z-c2*u|=r2*|u| ∧ u=0 ∧ r2≧0)
 ⇔ ∃s(|s-c1|=r1 ∧ |z-c2*s|=r2*|s| ∧ (s≠0 ∨ s=0) ∧ r2≧0)
 ⇔ ∃s(|s-c1|=r1 ∧ |z-c2*s|=r2*|s| ∧ r2≧0) ……… (4)

なお,(3)⇒(4)は z=s*t の代入で,(4)⇒(3)は s≠0,s=0 の場合にそれぞれ t=z/s,t=c2+r2 として得ることもできます.

さて,R1=r1^2,R2=r2^2 などとおき,(3),(4)を実変数化すると

f3 = Exists[{x1, y1, x2, y2}, y1*x2 + x1*y2 == y && x1*x2 - y1*y2 == x && (-a + x1)^2 + (-b + y1)^2 == R1 && (-c + x2)^2 + (-d + y2)^2 == R2];
f4 = Exists[{x1, y1}, (x1 - a)^2 + (y1 - b)^2 == R1 && (-(c*x1) + d*y1 + x)^2 + (-(c*y1) - d*x1 + y)^2 == R2*(x1^2 + y1^2) && 0 <= R2];

となり,f4 の 2 つの等式から x1^2 + y1^2 を消去した(根軸を表す)等式

(-(c*x1) + d*y1 + x)^2 + (-(c*y1) - d*x1 + y)^2 - R2*(x1^2 + y1^2) - (c^2 + d^2 - R2)*((x1 - a)^2 + (y1 - b)^2 - R1) == 0

の左辺を P+x1*Q+R*y1,つまり

PQR := {P->(-a^2)*c^2 - b^2*c^2 - a^2*d^2 - b^2*d^2 + c^2*R1 + d^2*R1 + a^2*R2 + b^2*R2 - R1*R2 + x^2 + y^2,
 Q->2*a*c^2 + 2*a*d^2 - 2*a*R2 - 2*c*x - 2*d*y,
 R->2*b*c^2 + 2*b*d^2 - 2*b*R2 + 2*d*x - 2*c*y};

とおくと,QEPCADB が

[]
(A,B,C,D,X,Y)
4
(EX)(EY)[X^2 + Y^2 = D /\ A X + B Y + C = 0].
finish
An equivalent quantifier-free formula:
D >= 0 /\ B^2 D + A^2 D - C^2 >= 0

と答えることにより,f4 は次のように QE できます.

Exists[{x1, y1}, (x1 - a)^2 + (y1 - b)^2 == R1 && P + Q*a + R*b + (x1 - a)*Q + R*(y1 - b) == 0 && 0 <= R2]
⇔
(P + Q*a + R*b)^2 - R1*(Q^2 + R^2) <=0  && 0 <= R1 && 0 <= R2
⇔ (using PQR)
((-a^2)*c^2 - b^2*c^2 - a^2*d^2 - b^2*d^2 + c^2*R1 + d^2*R1 + a^2*R2 + b^2*R2 - R1*R2 + x^2 + y^2 + b*(2*b*c^2 + 2*b*d^2 - 2*b*R2 + 2*d*x - 2*c*y) + a*(2*a*c^2 + 2*a*d^2 - 2*a*R2 - 2*c*x - 2*d*y))^2 - R1*((2*b*c^2 + 2*b*d^2 - 2*b*R2 + 2*d*x - 2*c*y)^2 + (2*a*c^2 + 2*a*d^2 - 2*a*R2 - 2*c*x - 2*d*y)^2) <= 0 && 0 <= R1 && 0 <= R2

こうした議論や置換を経ず,同じ結果を直接得ることは Mathematica でも難しく,stochastic な検算に留まるのが現状です.

F3[{x_, y_, a_, b_, c_, d_, R1_, R2_}] = Exists[{x1, y1, x2, y2}, y1*x2 + x1*y2 == y && x1*x2 - y1*y2 == x && (-a + x1)^2 + (-b + y1)^2 == R1 && (-c + x2)^2 + (-d + y2)^2 == R2];  
F5[{x_, y_, a_, b_, c_, d_, R1_, R2_}] = ((-a^2)*c^2 - b^2*c^2 - a^2*d^2 - b^2*d^2 + c^2*R1 + d^2*R1 + a^2*R2 + b^2*R2 - R1*R2 + x^2 + y^2 + b*(2*b*c^2 + 2*b*d^2 - 2*b*R2 + 2*d*x - 2*c*y) + a*(2*a*c^2 + 2*a*d^2 - 2*a*R2 - 2*c*x - 2*d*y))^2 - R1*((2*b*c^2 + 2*b*d^2 - 2*b*R2 + 2*d*x - 2*c*y)^2 + (2*a*c^2 + 2*a*d^2 - 2*a*R2 - 2*c*x - 2*d*y)^2) <= 0 && 0 <= R1 && 0 <= R2;  
F35[L_] := CylindricalDecomposition[Equivalent[F3[L], F5[L]]];

And@@Table[F35@(RandomSample[-10;;10^5,8]/10^5),10^4]//Timing
{174.248398, True}

https://github.com/chriswestbrown/tarski/raw/master/interpreter/ex/GenCircleCircle.txt