読者です 読者をやめる 読者になる 読者になる

自動解答系の作り方(20)

 折角なので自動解答システムに適した「正方形」の定義の例を述べておきます.

 まず,座標幾何の言葉を用いることに異論はないと思います.

 次に正方形の実体?ですが,ここでは「頂点の列」を正方形とします.

 で,その特徴付けですが,不慣れな受験生のように辺の長さと角の大きさを用いるのは,計算機にはコストが高過ぎますから,R^2の回転変換を用いて,4点が一致するか一つの正方形となることを

squareL[{P0_, P1_, P2_, P3_}] := 
 Block[{P0x, P0y, P1x, P1y}, {P0x, P0y, P1x, P1y} = Flatten@{P0, P1}; 
  Reduce[Exists[{P0x, P0y, P1x, P1y},
    {P2, P3} == {P1 + P3 - P0, P0 + Cross[P1 - P0]}], Reals]];
squareR[{P0_, P1_, P2_, P3_}] := 
 Block[{P0x, P0y, P1x, P1y}, {P0x, P0y, P1x, P1y} = Flatten@{P0, P1}; 
  Reduce[Exists[{P0x, P0y, P1x, P1y},
    {P2, P3} == {P1 + P3 - P0, P0 - Cross[P1 - P0]}], Reals]];

と導入すると,例えば

In[2]:= squareL[{{1, 2}, {3, 4}, {a, b}, {c, d}}]

Out[2]= d == 4 && b == 6 && c == -1 && a == 1

のようになり,先の面積の問題についても

In[3]:= Reduce[
  Exists[{P0x, P0y, P1x, P1y, P2x, P2y, P3x, P3y}, 
   squareL[{{P0x, P0y}, {P1x, P1y}, {P2x, P2y}, {P3x, P3y}}] && 
    Norm[{P0x, P0y} - {P1x, P1y}] == 2 && 
    1/2 Norm[Cross[{P0x, P0y, 0} - {P1x, P1y, 0}, {P0x, P0y, 0} - {P2x, P2y, 0}]] + 
      1/2 Norm[Cross[{P0x, P0y, 0} - {P2x, P2y, 0}, {P0x, P0y, 0} - {P3x, P3y, 0}]] == A],
        Reals] // AbsoluteTiming

Out[3]= {0.035194, A == 4}

となります.

 大きなお世話ですが,人間がよく用いるこうした技巧?と,辺と角による定義を採用した正面突破との比較といった話があると,東ロボくんの数学方面の裾野が広がるように思います.