縦と横にしか動けない世界で(1994年東京大学入学試験理系数学第6問)


1994年の東京大学の入学試験、理系数学第6問は次のようなものでした。

平面上の2点P, Qに対し、PとQをx軸またはy軸に平行な線分からなる折れ線で結ぶときの経路の長さの最小値をd(P, Q)で表す。

(1) 原点O(0, 0)と点A(1, 1)に対し、
d(O, P)=d(P, A)を満たす点P(x, y)の範囲をxy平面上に図示せよ。

(2) 実数a>=0に対し、点Q(a, a^2+1)を考える。
次の条件(*)を満足する点P(x, y)の範囲をxy平面上に図示せよ。
(*) 原点O(0, 0)に対し、d(O, P)=d(P, Q)となるようなa>=0が存在する。

この問題は、d(O, P)=Abs[x]+Abs[y]であることがわかれば解けます。d(O, P)=Sqrt[x^2+y^2]ではありません。

Mathematicaで試します。

(*1*)
d[p_, q_] := Total[Abs[p - q]]
expr = d[{0, 0}, {x, y}] == d[{x, y}, {1, 1}];
cond = Reduce[expr, {x, y}, Reals];
reg = ImplicitRegion[cond, {x, y}];
RegionPlot[reg, PlotRange -> {{-2, 2}, {-2, 2}}]

(*2*)
expr = Exists[a, a >= 0,
   d[{0, 0}, {x, y}] == d[{x, y}, {a, a^2 + 1}]];
cond = Reduce[expr, {x, y}, Reals];
reg = ImplicitRegion[cond, {x, y}];
RegionPlot[reg, PlotRange -> {{-2, 2}, {-2, 2}}]

描画領域の境界にも実線が引かれている、という問題がありますが、とりあえずはこれでいいでしょう。

Mathematica 10.3.1と11.2, 11.3には,直線部分が描かれないというバグがあります(紛らわしいことに10.4, 11.0.1は大丈夫)。11.2以降なら,RegionImageを使うといいかもしれません。

RegionImage[reg, PlotRange -> {{-2, 2}, {-2, 2}}]

関連:数学まちがい大全集

MathematicaのAgglomerateのバグ


Mathematica 8.0, 9.0, 10.0, 10.1, 10.2, 10.3, 10.4.1, 11.2, 11.3 for Microsoft Windows (64-bit)と10.0.0, 10.3.1 for Linux ARM (32-bit)でのことです。

Mathematicaには、階層的クラスタリングができる関数が3つ用意されています。FindClustersAgglomerateClusteringComponentsです。3つもあるのが問題な気もしますが、とりあえずそれはよしとして・・・

FindClustersにはバグがあることを以前報告しました。

ですから、階層的クラスタリングをしたいときは、AgglomerateかClusteringComponentsを使わなければなりませんが、残念なことに、Agglomerateにもバグがあります。FindClustersの場合と同様、このデータと次のコードで再現できます(RSSリーダーでは表示されないかもしれません)。

クラスタリング結果にはすべての要素(この例では63個)が入っていなければなりませんが、結果を数えてみると足りません(この例では38個)。このバグは報告済みですが、解決方法はわかっていません。バグが修正されたバージョンを受け取るために、プレミアユーザになっています。

FindClustersとAgglomerateが使えないとなると、残るはClusteringComponentsだけになるわけですが、これにもちょっと問題があります(MathematicaのClusteringComponentsの困ったところ)。

というわけで、階層的クラスタリングをしたいときはRを使うのがよさそうです(参考)。