%#!platex % $OpenXM: OpenXM/src/asir-contrib/packages/doc/yang/yang_tutorial-ja.tex,v 1.2 2006/03/20 14:14:04 ohara Exp $ \documentclass{jarticle} %\usepackage{amsmath} \title{Yang Tutorial} \author{金沢大学理学部\ \ \ 小原功任} \date{} \topmargin -1.5cm \textheight 23.5cm \oddsidemargin 0cm \evensidemargin 0cm \textwidth 16.5cm \begin{document} \maketitle \section{yang とは} yang ではオイラー微分演算子, shift operator, $q$-shift operator からなる環 での計算を行う Risa/Asir のパッケージです. 計算する前に \verb|yang.define_ring| あるいはその変種を用いて, 必ず環を定義します. 同時に扱える環はひとつだけですが, \verb|yang.define_ring| を呼び出すと, 以前の環の定義はスタックにプッシュされるため, \verb|yang.define_ring| と \verb|yang.pop_ring| で挟むことで, サブルーチン的な計算を実現することが できます. yang でできる計算は,グレブナ基底, 正規形, 0次元イデアルのランク, Pfaff 形式などです. またグレブナ基底は有理関数体係数で計算します. \section{Appell's $F_1$ を計算してみる.} ここでは, オイラー微分演算子からなる環を定義し, 超幾何方程式系 $F_1$ の グレブナ基底を計算してみます. 実はオイラー微分演算子のみを含む場合には, \verb|yang_D.rr| を使ったほうが高速になります. \begin{verbatim} ohara:~> asir [1] load("yang.rr"); [2] yang.define_ring([x1,x2]); {[euler,[x1,x2]],[x1,x2],[0,0],[0,0],[dx1,dx2]} \end{verbatim} 環として, $R=K(x_1,x_2)\langle \theta_1, \theta_2\rangle$ が定義 されました($\theta_i = x_i\partial_i$). \verb|yang.define_ring| の出力に示されているように, \verb|x1| に対応するオイラー微分演算子 $\theta_1$ は \verb|dx1| で表されます. 環の元を定義しましょう. \begin{verbatim} [3] S=dx1+dx2; \end{verbatim} $S = \theta_1 + \theta_2$ です. $R$ における和は, 通常の $+$ で書くことができます. また, $K(x_1,x_2)$ の元の掛け算は, 通常の $*$ で書くことができます. \begin{verbatim} [4] L1 = yang.mul(dx1,S+c-1) - x1*yang.mul(dx1+b1,S+a); ((-x1+1)*dx1-b1*x1)*dx2+(-x1+1)*dx1^2+((-a-b1)*x1+c-1)*dx1-b1*a*x1 [5] L2 = yang.mul(dx2,S+c-1) - x2*yang.mul(dx2+b2,S+a); (-x2+1)*dx2^2+((-x2+1)*dx1+(-a-b2)*x2+c-1)*dx2-b2*x2*dx1-b2*a*x2 \end{verbatim} $L_1 = \theta_1 (S + c-1) - x_1 (\theta_1 + b_1)(S+a)$ です. $R'=K[x_1,x_2]\langle \theta_1, \theta_2\rangle$ における演算子 の積は \verb|yang.mul| で計算します. ただし, $K[x_1,x_2]$ の元はそのま まかけても構いません. いまのところ, \verb|yang.mul| の引数に使えるの は$R'$ の元のみです. \begin{verbatim} [6] G = yang.gr([L1,L2]); [((-x2^2+(x1+1)*x2-x1)*dx2^2+((-a-b2)*x2^2+((a-b1+b2)*x1+c-1)*x2+(-c+b1+1)*x1)*dx2 +(b2*x1-b2)*x2*dx1-b2*a*x2^2+b2*a*x1*x2)/(-x2^2+(x1+1)*x2-x1), (((-x2+x1)*dx1+b1*x1)*dx2-b2*x2*dx1)/(-x2+x1), ((-b1*x1*x2+b1*x1)*dx2+((-x1+1)*x2+x1^2-x1)*dx1^2+(((-a-b1+b2)*x1+c-b2-1)*x2 +(a+b1)*x1^2+(-c+1)*x1)*dx1-b1*a*x1*x2+b1*a*x1^2)/((-x1+1)*x2+x1^2-x1)] \end{verbatim} $R$ のイデアル $I=\langle L_1, L_2 \rangle$ のグレブナ基底 $G$ を計算します. 計算結果は \begin{eqnarray*} G = &\biggl\{ & \frac{t_1 \theta_2^2+(b_2 x_1-b_2) x_2 \theta_1 + t_2 \theta_2 +(-b_2 a x_2^2+b_2 a x_1 x_2)}{-x_2^2+(x_1+1) x_2-x_1},\\ &&\frac{(-x_2+x_1) \theta_1 \theta_2 + (-b_2 x_2) \theta_1 + b_1 x_1 \theta_2}{-x_2+x_1},\\ &&\frac{t_3 \theta_1^2 +t_4 \theta_1 + (-b_1 x_1 x_2+b_1 x_1 ) \theta_2 + (-b_1 a x_1 x_2+b_1 a x_1^2)}{(-x_1+1) x_2+x_1^2-x_1} \biggr\} \end{eqnarray*} を意味します. ここで, \begin{eqnarray*} t_1 &=& -x_2^2+(x_1+1) x_2-x_1 \\ t_2 &=& (-a-b_2) x_2^2+((a-b_1+b_2) x_1+c-1) x_2+(-c+1+b_1) x_1 \\ t_3 &=& (-x_1+1) x_2+x_1^2-x_1 \\ t_4 &=& ((-a-b_1+b_2) x_1+c-b_2-1) x_2+(a+b_1) x_1^2+(-c+1) x_1 \end{eqnarray*} つまり, 計算結果は $R$ の元のリストです. % 演算子の内部表現を知るには \verb|yang.op| 関数を, % 内部表現から多項式表現を知るには \verb|yang.opr| 関数を使います. % \begin{verbatim} % [5] yang.op(dx1); % (1)*<<1,0>> % [6] yang.opr(<<1,0>>); % dx1 % \end{verbatim} % このように演算子の内部表現は分散多項式になっています. % そのままでは $R'$ の元しか表せず, $R$ の % 元は表現できません. したがって, $f \in R'$ と $q \in K[x_1,x_2]$ の対 % \verb|[F,Q]| で $R$ の元 $(1/q)f$ を表します. % さらに, $R$ における項順序は asir の分散多項式の項順序に一致します. 既 % 定値は, 全次数逆辞書式順序です. 順序を変更して Groeber 基底を計算したい % 場合には, 環の元を定義する前に dp\_ord で順序を変更しておくべきです. イデアル $I$ のランクを調べましょう. $G$ の標準単項式は \begin{verbatim} [7] yang.stdmon(G); [dx1,dx2,1] \end{verbatim} で求まります. よって $I$ のランクは 3 です. グレブナ基底が求まったので, $R$ の元 $t=(x_2-x_1)\theta_1^2$ の 正規形を求めましょう. これには \verb|yang.nf| を用います. \begin{verbatim} [8] yang.nf((x2-x1)*dx1^2,G); ((-b1*x1*x2+b1*x1)*dx2+(((-a-b1+b2)*x1+c-b2-1)*x2+(a+b1)*x1^2+(-c+1)*x1)*dx1 -b1*a*x1*x2+b1*a*x1^2)/(x1-1) \end{verbatim} つまり計算結果は $\mathrm{mod}\ I$ で \begin{eqnarray*} t &\equiv& \frac{((-a-b_1+b_2) x_1+c-b_2-1)x_2+(a+b_1)x_1^2+(-c+1) x_1}{x_1-1}\theta_1\\ && \qquad + \frac{-b_1 x_1 x_2+b_1 x_1}{x_1-1}\theta_2 + \frac{-b_1 a x_1 x_2+b_1 a x_1^2}{x_1-1} \end{eqnarray*} 次に $F_1$ の Pfaff 形式を計算しましょう. \begin{verbatim} [9] Base=[1,dx1,dx2]; [10] Pf=yang.pf(Base,G); [ [ 0 (1)/(x1) 0 ] [ (-b1*a)/(x1-1) (((-a-b1+b2)*x1+c-b2-1)*x2+(a+b1)*x1^2+(-c+1)*x1)/((x1^2-x1)*x2-x1^3+x1^2) (-b1*x2+b1)/((x1-1)*x2-x1^2+x1) ] [ 0 (-b2*x2)/(x1*x2-x1^2) (b1)/(x2-x1) ] [ 0 0 (1)/(x2) ] [ 0 (-b2)/(x2-x1) (b1*x1)/(x2^2-x1*x2) ] [ (-b2*a)/(x2-1) (b2*x1-b2)/(x2^2+(-x1-1)*x2+x1) ((-a-b2)*x2^2+((a-b1+b2)*x1+c-1)*x2+(-c+b1+1)*x1)/(x2^3+(-x1-1)*x2^2+x1*x2) ] ] [11] length(Pf); 2 [12] P1 = Pf[0]; [ 0 (1)/(x1) 0 ] [ (-b1*a)/(x1-1) (((-a-b1+b2)*x1+c-b2-1)*x2+(a+b1)*x1^2+(-c+1)*x1)/((x1^2-x1)*x2-x1^3+x1^2) (-b1*x2+b1)/((x1-1)*x2-x1^2+x1) ] [ 0 (-b2*x2)/(x1*x2-x1^2) (b1)/(x2-x1) ] [13] P2 = Pf[1]; [ 0 0 (1)/(x2) ] [ 0 (-b2)/(x2-x1) (b1*x1)/(x2^2-x1*x2) ] [ (-b2*a)/(x2-1) (b2*x1-b2)/(x2^2+(-x1-1)*x2+x1) ((-a-b2)*x2^2+((a-b1+b2)*x1+c-1)*x2+(-c+b1+1)*x1)/(x2^3+(-x1-1)*x2^2+x1*x2) ] \end{verbatim} 計算を説明します. ランクが 3 であることに注意します. 基底を \[ F = \left( \begin{array}{c} f \\ S_1f \\ S_2 f \end{array} \right) = \left( \begin{array}{c} f_1 \\ f_2 \\ f_3 \end{array} \right) \] ととり, $S_i f_j$ の正規形を計算することで Pfaff 形式を求めています. \verb|Pf| は$3\times 3$-行列のリストで長さは $2$ です. 結果は, \[ \frac{\partial}{\partial x_1} \left(\begin{array}{c} f_1 \\ f_2 \\ f_3\end{array}\right) = P_1 \left(\begin{array}{c} f_1 \\ f_2 \\ f_3\end{array}\right), \qquad \frac{\partial}{\partial x_2} \left(\begin{array}{c} f_1 \\ f_2 \\ f_3\end{array}\right) = P_2 \left(\begin{array}{c} f_1 \\ f_2 \\ f_3\end{array}\right) \] ここで, \begin{eqnarray*} P_1 &=& \pmatrix{ 0 & \frac{1}{x_1}& 0 \cr \frac{-b_1 a}{x_1-1} & \frac{((-a -b_1+ b_2) x_1+ c -b_2-1) x_2+ (a+ b_1) x_1^2 + (-c+ 1) x_1}{(x_1^2 -x_1) x_2 -x_1^3 + x_1^2} & \frac{-b_1 x_2+ b_1}{(x_1-1) x_2 -x_1^2 + x_1} \cr 0& \frac{-b_2 x_2}{x_1 x_2-x_1^2} & \frac{b_1}{x_2-x_1} \cr } , \\ P_2 &=& \pmatrix{ 0& 0& \frac{1}{x_2} \cr 0& \frac{-b_2}{x_2-x_1}& \frac{b_1 x_1}{x_2^2 -x_1 x_2} \cr \frac{-b_2 a}{x_2-1}& \frac{b_2 x_1- b_2}{x_2^2 + (-x_1-1) x_2+ x_1} & \frac{(-a-b_2) x_2^2 + ((a -b_1+b_2) x_1+ c-1) x_2 + (-c+ b_1+ 1) x_1}{x_2^3 + (-x_1-1) x_2^2 + x_1 x_2} \cr } \end{eqnarray*} \section{$\mathcal{A}$-超幾何微分差分系を計算してみる} $\mathcal{A}$-超幾何微分差分系については専用の関数が用意されています. まず行列 $A$ と パラメータベクトル $\beta$ が与えられたとき, オイラー微 分演算子の形で方程式系を求める必要があります. \begin{verbatim} [1] load("yang.rr"); [2] A=[[1,1,1],[0,1,2]]; [3] B=[s1,s2]; [4] GKZ=[A,B]; [[[1,1,1],[0,1,2]],[s1,s2]] [5] yang.define_gkz_ring(GKZ); [[x1,x2,x3,s1,s2],[0,0,0,1,1],[0,0,0,-1,-1]] [6] E = yang.gkz(GKZ); [[(1)*<<1,0,0,0,0>>+(1)*<<0,1,0,0,0>>+(1)*<<0,0,1,0,0>>+(-s1)*<<0,0,0,0,0>>, (1)*<<0,1,0,0,0>>+(2)*<<0,0,1,0,0>>+(-s2)*<<0,0,0,0,0>>, (1)*<<1,0,0,0,0>>+(-x1)*<<0,0,0,1,0>>,(-x2)*<<0,0,0,1,1>>+(1)*<<0,1,0,0,0>>, (-x3)*<<0,0,0,1,2>>+(1)*<<0,0,1,0,0>>],[x1,x2,x3]] \end{verbatim} \verb|yang.define_gkz_ring| で微分差分環を定義する. 演算子の分散 多項式表示のうち, 最初の 3 つは$x_i$ に関するオイラー微分演算子, あとの ふたつは $s_i$ に関するシフト演算子である. \verb|yang.gkz| は $\mathcal{A}$-超幾何微分差分系を出力する. $E$ は $\mathcal{A}$-超幾何微分差分系である. トーリックイデアルを計算するには次のようにする. \begin{verbatim} [7] IA=yang.gkz_toric(GKZ); [(x1*x3)*<<0,2,0,0,0>>+(-x2^2)*<<1,0,1,0,0>>+(-x1*x3)*<<0,1,0,0,0>>] \end{verbatim} $IA$ はトーリックイデアルの生成元をオイラー微分演算子の形で書いたもので ある. 通常の偏微分演算子による表示を得るには, \begin{verbatim} [8] yang.compute_toric_kernel(GKZ); [[-_x2*_x0+_x1^2],[_x0,_x1,_x2,_t1,_t2]] \end{verbatim} あるいは \verb|yang.gkz_toric_partial| も使える. \section{APIリファレンス} yang.define\_ring(Ring) 環を定義し、yang の内部データ構造を初期化する。 以前の定義はスタックに積まれる。 環定義における変数の並び順によって、変数順序が定まるので注意すること。 Ring の 定義 \begin{verbatim} Ring := '[' ( Vars | RingDef ) ']' Vars := Variable [ , Variable ]* RingDef := RingEl [ , RingEl ]* RingEl := Keyword , '[' ( Vars | Pairs ) ']' Keyword := "euler" | "differential" | "difference" Pairs := Pair [ , Pair ]* Pair := '[' Variable , ( Number | Variable ) ']' \end{verbatim} yang.pop\_ring() 以前の環定義を取り出す。現在の環定義は破棄される。 yang.operator(Variable) Variable に対応する演算子を取り出す。 演算子は分散表現単項式で与えられる。 yang.constant(Number) Number の環における表現を取り出す。この関数は yang.pfaffian で与える基底 を生成するのに有用である。 yang.multi(DPolynomial, DPolynomial) 演算子同士の積を計算する。 yang.nf(RDPolynomial, Ideal) (別名: yang.reduction) RDPolynomial を Ideal で簡約する。Ideal が グレブナ基底になっている場合には、 正規形になる。 \begin{verbatim} RDPolynomial := DPolynomial | '[' DPolynomial , Polynomial ']' \end{verbatim} yang.buchberger(Ideal) \begin{verbatim} Ideal := '[' RDPolynomial [ , RDPolynomial ]* ']' \end{verbatim} イデアル Ideal のグレブナ基底を計算する。変数順序は 環定義で定まり、項順序は分散表現多項式の表現に依存している。 したがって、入力 Ideal をつくるまえに項順序を定めておく必要がある。 yang.stdmon(Ideal) グレブナ基底 Ideal の標準単項式を計算する。 yang.pfaffian(Base, Ideal) グレブナ基底 Ideal の生成するイデアルの定める微分方程式系に対応する、 Pfaff 方程式系を求める。Pfaff 方程式系の解の基底には Base を用いる。 (この関数は要改良である!!) \begin{verbatim} Base := '[' DMonomial [ , DMonomial ]* ']' \end{verbatim} \end{document}