Skip to content

Stein分解を計算するMacaulay2コード

論文 An algorithm for the minimal model program in dimension three(arXiv:2603.13703)の§4–§5・Algorithm 1にあたる部分を、Macaulay2でプロトタイプ実装しています。実装はGitHubで公開されており、今日はその内容を簡単に紹介します。

Stein分解とは

射影多様体の間の射 \(f: X \to Y\) は、一般には「有限ファイバーを持つ有限射」と「連結ファイバーを持つ射」の合成に分解できます。これがStein分解 \(X \to Z \to Y\) で、中間の \(Z\)\(\mathrm{Spec}_Y(f_*\mathcal{O}_X)\) として得られます。極小モデルプログラム(MMP)では、収縮射の構成でStein分解を用います。

何を計算しているか

具体的には、二重次数付き環 \(R\) 上のHom加群

\[ C = \mathrm{Hom}_R(R_{\ge r}, R)_{(0,\ge r)} \]

を計算し、それをターゲットの座標環 \(A\) 上の有限表示として実現します。公開コードでは steinHomData で双次数Hom加群を計算し、steinCoordinateAlgebra で座標環を復元、directSteinGraph で直接connected-fiberグラフを構成する、という流れになっています。

具体例:Mori fiber space

\(X = \mathbb{P}^1 \times \mathbb{P}^2 \xrightarrow{h} \mathbb{P}^2 \xrightarrow{g} \mathbb{P}^2\)\(g([x_0:x_1:x_2]) = [x_0^2:x_1^2:x_2^2]\) という合成写像で試すと、こうなります。

load "SteinFactorization.m2";

sgraph = QQ[z00,z01,z02,z10,z11,z12,y0,y1,y2,
    Degrees=>{{1,0},{1,0},{1,0},{1,0},{1,0},{1,0},{0,1},{0,1},{0,1}}];
param = QQ[s,t,x0,x1,x2,sourceScale,targetScale];
graphParametrization = map(param,sgraph,{
    s*x0*sourceScale,s*x1*sourceScale,s*x2*sourceScale,
    t*x0*sourceScale,t*x1*sourceScale,t*x2*sourceScale,
    x0^2*targetScale,x1^2*targetScale,x2^2*targetScale});
igraph = kernel graphParametrization;

d = steinHomData(sgraph,igraph,5,2,6,3);
c = steinCoordinateAlgebra(d,0,{y0,y1,y2});
gh = directSteinGraph(d,c);

これを実行すると、Stein中間項の座標環はHilbert関数が \(H(1)=6,\ H(2)=15\) となり、\(\mathbb{P}^2\) の2次Veronese埋め込みの座標環と一致することが確認できます。さらに定義イデアルは素イデアルで、点 \([1:1:1]\) 上のファイバーは4本の \(\mathbb{P}^2\) 上の直線に対応する4つの \(\mathbb{P}^1\) に分解されます。これは \(K\cdot F = -2\) のMori fiber spaceとして期待通りの振る舞いです。

現状

Corollary 4.3のshift boundからの厳密な計算、多重次数のorthant truncation、pushForwardを使った有限表示、座標環の復元、直接グラフの構成までは一通り動くようになりました。ただし長い自由分解の計算重くなるケースがあり、また代数の生成元に冗長なものがあり計算を重くしていることがあり、このあたりの課題は残っています。

試してみませんか?

Stein分解計算の良い例やテストケースをお持ちでしたら、ぜひ公開コードで試していただきたいです。このコードはCC0 1.0 Universal (public domain dedication)で公開されていますので、自由に改変・利用いただけます。