\documentclass{jarticle} %\usepackage[FVerb,theorem]{rims02} \topmargin -0.5in \oddsidemargin -0.1in \evensidemargin -0.1in \textheight 9.5in \textwidth 6.4in \IfFileExists{my.sty}{\usepackage{my}}{} \IfFileExists{graphicx.sty}{\usepackage{graphicx}}{} \IfFileExists{epsfig.sty}{\usepackage{epsfig}}{} \newtheorem{definition}{定義} \newtheorem{example}{例} \newtheorem{proposition}{命題} \newtheorem{remark}{注意} \title{Risa/Asir における新しい形式の数式の取り扱いについて} \author{野呂 正行, 高山信毅 \\ (神戸大理)} \date{} \begin{document} \maketitle \def\gr{Gr\"obner 基底} \def\st{\, s.t. \,} \def\noi{\noindent} \def\Q{{\bf Q}} \def\Z{{\bf Z}} \def\NF{{\rm NF}} \def\ini{{\rm in}} \def\FN{{\tt FNODE}} \def\QT{{\tt QUOTE}} \def\ve{\vfill\eject} \newcommand{\tmred}[1]{\smash{\mathop{\hbox{\rightarrowfill}}\limits_{\scriptstyle #1}\limits^{\scriptstyle *}}} \begin{abstract} Risa/Asir における柔軟な数式の取り扱いを実現するため, 木構造で表現された数式である \FN 構造体を保持する \QT 型を扱えるよう にした. 標準化をはじめとする \QT に対する種々の操作, および パターンマッチングによる書き換えを実装した. これらを用いた いくつかの例を示す. また, weight を用いた 非可換代数における書き換えの可能性について述べる. \end{abstract} \section{Risa/Asir における数式の取り扱い} Risa/Asir においては, ユーザにより入力された数式は, いったん \FN と呼 ばれる木構造に変換されたのち, {\tt eval()} により再帰的に正規内部表現 (Risa オブジェクト) に変換される. Risa オブジェクトとは, 先頭に共通の 識別子フィールドを持つ一群の構造体であり, {\tt arf\_add()} などのトッ プレベル演算関数は, 受け取った構造体の識別子を見て, 適切な関数に振り分 けるという操作を行う. Risa オブジェクトとしては, 数, 多項式, 有理式, リスト, 配列など30 種類弱が定義されている. さらに, 数は, 有理数, 浮動 小数, 有限体などさらに細かく分類される. いったん Risa オブジェクトに変 換されてしまえば, それぞれ固有の方法により, 効率よい演算が適用できるが, 一方で, たとえば多項式が強制的に展開されてしまうなど, 本来の入力が持っ ていた情報が失われることもある. また, 原則として多項式の積は可換と仮定 されているため, 微分作用素など, 非可換な対象を扱う場合に不自然な操作を 強いられて来た. \begin{example} {\tt dx} を $\partial/\partial x$ の意味に使おうと思っても \begin{verbatim} [0] x*dx; dx*x; [1] dx*x; dx*x; \end{verbatim} のように, 勝手に順序が変えられてしまう. \end{example} また, 以前から指摘されている, Risa/Asir に式の簡単化機能が欠如している点 についても, あらゆるものを多項式に変換してから簡単化するのは不自然である. このような, 数式の柔軟な取り扱いは, Maxima, Maple, Mathematica など の得意とするところであり, これまでは, Risa/Asir の目指すところは, 多項式 演算の高速処理であるとして, 特にこのような方向の開発は進めてこなかった. しかし, 使われ方が多様化した結果, より多様な数式の取り扱いが必要となる 場面が多くなってきたため, より一般の数式の演算および簡単化, 書き換え規則による 書き換えの実装に着手した. \section{\QT 型} 前節で述べたように, Risa/Asir においては, 入力された数式は, Risa オブジェクトに変換される前に, \FN と呼ばれる木構造で保持されている. この \FN をボディ部に持つ Risa オブジェクトである \QT 型を 定義した. これにより, 評価前の木構造を保持できる. \subsection{\QT の入力, 基本操作} \QT 型に対する四則演算などの基本演算は, 木に対する操作として定義する. さらに, 木に対する一般的な操作 (属性, 子の取り出し, 木の再構成など) を Asir の関数として与えることで, ユーザによる数式の操作が可能となる. \QT 型に対する操作は, 実際には \FN に対する操作である. \FN は \begin{center} ($id$ $arg_0$ $arg_1$ $\ldots$) \end{center} というリストで表現され, $arg_i$ の個数, 型は $id$ によりさまざまである. \QT の入力, 変換などの基本操作は次の通りである. \begin{itemize} \item \QT の入力 \QT は {\tt quote}($Expr$) または {\tt `}$Expr$ (バッククォートつき) により入力できる. \item \QT と Risa オブジェクトの相互変換 Risa オブジェクトから \QT を生成するのは {\tt objtoquote}($Obj$), 逆に \QT を評価して Risa オブジェクトを生成するのは {\tt eval\_quote}($Expr$) で行う. \item \QT の分解, 合成 {\tt quote\_to\_funargs}($Expr$) は \QT $Expr$ の \FN の識別子, 引数をリストとして返す. {\tt funargs\_to\_quote}($List$) は, その逆である. \end{itemize} \subsection{\FN の標準形} \FN に対するパターンマッチング, 書き換えを容易に行うために, \FN に対する標準形を定義した. 標準形の計算は {\tt qt\_normalize}($Expr$[,$Mode$]) で行う. $Mode$ は後述する展開モード指定である. \begin{tabbing} AAAAAAAAAAA \= \kill $nf$ \> : $formula$ $|$ $functor$ ($nf$ [, $\ldots$]) $|$ $sum\_of\_monom$\\ $sum\_of\_monom$ \>: $monom$ [$+$ $\cdots$]\\ $monom$ \>: [$formula$ $*$ ] $nfpow$ [$*$ $\cdots$]\\ $nfpow$ \>: $nf$ $|$ $nf^{nf}$\\ $formula$ \>: Risa object \end{tabbing} おおざっぱにいえば, 標準形 $nf$ とは, 標準形のベキ積の Risa オブジェクト 係数つきの和である. ここで, 和は \FN としては, n項和として表現され, 和を構成する単項式 は, ある全順序により整列される. また, 積も n項積として表現される. すなわち, 標準形は, 入力された数式が, Risa オブジェクトを係数環とする 結合代数の元であると見なし, 和の可換性, 積の結合性によりフラットに 整理しなおしたものである. \begin{example} \begin{verbatim} [278] ctrl("print_quote",1)$ /* FNODE をリストで表示 */ [279] `(x+y+z); [u_op,(),[b_op,+,[b_op,+,[internal,x],[internal,y]],[internal,z]]] [280] qt_normalize(`(x+y+z)); [n_op,+,[internal,x],[internal,y],[internal,z]] \end{verbatim} 2 項演算で表現された式が, 標準形では n 項和で表現されていることが分かる. \end{example} これは, Mathematica における標準形 \cite{MMA} と基本的に同じであるが, 積の可換性を仮定していないこと, および, 係数 環をより一般的にしてある点で異なっている \footnote{Mathematica において積の {\tt Orderless} 属性を外すことで, 積を非可換にできるが, 簡単化において異常な挙動を示すようになる (Ver. 4). Ver. 5 の初期の版では, 係数まで非可換になったが, 最近のものでは直っている ようである.}. さらに, 標準形への変換時に, 積に関する分配則を利用して展開された標準形 を得ることもできる. \begin{example} \begin{verbatim} [289] ctrl("print_quote",2)$ /* FNODE を式で表示 */ ctrl(``print_quote'',2)$ [290] qt_normalize(`(x+y)^2); ((x)+(y))^(2) [291] qt_normalize(`(x+y)^2,1); ((x)^(2))+((x)*(y))+((y)*(x))+((y)^(2)) \end{verbatim} \end{example} \subsection{項順序および係数環の設定} 単項式順序および係数環は可変であり, それぞれ次のような関数が用意されている. \begin{itemize} \item 単項式順序の設定 標準形中の単項式順序は, 指定がない場合には, システムが決める不定元 および関数子の順序から誘導される辞書式順序が適用される. その際, 関数呼び出しは, 単なる不定元より順序が上で, 関数子が等しい場合には引数が辞書式に比較される. {\tt qt\_set\_ord}($VarList$) により, $VarList$ に現れる不定元を先頭 とし, のこりをシステムが決めるという順序が設定される. %例 \item 係数環の設定 デフォルトでは係数環は数のみからなるが, いくつかのパラメタを係数環の元 として扱いたい場合, {\tt qt\_set\_coef}($ParamList$) により指定できる. $ParamList$ に指定されたパラメタは, 係数環である可換な有理関数体の不定元 として扱われる. \end{itemize} \begin{example} \begin{verbatim} [304] qt_normalize(`(b*x+a*y)*b*y,1); ((a)*(y)*(b)*(y))+((b)*(x)*(b)*(y)) [305] qt_set_coef([a,b])$ [306] qt_normalize(`(b*x+a*y)*b*y,1); ((b^2)*(x)*(y))+((b*a)*((y)^(2))) /* a,b が係数環に入った; x*y > y^2 */ [307] qt_set_ord([y,x])$ [308] qt_normalize(`(b*x+a*y)*b*y,1); ((b*a)*((y)^(2)))+((b^2)*(x)*(y)) /* y^2 > x*y */ \end{verbatim} \end{example} \section{パターンマッチングによる書き換え} Risa/Asir においては, 不定元とプログラム変数は明確に区別されている. そこで, パターン変数としてプログラム変数を用いることにした. すなわちパターンとは, プログラム変数を含んでもよい \QT である. これ に対し, いくつかの書き換え関数を用意した. \begin{itemize} \item {\tt nqt\_match}($Expr$,$Patten$[,$Mode$]) \QT 式 $Expr$ とパターン $Pattern$ がマッチしたら 1 を返す. さらに, $Pattern$ 中に含まれるプログラム変数にマッチした値が実際に代入される. \item {\tt nqt\_match\_rewrite}($Expr$,$Rule$,$Mode$) $Rule$ は [$Pattern$,$Action$] または [$Pattern$,$Condition$,$Action$] で ある. この関数は, $Expr$ が $Pattern$ にマッチしたら, $Action$ が評価 され, その値が返される. その際, $Action$ 中のパターン変数が, マッチした値に置き換えられる. $Condition$ が指定されている場合には, $Condition$ 中のパターン変数が同様 に置き換えられ評価され, 0 でない場合に $Action$ が評価される. マッチしない 場合には $Expr$ そのものが返される. \end{itemize} \begin{example} \begin{verbatim} [318] nqt_match(`x*y*z-3*u,`X*Y+Z); 1 [319] [X,Y,Z]; [x,(y)*(z),(-3)*(u)] [320] nqt_match_rewrite(`x*y*z,[`X*Y,`X+Y],1); ((y)*(z))+(x) \end{verbatim} \end{example} いずれも実行前に引数が標準形に変換されるが, $Mode$ はその際に展開を行うか どうかを指示する. マッチングにおいては, 最初にマッチした時点の情報が返される \footnote{現状では実装が不完全であり, 同一パターン変数が複数現れるパターン に対してはマッチングに失敗する場合がある.}. $Condition$ および $Action$ にはユーザ定義関数を含めることができる. これにより, 複雑な書き換え規則を書くことができ, また書き換え規則の数を少なく押える ことができる. 現状では, Mathematica で可能な, パターン変数にマッチする型の指定ができ ないため, $Condition$ において型判定を行うことになる. このため, \QT に 対するいくつかの型判定関数を用意した. これらを用いて, 書き換え規則集合を 与えて, 書き換え規則が適用できなるなるまで書き換えを続ける関数 {\tt qt\_rewrite}($Expr$,$Rules$,$Mode$) をユーザ関数として記述した. \begin{example}[$sl_2$の展開環] \begin{verbatim} [336] Rsl=[[`h*e,`e*h+2*e],[`h*f,`f*h-2*f],[`e*f,`f*e+h]]$ 0sec(7e-06sec) [337] qt_rewrite(`e*f^2,Rsl,2); ((f)*(f)*(e))+((2)*(f)*(h))+((-2)*(f)) 1.776e-15sec(0.008608sec) [338] qt_rewrite(`h*e^3,Rsl,2); ((e)*(e)*(e)*(h))+((6)*(e)*(e)*(e)) \end{verbatim} \end{example} \section{\FN の順序づけ} 今回の実装の目的は, ユーザが気軽に書き換え規則を与えて, 一般に非可換な代数 における計算を気軽に試せるような環境を作ることである. 与えられた書き換え規則 の停止性, あるいは合流性に関しては, 項書き換え系の研究者による研究が膨大 にあるが, ここでは深入りはしない. ここでは, 無限ループに陥らないような 実用的な指針として, \FN に対する順序づけおよび weight の使用を提案する. この方法は後述するように多項式環や微分作用素環で用いられる weight ベクトルの考え方の自然な一般化であり, 理論的にも興味深い. 例として, 可換性を定義する場合を考える. 数学的には, 任意の $X$, $Y$ に 対し $XY=YX$ でよいが, たとえばこのまま $[`X*Y,`Y*X]$ という書き換え 規則を 書くともちろん停止しない. この場合, 最も安直な解決方法の一つは, \FN 間に全順序を入れて, 書き換えた場合に順序が大きく(小さく)なる 場合にのみ書き換えを行うという方法である. この場合, 積を構成する有限個 の \FN の並べ変えの中で最も順序が上(下)のものに到達すると停止する. $Action$ が複雑な場合にはこのように簡単には行かないが, 書き換えの方向性を示すものとして全順序を与えることは有効であろう. よって, 書き換え規則に応じて, 全順序をどう選ぶかが問題である. \subsection{\FN の weightと書き換え} 一般に \FN $f$ の weight $w(f)$ を \begin{enumerate} \item $f$ が leaf の場合, 適当な値を与える. 特に係数の weight は 0. \item $f$ が node の場合, $f$ の子の weight 値を引数とし, 識別子で決められた関数を計算してその値をとる. \end{enumerate} により再帰的に決めることができる. 和に対しては $\max()$, 積に対しては和, ベキに対しては積を用いると, 次のようになる. \begin{enumerate} \item $w(f+g)=\max(w(f),w(g))$ \item $w(fg) = w(f)+w(g)$ \item $w(f^n)=nw(f)$ \end{enumerate} % よって, 与えられた書き換え規則集合に対し, このよ %うな weight を見つける, すなわち leaf の値を適切に設定することが重要で %ある. このような weight が作れるクラ %スを与えること, およびそのようなクラスに属する書き換え規則集合に対し, 上の %性質を満たす weight を全て与えることは興味深い問題である. %\subsection{自由結合代数における同次書き換え規則} 以下では, このような weight を有限生成の自由結合代数に対する書き換え に応用することを考える. 係数環を $K$ の上で $ z_1, \ldots, z_n, h $ で生成される自由結合代数 $A$ を $ K \langle z_1, \ldots, z_n, h \rangle $ と書く. $h$ を必要に応じて $z_{n+1}$ と書くこともある. \begin{definition}\rm $A$ での書き換え規則(または関係式, 左辺は必ず単項式) $ L_1 \rightarrow R_1, \ldots, L_m \rightarrow R_m $ が, 同次化 weight ベクトル $H$ について, 同次的書き換え規則であるとは, $R_i$ が $0$ であるかまたは, $ {\rm deg}_H(L_i) = {\rm deg}_H(R_i \mbox{の任意の項}) $ が成立することである. \end{definition} ここで ${\rm deg}_H(\prod z_i^{e_i})$ は $\prod z_i^{e_i}$ の weight $H$ についての(非可換性を無視した)次数である. つまり ${\rm deg}_H(\prod z_i^{e_i}) = \sum e_i H_i $ と定義する ($i$ は重複してあらわれることもある). \begin{example} \rm $ z_2 z_1 \rightarrow z_1 z_2 + h^2 , h z_i \rightarrow z_i h $ は $H=(1,1,1)$ についての同次的書き換え規則である. この例は $x=z_1, \partial = z_2$ とした 1 変数の同次化 Weyl 代数にほかならない. \end{example} 以下 $H$ のすべての成分は正であると仮定し固定する. また$x_1, \ldots, x_n, h $ からなるワードに対する well order $\succ$ を以下ひとつ固定する. 出現する書き換え規則はとくにことわらない限り全て$H$ について同次的書き換え規則 である. \begin{example} \rm 前の例の書き換え規則 $ z_2 z_1 \rightarrow z_1 z_2 + h^2 , h z_i \rightarrow z_i h $ にさらに $ z_2^{p+1} \rightarrow 0, z_1 z_2 \rightarrow p h^2 $ を加えた規則の集合を $R_p$ と書く. ここで $p$ は自然数である. $R_p$ は $H=(1,1,1)$ についての同次的書き換え規則である. \end{example} \begin{definition} \rm $n$ 次元の weight ベクトル $w \in {\bf R}^n $ が同次的書き換え規則 $ \{ L_i \rightarrow R_i \} $ および $\succ$ について 有効 weight ベクトル(admissible weight vector) であるとは次の条件をみたす ことである. 以下 $\tilde w = (w,0) $ ($h$ に対する weight を 0 にしたもの) とおく. \begin{enumerate} \item ${\rm deg}_{\tilde w}(L_i) \geq {\rm deg}_{\tilde w}(R_i)$ \item 左辺と右辺が同じ $w$-次数をもつときは 右辺で左辺と同じ $w$-weight を持つ 項たちは順序 $\succ$ でかならず小さい. \end{enumerate} \end{definition} %% z_2 z_1 --> z_1 z_2 + z_2 z_1 例. z_1 > z_2 (lex) とする. これはだめ. 書き換え規則がある正数ベクトル $H$ について同次的であることから, これらの条件により書き換えが停止性をもつことが分かる. さらに, %% %% z_j z_i \rightarrow c_{ij} z_i z_j + d_{ij}, i0,`Y*X]]$ [248] qt_rewrite(`(x+y-z)^2,Rcomm,1); ((x)^(2))+((2)*(x)*(y))+((-2)*(x)*(z))+((y)^(2))+((-2)*(y)*(z))+((z)^(2)) \end{verbatim} {\tt nqt\_comp()} は比較関数である. \end{example} \begin{example}[外積代数] \begin{verbatim} [249] Rext0=[`X*Y,`qt_is_var(X) && qt_is_var(Y) && nqt_comp(Y,X)>0,`-Y*X]$ [250] Rext1=[`X^N,`eval_quote(N)>=2,`0]$ [251] Rext2=[`X*X,`0]$ [252] Rext=[Rext0,Rext1,Rext2]$ [253] qt_set_coef([a,b,c])$ [254] qt_rewrite(`(a*x+b*y+c*z)*(b*x+c*y+a*z)*(c*x+a*y+b*z),Rext,1); (-a^3+3*c*b*a-b^3-c^3)*(x)*(y)*(z) \end{verbatim} 行列式の計算に相当する. 変数の積を交代的に書き換える規則を定義している. \end{example} \begin{example}[微分] \begin{verbatim} [255] qt_set_coef([a])$ [256] Rd1=[`d(X+Y),`d(X)+d(Y)]$ [257] Rd2=[`d(X*Y),`d(X)*Y+X*d(Y)]$ [258] Rd3=[`d(N),`qt_is_coef(N),`0]$ [259] Rd=[Rd1,Rd2,Rd3]$ [260] qt_rewrite(`d((x+a*y)^2),Rd,1); (d((x)^(2)))+((a)*(d(x))*(y))+((a^2)*(d((y)^(2))))+((a)*(d(y))*(x)) +((a)*(x)*(d(y)))+((a)*(y)*(d(x))) \end{verbatim} \end{example} \begin{example}[Weyl 代数] \begin{verbatim} def member(V,L) { for ( I = 0; L != [] && V != car(L); L = cdr(L), I++ ); return L==[] ? -1 : I; } def qt_weyl_vmul(X,K,Y,L) { extern WeylV, WeylDV; if ( member(X,WeylV) >= 0 || member(Y,WeylDV) >= 0 ) return Y^L*X^K; if ( WeylV[I=member(X,WeylDV)] != Y ) return Y^L*X^K; else { K = eval_quote(K); L = eval_quote(L); M = K>L?L:K; for ( T = 1, I = 0; I <= M; T = idiv(T*K*L,I+1), I++, L--, L-- ) R += T*Y^L*X^K; return R; } } [256] WeylV=[`x,`y,`z]$ [257] WeylDV=[`dx,`dy,`dz]$ [258] qt_set_ord(map(eval_quote,append(WeylV,WeylDV)))$ [259] Rweyl=[[`X^K*Y^L,`qt_is_var(X)&&qt_is_var(Y)&&nqt_comp(Y,X)>0, `qt_weyl_vmul(X,K,Y,L)]]$ [260] qt_rewrite(`((x*dy+y*dx)^2),Rweyl,1); (((x)^(2))*((dy)^(2)))+((2)*(x)*(y)*(dx)*(dy))+((x)*(dx)) +(((y)^(2))*((dx)^(2)))+((y)*(dy)) \end{verbatim} $Action$ にユーザ定義関数を用いることにより, Weyl 代数の書き換え規則を一つ にまとめている. \end{example} \section{まとめ} Risa/Asir における数式の中間的表現である \FN をユーザ言語から操作 するためのインタフェースを実装した. これにより, ユーザが定義する 書き換え規則による数式の書き換えが可能となった. 書き換えの効率については ほとんど考慮できていない. 特に, 標準形への変換と書き換えを並行して 行うことが必要と考えており, 今後の課題の一つである. また, パターン マッチング自体もまだ完全なものとはいえず, 改良すべき点が多くある. 目的に応じた標準的な書き換え規則集合をデフォルトで提供することも 必要である. この書き換えとweight ベクトルによる単項式比較を組み合わせることにより, 自由結合代数における一般的な書き換え計算を論じた. ここで提案した一般化は Weyl 代数の同次化の理論を含む. Risa/Asir で新 しく導入した, \QT に対する一般的な weight ベクトルのメカニズム \verb@ qt_set_weight @ によりわれわれの理論とアルゴリズムのプロトタイ プを容易に試すことが可能である. V. Levandovskyy \cite{LEV} は $G$-algebra の概念を導入して, Singular に実装した. われわれのアプローチを発展させ, 同次化をとおして, well order でない場合にも適用できる グレブナー基底の理論を構成すれば, $G$-algebra より広い範囲の algebra を扱うことが可能となる. 一般的な枠組みの応用として, 将来的には $D$-加群のアルゴリズムを拡張し, Calderon-Moreno 等の導入した algebra を局所的に扱うなどの応用が見込ま れる. また, \FN をユーザ言語より操作する関数を用いることにより, 入力, 出力のユーザインタフェースを大幅に改善できることにも 注意しておきたい. \begin{thebibliography}{99} \bibitem{MMA} S. Wolfram, The MATHEMATICA Book, Fourth Edition. Cambridge University Press (1999). \bibitem{LEV} %V. Levandovskyy, H. Sch\"onemann: %PLURAL - a Computer Algebra System for Noncommutative Polynomial Algebras. %In Proc. ISSAC 2003, ACM Press (2003). V. Levandovskyy, Non-commutative Computer Algebra for Polynomial Algebras: Gr\"obner Bases, Applications and Implementation. Dissertation, Universit\"at Kaiserslautern (2005). \end{thebibliography} \end{document}