syzygyと極小自由分解の計算

メモ。Risa/Asirには、syzygyを計算する機能はないのかと思って、lib-asir-contribを眺めていたら、noro_module_syz.rrというファイルがあった。ドキュメントすらないっぽいのだけど、ちゃんと動く。モジュール名がnewsyzなのだけど、oldは何処に?


・module_syz(F,V,H,O):イデアル加群のsyzygyの計算
・module_fres(F,V,H,O):イデアル加群の自由分解の計算(module_syzを順に適用していくだけ)
・module_minres(F,V,H,O):イデアル加群の極小自由分解の計算


・Fは多項式のリスト(か多項式のリストのリスト)。Vは変数のリスト。Hは基礎体を指定する(0か1なら有理数体。それ以外の正整数なら、Hに等しい位数を持つ有限体)。Oは項順序(gr関数などと同様)
・多分、Fが多項式のリストの時は、イデアルのsyzygyを計算する
・Fが多項式のリストのリストの時は、多項式係数の行列と見ているのだと思う
・optitonで、weyl=1とか指定すると、多項式環ではなく、Weyl代数の加群を扱えるっぽい?まぁ、とりあえず必要ないので、特に見てない


Modular Algorithms for Computing a Generating Set of the Syzygy Module
http://link.springer.com/chapter/10.1007%2F978-3-642-04103-7_23
とか
グレブナー基底計算の高速化とその応用
http://www.math.sci.hokudai.ac.jp/sympo/100809/pdf/noro.pdf
アルゴリズム4.7の実装っぽい


syzygy計算のテスト

load("noro_module_syz.rr");

/* 
イデアルの1st syzygy
返り値がsyz(F)の部分加群を生成することを確認
syz(F)の生成系であることは、目視で確認?
*/
def syztest(F){
  Ret = 1;
  G = gr(F , vars(F) , 0);
  C = newsyz.module_syz(F , vars(F) , 0 , 0)[0];
  for(T = C ; T!=[] ; T=cdr(T)){
      S = 0;
      for(I = 0 ; I < length(F) ; I++){
        S += car(T)[I]*F[I];
      }
      if(S!=0){
           Ret = 0;
           print("syzygy test failed @generator:" , 0);
      }else{
           print("syzygy test success @genetator:" , 0);
      }
      print(car(T));
  }
  return Ret;
}
/*
OKぽ...
syztest([a^2 , a*b , c^2]);
syztest([u*x,u*y,v*x,v*y]);
syztest([x+y+z,y+z,z]);
syztest([x+y,x-y,x*z+y*z]);
syztest([x^2-y^2,x^2-z^2,x*y,x*z,y*z]);

*/


module_syzを繰り返し適用していけば、自由分解が得られるけど、実用的には、極小自由分解がほしい気がする。それは、newsyz.module_minresでできる。R=Q[x,y,z]のイデアルI=(x^2-y^2,x^2-z^2,x*y,x*z,y*z)の極小自由分解は、 reverse(map(length,newsyz.module_minres([x^2-y^2,x^2-z^2,x*y,x*z,y*z],[x,y,z],0,0)));の結果が[5,5,1]なので、
I<-R^5<-R^5<-R
という極小自由分解があって、R/Iの方は、R/I<-Rの後ろに、イデアルの極小自由分解をくっつけて、
R/I<-R<-R^5<-R^5<-R
という極小自由分解を得る。