=================================================================== RCS file: /home/cvs/OpenXM/src/asir-doc/exp/exp-ja.texi,v retrieving revision 1.11 retrieving revision 1.30 diff -u -p -r1.11 -r1.30 --- OpenXM/src/asir-doc/exp/exp-ja.texi 2004/06/30 09:30:44 1.11 +++ OpenXM/src/asir-doc/exp/exp-ja.texi 2009/02/23 04:00:53 1.30 @@ -1,4 +1,4 @@ -%% $OpenXM: OpenXM/src/asir-doc/exp/exp-ja.texi,v 1.10 2004/06/27 17:44:55 ohara Exp $ +%% $OpenXM: OpenXM/src/asir-doc/exp/exp-ja.texi,v 1.29 2009/02/23 03:41:26 nakayama Exp $ \input texinfo @iftex @catcode`@#=6 @@ -38,9 +38,9 @@ @title 実験的仕様の関数 @subtitle Risa/Asir 実験的仕様関数説明書 @subtitle 1.0 版 -@subtitle 2004 年 6 月 +@subtitle 2008 年 1 月 -@author by Risa/Asir comitters +@author by Risa/Asir committers @page @vskip 0pt plus 1filll Copyright @copyright{} Risa/Asir committers @@ -119,6 +119,37 @@ ChangeLog の項目は www.openxm.org の cvswe * list:: * mapat:: * set_print_function:: +* small_jacobi:: +* flatten_quote:: +* printf:: +* fprintf:: +* sprintf:: +* quote_to_funargs:: +* funargs_to_quote:: +* get_function_name:: +* remove_paren:: +* set_secure_mode:: +* set_secure_flag:: +* initialize_static_variable:: +* eval_quote:: +* nqt_match:: +* nqt_match_rewrite:: +* qt_normalize:: +* qt_set_coef:: +* qt_set_ord:: +* qt_set_weight:: +* nqt_comp:: +* qt_is_var:: +* qt_is_ceof:: +* qt_rewrite:: +* asirgui.hnd:: +* noro_matrix.rr: +* f_res:: +* chdir:: +* pwd:: +* dcurrenttime:: + + @end menu @comment --- ◯◯◯◯ 関数 quotetotex, quotetotex_env の説明 ◯◯◯◯ @@ -1025,8 +1056,1649 @@ ChangeLog @end itemize -@comment --- ◯◯◯◯ 以下他の関数について真似して記述する. ◯◯◯◯ +@node small_jacobi,,, 実験的仕様の関数 +@subsection @code{small_jacobi} +@findex small_jacobi +@comment --- 関数の簡単な説明 --- +@table @t +@item small_jacobi(@var{a},@var{m}) +:: Jacobi 記号の計算 +@end table + +@table @var +@item return +整数 +@item arg1, arg2 +整数 +@end table + +@itemize @bullet +@item + @var{m} が素数のときは Legendre 記号とよばれ, + x^2 = @var{a} mod @var{m} に解があるとき 1, 解がないとき -1 をもどす. +@item +Jacobi 記号は Legendre 記号の積で定義される (初等整数論の本参照). +@item + この関数は machine int の範囲で jacobi 記号を計算する. +@end itemize + +@example +[1286] small_jacobi(2,3); +-1 +[1287] small_jacobi(2,7); +1 +@end example + +@table @t +@item 参照 +http://members.jcom.home.ne.jp/yokolabo/asirlib/ +も見てね. +@end table + +@comment --- ChangeLog を書く. 動機. ソースコードの位置. 変更日時 など CVSサーバを見るため +@noindent +ChangeLog +@itemize @bullet +@item この関数の由来は不明. +@end itemize + + +@node flatten_quote,,, 実験的仕様の関数 +@subsection @code{flatten_quote} +@findex flatten_quote + +@comment --- 関数の簡単な説明 --- +@table @t +@item flatten_quote(@var{q},@var{op}) +:: quote の括弧をとりさる. +@end table + +@table @var +@item return +Quote +@item q +Quote +@item op +演算子を表す文字列. +@end table + +@itemize @bullet +@item +Quote 型のデータは木構造をしている +( quotetolist 参照 ). +@code{quote_flatten()} は, @var{q} の中にあられる演算子 @var{op} +の子供ノードを平等にする. +つまり演算子 @var{op} に関する括弧づけがあった場合それをすべてとりさる. +たとえば (1+2)+(3+4) という表現を 1+2+3+4 に変換する. +@item + 現在の実装では n-ary の演算子は定義されていないので, + 1+2+3 は実は 1+(2+3) と表現されている. + つまり + 演算子は右結合的である. +@item R=0; for (I=0; I, + [u_op,(),[b_op,+,[internal,x],[internal,1]]], + [u_op,(),[b_op,+,[internal,x],[internal,2]]]] + +[3] FA2=quote_to_funargs(FA[2])[1]; +[b_op,+,[internal,x],[internal,1]] + +[4] FA3=quote_to_funargs(FA[3])[1]; +[b_op,+,[internal,x],[internal,2]] + +[5] funargs_to_quote([FA[0],FA[1],FA2,FA3]); +[b_op,+,[b_op,+,[internal,x],[internal,1]], + [b_op,+,[internal,x],[internal,2]]] +@end example + +次の例は OpenXM/asir-contrib 版の asir で実行. +@example +[1287] load("noro_simplify.rr"); +1 +[1293] noro_simplify.remove_paren(quote( f(1-(x)))); +quote(f(1-x)) +@end example + +funargs_to_quote を用いて既存の quote の子供を置き換えて +新しい quote をつくり出せる. +@example +[1184] R=quote_to_funargs(quote(a+(b+c))); +[0,<...quoted...>,<...quoted...>,<...quoted...>] +[1185] T=quote_to_funargs(quote(1+2)); +[0,<...quoted...>,<...quoted...>,<...quoted...>] +[1186] funargs_to_quote([0,R[1],R[2],T[2]]); +quote(a+1) +@end example + +@table @t +@item 参照 +@ref{quotetolist} +@end table + + +@noindent +ChangeLog +@itemize @bullet +@item + これらの関数は 2004-7-8 から開発のはじまっている quote の simplification 関連 + の実験的関数である. + 変更をうけたソースコードは多岐にわたるのでまだ書かない. +@item + 括弧を取り去る問題は OpenXM/fb が蓄えている公式を tex で綺麗に表示するのが動機の一つ. +@item + 2004-6-26 の計算代数セミナーにおいて, 中川さんが simplifier についていろいろ問題提起 +をした (計算代数セミナービデオ参照). +@item parse/quote.c の {\tt strcut fid_spec fid_spec_tab[] } +の部分に書いてある形式に @code{funargs_to_quote} は変換する. +@end itemize + +@node set_secure_flag,,, 実験的仕様の関数 +@subsection @code{set_secure_flag}, @code{set_secure_mode} +@findex set_secure_flag +@findex set_secure_mode + +@comment --- 関数の簡単な説明 --- +@comment --- @itemx は複数に対して説明を一つつける場合に使う --- +@table @t +@item set_secure_flag(@var{fname},@var{m}) +@itemx set_secure_mode(@var{m}) +:: 関数の実行権限を設定する. (web サービス用) +@end table + +@table @var +@item return +整数 +@item fname +文字列 +@item m +整数 +@end table + +@itemize @bullet +@item @code{set_secure_flag}, @code{set_secure_mode} は +asir を web サーバ等で公開するために加えられた関数. +@code{set_secure_flag} で公開する関数を指定する. +@code{secure_mode} が 1 の場合は @code{set_secure_flag} で指定された +関数しか実行できない. +関数の実行途中では @code{secure_mode} が 0 となっているので, +任意の関数を実行できる. +またエラーの時等は, @code{secure_mode} は 1 に自動的に復帰する. +ただし @code{def} は実行できない. +公開する関数では, その処理中は任意の関数が実行できるので, +security に十分注意した実装をする必要がある. +@item +@code{set_secure_flag} は, @var{fname} の secure flag を @var{m} +にする. +公開する命令は 1 に設定する. +@item +@var{set_secure_mode(1)} で @code{secure_mode} が 1 となり, +公開された関数しか実行できなくなる. +quit 等も実行できないので注意. +@item @code{ timer } の引数として secure_flag を設定していない関数を +指定して実行してもエラーが表示されない. +このときは, @code{ ctrl("error_in_timer",1) } を実行しておく. +@end itemize + +@example +[1194] set_secure_flag("print_input_form_",1); +1 +[1195] set_secure_flag("fctr",1); +1 +[220] set_secure_mode(1); +1 +[1197] fctr((x-1)^3); +[[1,1],[x-1,3]] +[1198] fctr(shell("ls")); +evalf : shell not permitted +return to toplevel +@end example + +@table @t +@item 参照 +@ref{timer} +@end table + +@noindent +ChangeLog +@itemize @bullet +@item @code{set_secure_flag}, @code{set_secure_mode} は asir を +web サーバ等で公開するために加えられた関数. +sm1 の同様な関数 RestrictedMode で採用された方法を用いている. +つまり, @code{set_secure_flag} で公開する関数を指定する. +@code{secure_mode} が 1 の場合は @code{set_secure_flag} で指定された +関数しか実行できない. +v関数の実行途中では @code{secure_mode} が 0 となっているので, +任意の関数を実行できる. +@item この関数は 2004-10-27 から 2004-11-22 にかけて開発された. +@item cgiasir.sm1, cgi-asir.sh と組み合わせて cgi サービスを提供するために +利用する. +cgi-asir.sh では +@code{CGI_ASIR_ALLOW} 環境変数で公開するコマンドを指定する. +@item + 1.24--1.25 OpenXM_contrib2/asir2000/builtin/miscf.c +@item + 1.36--1.38 OpenXM_contrib2/asir2000/parse/eval.c +@item + 1.6--1.7 OpenXM_contrib2/asir2000/parse/function.c +@item + 1.33 OpenXM_contrib2/asir2000/parse/parse.h +@end itemize + +@node initialize_static_variable,,, 実験的仕様の関数 +@subsection @code{initialize_static_variable} +@findex initialize_static_variable + + +@comment --- 説明 --- +@table @t +@item static 変数の初期化の問題点. 初期化の時に segmentation fault がおきる. +@end table + + +@itemize @bullet +@item static 変数の取扱. +下の例を参照のこと. +@end itemize + + +@example +if (1) @{ + module abc; + static A; + A=1; + endmodule; +@} else @{ @}; + +end$ +を t.rr とするとき, + +[6] load("./t.rr"); +1 +internal error (SEGV) +となる. + +t.rr を +if (1) @{ + module abc; + static A; + localf initA; + localf foo; + def initA() @{ + A=1; + @} + initA(); + def foo() @{ + return A; + @} + endmodule; +@} else @{ @}; + +end$ +とすると正しく初期化される. +@end example + +@comment --- ChangeLog +@noindent +ChangeLog +@itemize @bullet +@item oxasir-win.rr の取扱で問題点として浮上. 2005.07.25. +@item oxasir-win.rr の取扱で double quote の取り扱いに問題があったが, これは asir2000/io/ox_asir.c, 1.58, で問題点解決. +@item ox_asir に計算を依頼する時は if (1) @{ ... @}で囲む. +@end itemize + +@node eval_quote,,, 実験的仕様の関数 +@subsection @code{eval_quote} +@findex eval_quote + +@comment --- 関数の簡単な説明 --- +@comment --- @itemx は複数に対して説明を一つつける場合に使う --- +@table @t +@item eval_quote(@var{Q}); +:: quote 型データ @var{Q} を asir のオブジェクトに変換する. +@end table + +@table @var +@item return +オブジェクト +@item Q +quote型 +@end table + +@itemize @bullet +@item quote 型データ @var{Q} を asir のオブジェクトに変換する. +@item 逆関数は @code{objtoquote} +@end itemize + +@example +ctrl("print_quote",2); +A=quote((x-1)^2+(x-1)+3); + 出力: ((((x)-(1))^(2))+((x)-(1)))+(3) +eval_quote(A); + 出力: x^2-x+3 +print_input_form(A); /* asir-contrib */ + 出力: quote((x-1)^2+(x-1)+3) +@end example + +@table @t +@item 参照 +@ref{objtoquote}, @ref{quotetolist}, @ref{eval_string}, +@ref{quote_to_funargs}, @ref{funargs_to_quote} +@end table + +@comment --- ChangeLog を書く. 動機. ソースコードの位置. 変更日時 など CVSサーバを見るため +@comment --- openxm の外部からの寄与も述べる. Credit. +@noindent +ChangeLog +@itemize @bullet +@item -----まだ書いてない. +@end itemize + + +@node nqt_match,,, 実験的仕様の関数 +@subsection @code{nqt_match} +@findex nqt_match + +@comment --- 関数の簡単な説明 --- +@comment --- @itemx は複数に対して説明を一つつける場合に使う --- +@table @t +@item nqt_match(@var{Expr},@var{Pattern}[,@var{Mode}]) +:: @var{Expr} が @var{Pattern} にマッチ(適合)すると 1 を戻す. しないと 0 を戻す. +@end table + +@table @var +@item return +整数 +@item Expr +quote型 +@item Pattern +quote型 +@item Mode +整数 +@end table + +@itemize @bullet +@item @var{Expr} が @var{Pattern} にマッチ(適合)すると 1 を戻す. しないと 0 を戻す. +@item 適合した場合, 副作用として, @var{Pattern} に含まれるプログラム変数(大文字ではじまる変数)に適合した値が代入される. +@item nqt は normalized quote の略であり fnode標準形に変換してから適合検査をする. fnode標準形については @ref{qt_normalize} を見よ. +@item @var{Mode} により展開方法を指定し, その展開方法により得られた @var{Expr} の +fnode標準形と @var{Pattern} を比較する. +@end itemize + +@example +ctrl("print_quote",2); +A=quote((x-y)*(x+y)); +nqt_match(A,quote(P*Q)); +[P,Q] + 出力: [x-y, x+y] +nqt_match(A,quote(P*Q),1); + マッチしない. +nqt_match(A,quote(P*Q),2); + マッチしない. +qt_normalize(A,1); + 出力: ((x)^(2))+((x)*(y))+((-1)*((y)^(2)))+((-1)*(y)*(x)) +qt_normalize(A,2); + 出力: ((x)*(x))+((x)*(y))+((-1)*(y)*(x))+((-1)*(y)*(y)) +@end example + +@table @t +@item 参照 +@ref{nqt_match_rewrite}, +@ref{qt_rewrite} +@end table + +@comment --- ChangeLog を書く. 動機. ソースコードの位置. 変更日時 など CVSサーバを見るため +@comment --- openxm の外部からの寄与も述べる. Credit. +@noindent +ChangeLog +@itemize @bullet +@item ----- まだ書いてない. +@end itemize + + +@node nqt_match_rewrite,,, 実験的仕様の関数 +@subsection @code{nqt_match_rewrite} +@findex nqt_match_rewrite + +@comment --- 関数の簡単な説明 --- +@comment --- @itemx は複数に対して説明を一つつける場合に使う --- +@table @t +@item nqt_match_rewrite(@var{Expr},@var{Rule},@var{Mode}) +:: @var{Expr} を @var{Rule} に従い書き換える. +@end table + +@table @var +@item return +quote型 +@item Expr +quote型 +@item Rule +[@var{Pattern},@var{Action}] かまたは +[@var{Pattern},@var{Condition},@var{Action}]. +これらの要素はすべて quote型. +@item Mode +整数 +@end table + +@itemize @bullet +@item @var{Expr} を @var{Rule} に従い書き換える. @var{Pattern} に適合しない場合は +@var{Exprt} 自体を戻す. +@item nqt は normalized quote の略であり fnode標準形に変換してから適合検査をする. fnode標準形については @ref{qt_normalize} を見よ. +@end itemize + +@comment %%Doc: cfep/tests/2006-03-12-qt.rr +@example +ctrl("print_quote",2); +nqt_match_rewrite(`x*y*z,[`X*Y,`X+Y],1); + 出力: (x)+((y)*(z)) +A=`x*x; +nqt_match_rewrite(A,[`X*Y,`X+Y],1); + 出力: x^2 (マッチしていない) +nqt_match_rewrite(A,[`X*Y,`X+Y],2); + 出力: 2*x + +適合についてのモードの違いを理解するために次の例および fnode標準形(qt_normalize) を参照. +quotetolist(qt_normalize(`x*x,0)); + 出力: [b_op,^,[internal,x],[internal,2]] +quotetolist(qt_normalize(`x*x,1)); + 出力: [b_op,^,[internal,x],[internal,2]] +quotetolist(qt_normalize(`x*x,2)); + 出力: [n_op,*,[internal,x],[internal,x]] +@end example + +@table @t +@item 参照 +@ref{nqt_match}, +@ref{qt_rewrite}, +@ref{qt_normalize} +@end table + +@comment --- ChangeLog を書く. 動機. ソースコードの位置. 変更日時 など CVSサーバを見るため +@comment --- openxm の外部からの寄与も述べる. Credit. +@noindent +ChangeLog +@itemize @bullet +@item -----まだ書いてない. +@end itemize + + + +@node qt_normalize,,, 実験的仕様の関数 +@subsection @code{qt_normalize} +@findex qt_normalize + +@comment --- 関数の簡単な説明 --- +@comment --- @itemx は複数に対して説明を一つつける場合に使う --- +@table @t +@item qt_normalize(@var{Expr}[,@var{Mode}]) +:: @var{Expr} を fnode標準形に変換する. @var{Mode}により標準形への展開アルゴリズムを指定できる. +@end table + +@table @var +@item return +quote型 +@item Expr +quote型 +@item Mode +整数 +@end table + +fnodeは quote型の実体である. +fnode は木であり, 型 id および子供からなる. +型および子供を取り出す関数が funargs_to_quote である. +また fnode をリストに変換する関数が quotetolist である. + +fnode の標準形はパターンマッチング, 書き換えを容易におこなうために導入された. +fnode の標準形を fn と書くとき, 標準形の BNF風表現での定義は以下のとおり. +@example + fn = formula | functor(nf [,...]) | sum_of_monom + fnode の標準形. functor は関数よびだしみたいなもの. + sum_of_monom = monom [+ ...] + モノミアルの和 + monom = [formula *] nfpow [* ...] + モノミアル + nfpow = nf | nf^(nf) + 冪乗部分の標準形 + formula = Risa object +@end example + + +@itemize @bullet +@item @var{Expr} を fnode標準形に変換する. @var{Mode}により標準形への展開アルゴリズムを指定できる. +@item 展開は再帰的である. +@item 入力が fnode に変換された初期状態では + や * は子供が2人の binary operator +(b_op) であるが, qt_normalize を作用させることにより, + や * は任意人数の +子供を持てる n-ary operator に変換される. +@item n-ary operator を基礎とした fnode標準形を用いることにより, パターンマッチ用のパターンの数を減らせることが経験的にわかっている. +@item @var{Mode}=0. 展開しない. これが既定の動作. +@item @var{Mode}=1. 展開する. ただし x*x 等を x^2 等に変換 +@item @var{Mode}=2. 展開する. ただし x*x 等を x^2 等に変換しない. +@end itemize + +@var{Mode} の違いについては以下の例も参考に. +@comment %%cfep/tests/2006-03-12-qt.rr +@example +ctrl("print_quote",2); +A=quote((x-y)*(x+y)); + 出力: ((x)-(y))*((x)+(y)) +B=qt_normalize(A,0); + 出力: ((x)+((-1)*(y)))*((x)+(y)) Mode=0. 展開はされない. +, * は n_op (nary-op) へ. +quotetolist(B); + 出力: [n_op,*,[n_op,+,[internal,x],[n_op,*,[internal,-1],[internal,y]]],[n_op,+,[internal,x],[internal,y]]] + +B=qt_normalize(A,1); + 出力: ((x)^(2))+((x)*(y))+((-1)*((y)^(2)))+((-1)*(y)*(x)) + Mode=1. 展開する. +, * は n_op (nary-op) へ. 巾をまとめる. +quotetolist(B); + 出力: [n_op,+,[b_op,^,[internal,x],[internal,2]],[n_op,*,[internal,x],[internal,y]],[n_op,*,[internal,-1],[b_op,^,[internal,y],[internal,2]]],[n_op,*,[internal,-1],[internal,y],[internal,x]]] + +qt_normalize(A,2); + 出力: ((x)*(x))+((x)*(y))+((-1)*(y)*(x))+((-1)*(y)*(y)) + Mode=2. 展開する. +, * は n_op (nary-op) へ. 巾は使わない. +quotetolist(B); + 出力: [n_op,+,[b_op,^,[internal,x],[internal,2]],[n_op,*,[internal,x],[internal,y]],[n_op,*,[internal,-1],[b_op,^,[internal,y],[internal,2]]],[n_op,*,[internal,-1],[internal,y],[internal,x]]] + +qt_normalize(`x^2,2); + 出力: (x)*(x) + Mode=2. 巾は使わない. n-ary の * へ. +@end example + +@table @t +@item 参照 +@ref{nqt_match}, +@ref{nqt_match_rewrite}, +@ref{quotetolist}, +@ref{quote_to_funargs} +@end table + +@comment --- ChangeLog を書く. 動機. ソースコードの位置. 変更日時 など CVSサーバを見るため +@comment --- openxm の外部からの寄与も述べる. Credit. +@noindent +ChangeLog +@itemize @bullet +@item +@end itemize + + +@node qt_set_coef,,, 実験的仕様の関数 +@subsection @code{qt_set_coef} +@findex qt_set_coef + +@comment --- 関数の簡単な説明 --- +@comment --- @itemx は複数に対して説明を一つつける場合に使う --- +@table @t +@item qt_set_coef(@var{ParamList}) +:: 以下 @var{ParamList} に現れる多項式変数を変数とする有理関数体を係数とする +非可換多項式を扱う. +@end table + +@table @var +@item return +リスト +@item ParamList +リスト +@end table + +@itemize @bullet +@item 以下 @var{ParamList} に現れる多項式変数を変数とする有理関数体を係数とする +非可換多項式を扱う. +@item この宣言をしないと係数体を数とする非可換多項式として計算する. +@item qt_normalize およびその機能を用いる関数がこの機能の影響を受ける. +@item qt_comp 関数がこの機能の影響を受ける. +@end itemize + +@example +ctrl("print_quote",2); +qt_set_coef([a]); +B=qt_normalize(quote((a*x+a)^2),2); + 出力: ((a^2)*(x)*(x))+((2*a^2)*(x))+(a^2) +qt_normalize(B+B,2); + 出力: ((2*a^2)*(x)*(x))+((4*a^2)*(x))+(2*a^2) +@end example + +@table @t +@item 参照 +@ref{qt_normalize} +@end table + +@comment --- ChangeLog を書く. 動機. ソースコードの位置. 変更日時 など CVSサーバを見るため +@comment --- openxm の外部からの寄与も述べる. Credit. +@noindent +ChangeLog +@itemize @bullet +@item -----まだ書いてない. +@end itemize + + +@node qt_set_ord,,, 実験的仕様の関数 +@subsection @code{qt_set_ord} +@findex qt_set_ord + +@comment --- 関数の簡単な説明 --- +@comment --- @itemx は複数に対して説明を一つつける場合に使う --- +@table @t +@item qt_set_ord(@var{VarList}) +:: @var{VarList} を変数順序とする. +@end table + +@table @var +@item return +リスト +@item VarList +リスト +@end table + +@itemize @bullet +@item @var{VarList} を辞書式に用いた変数順序を以下使用する. +@item この宣言をしないとある不定元についての既定の辞書式順序-----まだ書いてない---を用いて項を比較する. +@var{VarList} に現れない変数についてはこの順序が適用される. +@item qt_normalize およびその機能を用いる関数がこの機能の影響を受ける. +@item qt_comp 関数がこの機能の影響を受ける. +@end itemize + +@example +ctrl("print_quote",2); +qt_normalize(quote(x+y),2); + 出力: (x)+(y) +qt_set_ord([y,x]); + 出力: [y,x,z,u,v,w,p,q,r,s,t,a,b,c,d,e,f,g, 以下省略 ] +qt_normalize(quote(x+y),2); + 出力: (y)+(x) +@end example + +@table @t +@item 参照 +@ref{qt_normalize}, +@ref{nqt_comp} +@end table + +@comment --- ChangeLog を書く. 動機. ソースコードの位置. 変更日時 など CVSサーバを見るため +@comment --- openxm の外部からの寄与も述べる. Credit. +@noindent +ChangeLog +@itemize @bullet +@item -----まだ書いてない. +@end itemize + + +@node qt_set_weight,,, 実験的仕様の関数 +@subsection @code{qt_set_weight} +@findex qt_set_weight + +@comment --- 関数の簡単な説明 --- +@comment --- @itemx は複数に対して説明を一つつける場合に使う --- +@table @t +@item qt_set_weight(@var{WeightVector}) +:: 変数について weight ベクトルを設定する. +@end table + +@table @var +@item return +リスト +@item WeightVector +リスト +@end table + +fnode f の weight w(f) は次の式で計算する. +@example + f が葉の場合は原則 0. qt_weight_vector で weight が与えられている不定元に + ついてはその値. + + f がnodeの場合は次の規則で再帰的にきめる. + w(f+g) = max(w(f),w(g)) + w(f g) = w(f) + w(g) + w(f^n) = n w(f) + 関数については? -----まだ書いてない. +@end example + +@itemize @bullet +@item @var{WeightVector} でまず順序の比較をして, それから qt_set_order による順序, 最後に既定の順序で比較する. +@var{WeightVector} に現れない変数についての weight は 0 となる. +@item qt_normalize およびその機能を用いる関数がこの機能の影響を受ける. +qt_normalize での展開では, この順序を用いて項がソートされる. +@item qt_comp およびその機能を用いる関数がこの機能の影響を受ける. +@item weight ベクトルによる順序比較についてはグレブナ基底の節@ref{dp_gr_main}も参照. +@end itemize + +@example +ctrl("print_quote",2); +qt_set_weight([[x,-1],[y,-1]]); + 結果: [[x,-1],[y,-1]] +qt_normalize(quote( 1+(x+y)+(x+y)^2),1); + 結果: (1)+(y)+(x)+((y)^(2))+((y)*(x))+((x)^(2))+((x)*(y)) +@end example + +@table @t +@item 参照 +@ref{qt_normalize}, +@ref{qt_set_ord}, +@ref{qt_set_weight}, +@ref{dp_gr_main} +@end table + +@comment --- ChangeLog を書く. 動機. ソースコードの位置. 変更日時 など CVSサーバを見るため +@comment --- openxm の外部からの寄与も述べる. Credit. +@noindent +ChangeLog +@itemize @bullet +@item +@end itemize + + +@node nqt_comp,,, 実験的仕様の関数 +@subsection @code{nqt_comp} +@findex nqt_comp + +@comment --- 関数の簡単な説明 --- +@comment --- @itemx は複数に対して説明を一つつける場合に使う --- +@table @t +@item nqt_cmp(@var{Expr1},@var{Exprt2}) +:: @var{Expr1} と @var{Expr2} の順序を比較する. +@end table + +@table @var +@item return +整数 +@item Expr1, Expr2 +quote型 +@end table + +@itemize @bullet +@item @var{Expr1} と @var{Expr2} の順序を比較する. +@item @var{Expr1} > @var{Exprt2} なら 1. +@item @var{Expr1} < @var{Exprt2} なら -1. +@item @var{Expr1} = @var{Exprt2} (おなじ順序) なら 0. +@end itemize + +@example +ctrl("print_quote",2); +qt_set_ord([y,x]); qt_set_weight([[x,-1],[y,-1]]); +[nqt_comp(`x,`y), nqt_comp(`y,`x), nqt_comp(`x,`x)]; + 出力: [-1,1,0] +@end example + +@table @t +@item 参照 +@ref{qt_normalize}, +@ref{qt_set_ord}, +@ref{qt_set_weight} +@end table + +@comment --- ChangeLog を書く. 動機. ソースコードの位置. 変更日時 など CVSサーバを見るため +@comment --- openxm の外部からの寄与も述べる. Credit. +@noindent +ChangeLog +@itemize @bullet +@item まだ書いてない. +@end itemize +@comment **************************************************************** + +@node qt_is_var,,, 実験的仕様の関数 +@subsection @code{qt_is_var}, @code{qt_is_coef} +@findex qt_is_var +@findex qt_is_coef + +@comment --- 関数の簡単な説明 --- +@comment --- @itemx は複数に対して説明を一つつける場合に使う --- +@table @t +@item qt_is_var(@var{Expr}) +:: @var{Expr} が不定元に対応する quote なら 1 を戻す. +@item qt_is_coef(@var{Expr}) +:: @var{Expr} が係数の有理関数体に属するとき 1 を戻す. +@end table + +@table @var +@item return +整数 +@item Expr +quote型 +@end table + +@itemize @bullet +@item @var{Expr} が不定元に対応する quote なら 1 を戻す. +そうでないとき 0 を戻す. +@end itemize + +@example +[qt_is_var(quote(x)), qt_is_var(quote(3/2))]; + 出力: [1,0] +@end example + +@table @t +@item 参照 +@ref{qt_rewrite}, +@ref{nqt_match_rewrite} +@end table + +@comment --- ChangeLog を書く. 動機. ソースコードの位置. 変更日時 など CVSサーバを見るため +@comment --- openxm の外部からの寄与も述べる. Credit. +@noindent +ChangeLog +@itemize @bullet +@item -----まだ書いてない. +@end itemize +@comment **************************************************************** + +@node qt_rewrite,,, 実験的仕様の関数 +@subsection @code{qt_rewrite} +@findex qt_rewrite + +@comment --- 関数の簡単な説明 --- +@comment --- @itemx は複数に対して説明を一つつける場合に使う --- +@table @t +@item qt_rewrite(@var{Expr},@var{Rules},@var{Mode}) +:: @var{Expr} を規則集合 @var{Rules} を用いて書き換える. +@end table + +@table @var +@item return +quote型 +@item Expr +quote型 +@item Rules +リスト +@item Mode +整数 +@end table + +@itemize @bullet +@item ユーザ言語を用いて定義された関数. +@code{import("noro_rewrite.rr")} しておくこと. +(noro_rewrite.rr が OpenXM/lib/asir-contrib に存在しない場合 +ソースの OpenXM/src/asir-contrib/testing/noro/new_rewrite.rr をコピー) +@item @var{Expr} を規則集合 @var{Rules} を用いて書き換える. +@item 規則の適用は fnode木に対して再帰的である. + 一方 @code{nqt_match_rewrite} ではトップレベルのみに規則が適用される. +@item 規則集合 @var{Rules} の各要素の書き方は @code{nqt_match()} の +@var{Pattern} と同じ書き方. +つまり [パターン, 書き換え結果] または +[パターン, 条件, 書き換え結果]. +@item @var{Mode} の意味は @ref{qt_normalize} の @var{Mode} と同様. +パターンマッチ, 書き換えは @var{Mode} で @code{qt_normalize()} +されてから遂行される. +@end itemize + +注意: 数学的には X*Y=Y*X が可換性を与える規則だが, これをそのまま規則として + 与えると書き換えが停止しない. 次の例では, 上の例のように順序比較し, たとえば, + 順序が大きくなる場合のみに書き換えるべきである. +@example +import("noro_rewrite.rr"); +R=[[`X*Y,`nqt_comp(Y*X,X*Y)>0, `Y*X]]; +qt_rewrite(`(x-y)^2,R,2); + 出力: quote(x*x+-2*x*y+y*y) +@end example + +外積代数の計算 (asir-contrib をロードした状態). +@example +import("noro_rewrite.rr"); +Rext0=[quote(X*Y),quote(qt_is_var(X) && qt_is_var(Y) && nqt_comp(Y,X)>0), + quote(-Y*X)]; +Rext1=[quote(X^N),quote(eval_quote(N)>=2),quote(0)]; +Rext2=[quote(X*X),quote(0)]; +Rext=[Rext0,Rext1,Rext2]; +qt_rewrite(quote( (x+2*y)*(x+4*y) ), Rext,1); + 出力: 2*x*y + +qt_set_coef([a,b,c,d]); +qt_rewrite(quote((a*x+b*y)*(c*x+d*y)), Rext,1); + 出力: (d*a-c*b)*x*y + +@end example + +微分の計算 (asir-contrib をロードした状態). +@example +import("noro_rewrite.rr"); +qt_set_coef([a,b]); +Rd1=[`d(X+Y), `d(X)+d(Y)]; +Rd2=[`d(X*Y),`d(X)*Y+X*d(Y)]; +Rd3=[`d(N), `qt_is_coef(N), `0]; +Rd4=[`d(x),`1]; +Rd=[Rd1,Rd2,Rd3,Rd4]; +B=qt_rewrite( `d( (a*x+b)^3),Rd,2); + 出力: quote(3*a^3*x*x+6*b*a^2*x+3*b^2*a) +fctr(eval_quote(B)); + 出力: [[3,1],[a,1],[a*x+b,2]] +@end example + +@table @t +@item 参照 +@ref{nqt_match}, +@ref{nqt_match_rewrite}, +@ref{qt_normalize} +@end table + +@comment --- ChangeLog を書く. 動機. ソースコードの位置. 変更日時 など CVSサーバを見るため +@comment --- openxm の外部からの寄与も述べる. Credit. +@noindent +ChangeLog +@itemize @bullet +@item qt 系の関数の原型は OpenXM/src/asir-contrib/testing/tr.rr である. +このユーザ言語による開発が 2005年の春まで行われ, そのあと組み込み関数主体の +qt 系の関数が開発された. +@item qt 系の関数についてのその他の参考文献: + OpenXM/doc/Papers/2005-rims-noro.tex および + OpenXM/doc/Papers/2005-rims-noro.tm (TeXmacsの記事). +@item Todo: qt 系の関数を用いたおもしろい計算を Risa/Asir ジャーナルの記事として書く. +@end itemize +@comment **************************************************************** + + +@comment **************************************************************** +@node asirgui.hnd,,, 実験的仕様の関数 +@subsection @code{asirgui.hnd} +@findex asirgui.hnd + +@comment --- 関数の簡単な説明 --- +@comment --- @itemx は複数に対して説明を一つつける場合に使う --- +@table @t +@item asirguid.hnd +:: asirgui の main window のハンドル番号を保持するファイル +@end table + + +@itemize @bullet +@item asirgui (Windows 版) を起動すると asirgui.exe のあるフォルダおよび 環境変数 TEMP が定義されていればこのファイルが作成される. +@item 中身は10進整数で, asirgui の main winodw のハンドルである. このハンドルあてに PostMessage をすれば, asuirgui にキーボードから入力したのと同様な効果が得られる. +@item text editor で作成, 保存したファイルを text editor 側から asirgui に読み込ませたりするために利用可能. +@end itemize + +@example +// Visual C++ 用のテストプログラム. 標準入力を asirgui へ送り込む. +// test.cpp : コンソール アプリケーション用のエントリ ポイントの定義 +// + +#include "stdafx.h" +#include "test.h" +#include +#include +#include +#include +#include + +#ifdef _DEBUG +#define new DEBUG_NEW +#undef THIS_FILE +static char THIS_FILE[] = __FILE__; +#endif + +///////////////////////////////////////////////////////////////////////////// +// 唯一のアプリケーション オブジェクト + +CWinApp theApp; + +using namespace std; + +int _tmain(int argc, TCHAR* argv[], TCHAR* envp[]) +{ + int nRetCode = 0; + + // MFC の初期化および初期化失敗時のエラーの出力 + if (!AfxWinInit(::GetModuleHandle(NULL), NULL, ::GetCommandLine(), 0)) + { + // TODO: 必要に応じてエラー コードを変更してください。 + cerr << _T("Fatal Error: MFC initialization failed") << endl; + nRetCode = 1; + } + else + { + // TODO: この位置にアプリケーションの動作を記述してください。 + CString strHello; + strHello.LoadString(IDS_HELLO); + cout << (LPCTSTR)strHello << endl; + } + HWND hnd; + FILE *fp = fopen("c:/Program Files/asir/bin/asirgui.hnd","r"); + fscanf(fp,"%d",&hnd); + fclose(fp); + while (1) { + int c; + c = getchar(); + if ( c == '#' ) break; + PostMessage(hnd,WM_CHAR,c,1); + } + return nRetCode; +} +@end example + +@table @t +@item 参照 +@ref{xyz_abc} +@end table + +@comment --- ChangeLog を書く. 動機. ソースコードの位置. 変更日時 など CVSサーバを見るため +@comment --- openxm の外部からの寄与も述べる. Credit. +@noindent +ChangeLog +@itemize @bullet +@item この機能は 2006-12-5, 2007-02-13 に加えられた. +@item @code{OpenXM_contrib2/windows/asir32gui/asir32gui.clw} 1.11 +@item @code{OpenXM_contrib2/windows/asir32gui/asir32guiview.cpp} 1.15, 1.1.6 +@end itemize +@comment **************************************************************** + +@node noro_matrix.rr,,, 実験的仕様の関数 +@subsection @code{noro_matrix.rr} +@findex noro_matrix.rr + +@comment --- 関数の簡単な説明 --- +@comment --- @itemx は複数に対して説明を一つつける場合に使う --- +@table @t +@item linalg.unit_mat(@var{arg1}) +@item linalg.random_rmat(@var{arg1}, @var{arg2}, @var{arg3}) +@item linalg.minipoly_mat(@var{arg1}) +@item linalg.compute_kernel(@var{arg1}) +@item linalg.compute_image(@var{arg1}) +@item linalg.jordan_canonical_form(@var{arg1}) +@end table + + +@itemize @bullet +@item 簡単な解説および実例は http://www.math.kobe-u.ac.jp/HOME/taka/2007/knx/noro_matrix-ja.txt を参照. +@end itemize + +@example +load("noro_matrix.rr"); +A=newmat(4,4,[[2,0,0,0],[3,5,1,0],[-9,-9,-1,0],[-5,0,0,1]]); +B=linalg.jordan_canonical_form(A); +@end example + +@table @t +@item 参照 +@ref{invmat} +@end table + +@comment --- ChangeLog を書く. 動機. ソースコードの位置. 変更日時 など CVSサーバを見るため +@comment --- openxm の外部からの寄与も述べる. Credit. +@noindent +ChangeLog +@itemize @bullet +@item この関数は 2004-04 頃から線形代数III の講義をしながら書かれた. +@item ソース: OpenXM/src/asir-contrib/packages/src/noro_matrix.rr +@end itemize + + +@node f_res,,, 実験的仕様の関数 +@subsection @code{f_res} +@findex f_res + +@comment --- 関数の簡単な説明 --- +@table @t +@item f_res +@end table + + +@itemize @bullet +@item f_res は各種の終結式を計算するモジュールである. ox_grep("f_res"); で online manual を閲覧可能である. +@end itemize + +@table @t +@item 参照 +@ref{} +@end table + +@comment --- ChangeLog を書く. 動機. ソースコードの位置. 変更日時 など CVSサーバを見るため +@comment --- openxm の外部からの寄与も述べる. Credit. +@noindent +ChangeLog +@itemize @bullet +@item このモジュールは Fujiwara 君の修士論文が元になり, それを改造したものである. +@item OpenXM/src/ox_cdd, OpenXM/src/asir-contrib/packages/src/f_res.rr +@end itemize + + +@node chdir,,, 実験的仕様の関数 +@subsection @code{chdir}, @code{pwd} +@findex chdir +@findex pwd + +@comment --- ディレクトリ操作 --- +@table @t +@item chdir(@var{directory}) +@item pwd() +:: シェルコマンド cd と pwd に対応する操作. +@end table + +@table @var +@item return +文字列(@code{pwd}), 整数(@code{chdir}) +@item dirctory +文字列 +@end table + +@itemize @bullet +@item +@code{pwd} はカレントディレクトリを文字列で返す. +@item +@code{chdir} はカレントディレクトリを @var{directory} に変更する. 成功すれば 0 を失敗すれば -1 を返す. +@item +これらの関数は UNIX 版にのみ実装されている. +@end itemize + +@example +[0] S=pwd(); +/home/ohara +[1] chdir(".../taka"); +-1 +[2] chdir("/usr/bin"); +0 +@end example + +@comment --- ChangeLog を書く. 動機. ソースコードの位置. 変更日時 など CVSサーバを見るため +@comment --- openxm の外部からの寄与も述べる. Credit. +@noindent +ChangeLog +@itemize @bullet +@item +これらの関数は 2008-8-27 にコミットされた. +変更をうけたソースコードは builtin/miscf.c (1.27) である. +@end itemize + + +@node dcurrenttime,,, 実験的仕様の関数 +@subsection @code{dcurrenttime} +@findex dcurrenttime + +@comment --- 現在時刻を取得 --- +@table @t +@item dcurrenttime() +:: 現在時刻を取得. +@end table + +@table @var +@item return +浮動小数点数 +@end table + +@itemize @bullet +@item +返り値は1970年1月1日0時0分0秒からの経過秒数である. +@end itemize + +@example +[0] ctrl("real_digit", 16); +16 +[1] dcurrenttime(); +1226390851.34476 +[2] currenttime(); +1226390854 +@end example + +@table @t +@item 参照 +@ref{currenttime} +@end table + +@comment --- ChangeLog を書く. 動機. ソースコードの位置. 変更日時 など CVSサーバを見るため +@comment --- openxm の外部からの寄与も述べる. Credit. +@noindent +ChangeLog +@itemize @bullet +@item +この関数は 2008-9-12 にコミットされた. +変更をうけたソースコードは builtin/time.c (1.6) である. +@end itemize + +@node nk_restriction.restriction,,, 実験的仕様の関数 +@subsection @code{nk_restriction.restriction} +@comment --- 索引用キーワード +@findex nk_restriction.restriction + +@comment --- 関数の簡単な説明 --- +@table @t +@item nk_restriction.restriction(@var{Id}, @var{VL}, @var{DVL}, @var{W}) +:: ホロノミック D イデアル @var{Id} を重みベクトル @var{W} についての制限加群を返す。 +@end table + +@comment --- 引数の簡単な説明 --- +@table @var +@item Id +イデアルの生成元のリスト +@item VL +変数のリスト +@item DVL +変数のリスト(@var{VL} に対応する微分作用素の方の変数) +@item W +重みベクトルを表すリスト +@end table + +@itemize @bullet +@item +@var{W} の要素は非負整数で、0 番目の要素から連続して正の整数が入らなければならない。 +(すなわち、@code{[1,1,0,0,0]} は OK だが、 @code{[1,0,1,0,0]} はダメ) +@item +正の重みを持つ変数についての制限を行う。 +例えば、@var{VL} @code{=[x,y,z]}, @var{W} @code{=[1,1,0]} であれば +x,y について制限を行う。 +@end itemize + +以下は、イデアル +@tex +$I = D \cdot \{x \partial_x -1, y \partial_y - 1\} $ +@end tex +の +@tex $x$ @end tex +についての制限加群を計算した例である。 +@example +[1432] nk_restriction.restriction([x*dx-1,y*dy-1],[x,y],[dx,dy],[1,0]); +-- generic_bfct_and_gr :0.001sec(0.001629sec) +generic bfct : [[1,1],[s-1,1]] +S0 : 1 +B_{S0} length : 2 +-- fctr(BF) + base :0.000999sec(0.0005109sec) +[[y*dy-1,(y*dy-1)*dx,-1],[[1],[0]]] +[1433] +@end example + +@node nk_restriction.restriction_ideal,,, D 加群の制限に関する関数 +@subsection @code{nk_restriction.restriction_ideal} +@comment --- 索引用キーワード +@findex nk_restriction.restriction_ideal + +@comment --- 関数の簡単な説明 --- +@table @t +@item nk_restriction.restriction_ideal(@var{Id}, @var{VL}, @var{DVL}, @var{W}) +:: ホロノミック D イデアル @var{Id} を重みベクトル @var{W} についての制限イデアルを返す。 +@end table + +@comment --- 引数の簡単な説明 --- +@table @var +@item Id +イデアルの生成元のリスト +@item VL +変数のリスト +@item DVL +変数のリスト(@var{VL} に対応する微分作用素の方の変数) +@item W +重みベクトルを表すリスト +@end table + +@itemize @bullet +@item +@var{W} の要素は非負整数で、0 番目の要素から連続して正の整数が入らなければならない。 +(すなわち、@code{[1,1,0,0,0]} は OK だが、 @code{[1,0,1,0,0]} はダメ) +@item +正の重みを持つ変数についての制限を行う。 +例えば、@var{VL} @code{=[x,y,z]}, @var{W} @code{=[1,1,0]} であれば +x,y について制限を行う。 +@end itemize + +以下は、イデアル +@tex +$I = D \cdot \{x \partial_x -1, y \partial_y - 1\} $ +@end tex +の +@tex $x$ @end tex +についての制限イデアルを計算した例である。 +@example +[1346] nk_restriction.restriction_ideal([x*dx-1,y*dy-1],[x,y],[dx,dy],[1,0]); +-- generic_bfct_and_gr :0.002sec(0.001652sec) +generic bfct : [[1,1],[s-1,1]] +S0 : 1 +B_{S0} length : 2 +-- fctr(BF) + base :0sec(0.000566sec) +-- restriction_ideal_internal :0.001sec(0.0007441sec) +[-1] +[1347] +@end example + +@node nk_restriction.integration,,, 実験的仕様の関数 +@subsection @code{nk_restriction.integration} +@comment --- 索引用キーワード +@findex nk_restriction.integration + +@comment --- 関数の簡単な説明 --- +@table @t +@item nk_restriction.integration(@var{Id}, @var{VL}, @var{DVL}, @var{W}) +:: ホロノミック D イデアル @var{Id} を重みベクトル @var{W} についての積分加群を返す。 +@end table + +@comment --- 引数の簡単な説明 --- +@table @var +@item Id +イデアルの生成元のリスト +@item VL +変数のリスト +@item DVL +変数のリスト(@var{VL} に対応する微分作用素の方の変数) +@item W +重みベクトルを表すリスト +@end table + +@comment --- ここで関数の詳しい説明 --- +@comment --- @itemize〜@end itemize は箇条書き --- +@comment --- @bullet は黒点付き --- +@itemize @bullet +@item +@var{W} の要素は非負整数で、0 番目の要素から連続して正の整数が入らなければならない。 +(すなわち、@code{[1,1,0,0,0]} は OK だが、 @code{[1,0,1,0,0]} はダメ) +@item +正の重みを持つ変数についての積分を行う。 +例えば、@var{VL} @code{=[x,y,z]}, @var{W} @code{=[1,1,0]} であれば +x,y について積分を行う。 +@end itemize + +以下は、イデアル +@tex +$I = D \cdot \{2 t \partial_x + \partial_t, t \partial_t + 2 x \partial_x + 2\} $ +@end tex +の +@tex $t$ @end tex +についての積分イデアルを計算した例である。([SST, Ex5.5.2, Ex5.5.6]) +@example +[1351] nk_restriction.integration([2*t*dx+dt,2*x*dx+t*dt+2],[t,x], +[dt,dx],[1,0]); +-- generic_bfct_and_gr :0.001sec(0.001796sec) +generic bfct : [[1,1],[s,1],[s-1,1]] +S0 : 1 +B_{S0} length : 2 +-- fctr(BF) + base :0.001sec(0.0006731sec) +[[4*x*dx^2+6*dx,-4*t*x*dx^2-6*t*dx,2*x*dx+1,-2*t*x*dx,2*t*dx],[[1],[0]]] +@end example + +@node nk_restriction.integration_ideal,,, 実験的仕様の関数 +@subsection @code{nk_restriction.integration_ideal} +@comment --- 索引用キーワード +@findex nk_restriction.integration_ideal + +@comment --- 関数の簡単な説明 --- +@table @t +@item nk_restriction.integration_ideal(@var{Id}, @var{VL}, @var{DVL}, @var{W}) +:: ホロノミック D イデアル @var{Id} を重みベクトル @var{W} についての積分イデアルを返す。 +@end table + +@comment --- 引数の簡単な説明 --- +@table @var +@item Id +イデアルの生成元のリスト +@item VL +変数のリスト +@item DVL +変数のリスト(@var{VL} に対応する微分作用素の方の変数) +@item W +重みベクトルを表すリスト +@end table + +@comment --- ここで関数の詳しい説明 --- +@comment --- @itemize〜@end itemize は箇条書き --- +@comment --- @bullet は黒点付き --- +@itemize @bullet +@item +@var{W} の要素は非負整数で、0 番目の要素から連続して正の整数が入らなければならない。 +(すなわち、@code{[1,1,0,0,0]} は OK だが、 @code{[1,0,1,0,0]} はダメ) +@item +正の重みを持つ変数についての積分を行う。 +例えば、@var{VL} @code{=[x,y,z]}, @var{W} @code{=[1,1,0]} であれば +x,y について積分を行う。 +@end itemize + +以下は、イデアル +@tex +$I = D \cdot \{2 t \partial_x + \partial_t, t \partial_t + 2 x \partial_x + 2\} $ +@end tex +の +@tex $t$ @end tex +についての積分イデアルを計算した例である。([SST, Ex5.5.2, Ex5.5.6]) +@example +[1431] nk_restriction.integration_ideal([2*t*dx+dt,t*dt+2*x*dx+2],[t,x], +[dt,dx],[1,0]); +-- generic_bfct_and_gr :0.002999sec(0.002623sec) +generic bfct : [[1,1],[s,1],[s-1,1]] +S0 : 1 +B_{S0} length : 2 +-- fctr(BF) + base :0.001sec(0.001091sec) +-- integration_ideal_internal :0.002sec(0.001879sec) +[2*x*dx+1] +[1432] +@end example + +@noindent +ChangeLog +@itemize @bullet +@item これらの関数は OpenXM/src/asir-contrib/packages/src/nk_restriction.rr で定義されている. nk_restriction.rr, 1.1--1.6 を見よ. +@end itemize + + + +@comment ----------- 以下は見本. 消すな. +@comment **************************************************************** +@comment --- ◯◯◯◯ 以下他の関数について真似して記述する. ◯◯◯◯ @comment 新しい関数の説明を書くためのテンプレートである. 消すな. @comment --- ◯◯◯◯ 関数 syz_pqr, xyz_stu の説明 ◯◯◯◯ @comment --- 複数の関数をまとめて説明する例 ---