Add mathjax for dgeqrf
[maxima.git] / doc / info / ja / Itensor.texi
blobd4b59e2367cf79514af906ae00602b78ab186fc3
1 @c RECOMMEND REVISE TEXT THROUGHOUT TO LOSE NOTION OF TIME RELATIVE TO PRESENT
2 @c LOOK FOR "NOW", "OLD", "NEW", "RECENT", "EARLIER", DATES
4 @c RERUN EXAMPLES WITH ADDT'L WHITESPACE IN INPUT TO AID LEGIBILITY
6 @menu
7 * Introduction to itensor::
8 * Functions and Variables for itensor::
9 @end menu
11 @c -----------------------------------------------------------------------------
12 @node Introduction to itensor, Functions and Variables for itensor, itensor, itensor
13 @section Introduction to itensor
14 @c -----------------------------------------------------------------------------
16 Maximaは、記号的なテンソル操作を2つの異なったタイプで実装しています:
17 成分テンソル操作(@code{ctensor}パッケージ)と添字テンソル操作(@code{itensor}パッケージ)。
19 注意せよ: 以下の'新しいテンソル表記'に関するノートを参照してください。
21 成分テンソル操作は、
22 幾何学的テンソルオブジェクトが配列または行列で表現されることを意味します。
23 縮約や共変微分のようなテンソル演算は実際に、
24 @code{do}文を伴う繰り返し用(ダミー)添字上の和によって実行されます。
25 すなわち、配列や行列に記憶された適切なテンソル成分上で陽に演算を実行します。
27 添字テンソル操作は、
28 共変、反変、そして微分添字の関数としてテンソルを表現することで実装されています。
29 縮約や共変微分のようなテンソル演算は、
30 対応する成分よりむしろ添字それ自身を操作することで実行されます。
32 Riemann幾何の文脈での微分的、代数的、解析的処理へのこれらの2つのアプローチは、
33 ユーザーの問題の個々の性質と難しさを通してだけ明らかにされる様々な利点と欠点を持ちます。
34 しかしながら、2つの実装の以下の特性を心にとどめて置くべきです:
36 成分を陽に使ったテンソルとテンソル演算の表現は、
37 @code{ctensor}を使いやすくします。
38 軽量の指定と、帰納されたテンソルと不変量の計算は容易です。
39 Maximaの強力な整理能力すべてはいつでも使えますが、
40 入り組んだ関数的、座標依存性を持つ複雑な計量は、簡単に、サイズが極端で、構造が隠された式に
41 至ります。
42 さらに、たくさんの計算は、増大する中間式を含み、プログラムが完了前に終了する原因となります。
43 経験を通して、ユーザーはこれらの難しさの多くを避けることができます。
45 テンソルとテンソル演算が添字上の記号演算を使って表される特別な方法のために、
46 成分表現では処理できなかった式が、時々、
47 @code{itensor}の中の対称オブジェクトに関する特別なルーチンを使うことで、
48 たいそう整理することができます。
49 この方法で、大きな式の構造がもっと明白になるかもしれません。
50 他方で、
51 @code{itensor}の中の特別な添字表現のために、
52 いくつかの場合、
53 ユーザーは、計量の指定や関数の定義、微分された「添字付き」オブジェクトの評価に
54 難しさを見いだすかもしれません。
56 @code{itensor}パッケージは、添字付き変数に関する微分を実行できます。
57 それは、ラグランジアンとハミルトニアン形式を扱う時にパッケージを使うことができます。
58 (添字付き)場の変数に関する場のラグランジアンを微分することが可能なので、
59 Maximaを、対応するEuler-Lagrange方程式を添字形式で得るのに使うことができます。
60 これらの方程式は、
61 @code{ic_convert}関数を使って、成分テンソル(@code{ctensor})プログラムに翻訳することができ、
62 それは場の方程式を個別の座標表現で解くことや、
63 ハミルトニアン形式の運動方程式を計算し直すことを可能にします。
64 2つの包括的な例として、@code{einhil.dem}と@code{bradic.dem}を参照してください。
65 最初の@code{einhil.dem}は、
66 斉次で等方的な場合(Friedmann方程式)と
67 球対称で静的な場合(Schwarzschild解)に
68 のEinsteinの場テンソルを得るために
69 Einstein-Hilbert作用を使います。
70 二番目の@code{bradic.dem}は、
71 Brans-Dicke重力理論の作用からFriedmann方程式を計算する方法を示し、
72 理論のスカラー場に関連したハミルトニアンも演繹します。
74 @opencatbox
75 @category{Tensors}
76 @category{Share packages}
77 @category{Package itensor}
78 @closecatbox
80 @c -----------------------------------------------------------------------------
81 @subsection New tensor notation
82 @c -----------------------------------------------------------------------------
84 Maximaの@code{itensor}パッケージの初期のバージョンは、
85 時々、間違った添字順序に至る表記を使いました。
86 例えば、以下を考えてください:
88 @example
89 (%i2) imetric(g);
90 (%o2)                                done
91 (%i3) ishow(g([],[j,k])*g([],[i,l])*a([i,j],[]))$
92                                  i l  j k
93 (%t3)                           g    g    a
94                                            i j
95 (%i4) ishow(contract(%))$
96                                       k l
97 (%t4)                                a
98 @end example
100 @code{a}が偶然対称テンソルでなければ、
101 この結果は間違っています
102 これが起こる理由は、
103 @code{itensor}は正しく共変添字と反変添字の集合の中の順序を保つけれども、
104 一旦、添字が上がったり、下がったりすると、
105 添字の他の集合に関する位置が失われるからです。
107 この問題を避けるため、
108 存在する表記と完全に互換性を残し、相互に使うことが可能な新しい表記が開発されました。
109 この表記では、反変添字は、共変添字リストの中の適切な位置に挿入されますが、
110 マイナス記号が前に付けられます。
111 現在、@code{contract}や@code{ishow}のような関数は、
112 この新しい添字表記に通じており、
113 テンソルを適切に処理することができます。
115 この新しい表記では、以前の例は正しい結果をもたらします:
117 @example
118 (%i5) ishow(g([-j,-k],[])*g([-i,-l],[])*a([i,j],[]))$
119                                  i l       j k
120 (%t5)                           g    a    g
121                                       i j
122 (%i6) ishow(contract(%))$
123                                       l k
124 (%t6)                                a
125 @end example
127 現在、
128 この表記を使う唯一のコードは、@code{lc2kdt}関数です。
129 数値添字に頼らずLevi-Civita記号を決定するために計量テンソルを用いる時、
130 この表記を通じて、一貫した結果を達成します。
132 このコードはできたばかりなので、おそらくバグを含みます。
133 「古い」テンソル表記を使った何かを壊さないことを確認するためにテストされている一方、
134 「新しい」テンソルが
135 特定の関数や特徴と相互運営するのに失敗する相当な可能性があります。
136 これらのバグは、出会った時修正されるでしょう。それまでは、利用者責任!
139 @c -----------------------------------------------------------------------------
140 @subsection Indicial tensor manipulation
141 @c -----------------------------------------------------------------------------
143 添字テンソル操作パッケージは@code{load("itensor")}でロードできます。
144 デモも利用可能です: @code{demo(tensor)}を試してください。
146 @code{itensor}では、
147 テンソルは「添字付きオブジェクト」として表されます。
148 これは
149 共変、反変、微分添字を表す添字の3つのグループの関数です。
150 共変添字は添字付きオブジェクトの最初の引数としてリストで指定され、
151 半変添字は二番目の引数としてリストで指定されます。
152 もし添字付きオブジェクトが添字のグループのいずれかを欠いているなら、
153 空のリスト@code{[]}が対応する引数として与えられます。
154 例えば、@code{g([a,b],[c])}は、
155 2つの共変添字@code{(a,b)}と1つの反変添字(@code{c})を持ち、微分添字を持たない
156 @code{g}と呼ばれる添字付きオブジェクトを表します。
158 もし存在するなら、微分添字は、テンソルを表すシンボル関数の追加の引数として添えられます。
159 それらは、ユーザーによって陽に指定されたり、ある座標変数に関する微分の処理の中で生成されたりします。
160 常微分は可換なので、
161 フレーム計量が使われることを示す@code{iframe_flag}が@code{true}に設定されない限り、
162 微分添字はアルファベット順に並び替えられます。
163 この標準オーダーは、Maximaが、例えば、@code{t([a],[b],i,j)}が@code{t([a],[b],j,i)}と同じだと認識することを可能にします。
164 添字付きオブジェクトの引数として現れない添字の座標に関する
165 添字付きオブジェクトの微分は、通常ゼロをもたらします。
166 これは、Maximaが添字付きオブジェクトで表されたテンソルが対応する座標に陰に依存するかもしれないことを知らないためです。
167 @code{itensor}現在のMaxima関数@code{diff}を修正したことで、
168 そうでなければ記述されない限り、Maximaは、添字付きオブジェクトすべてが微分の任意の変数に依存することを現在仮定します。
169 これは、和の慣例が微分添字に拡張されることを可能にします。
170 @code{itensor}は微分添字を上げる能力を所有しないこと、そしてそれらは常に共変として扱われることに注意すべきです。
172 以下の関数が添字付きオブジェクトを操作するためにテンソルパッケージの中で利用可能です。
173 現在、整理ルーチンに関して、添字付きオブジェクトがデフォルトで対称性を持たないことを仮定します。
174 これは、変数@code{allsym[false]}を@code{true}に設定することで上書きすることができます。
175 これによって、すべての添字付きオブジェクトを共変添字のリストと反変添字のリストに関して完全に対称に扱うようになります。
177 @code{itensor}パッケージは、一般にテンソルを不透明なオブジェクトとして扱います。
178 テンソル等式は、代数ルール、特に対称性と縮約ルールに基づいて操作されます。
179 加えて、@code{itensor}パッケージは、共変微分、曲率、ねじれ率を理解します。
180 計算は、@code{iframe_flag}変数の設定に依存して動枠の計量に関して実行されます。
182 以下のサンプルセッションは、
183 @code{itensor}パッケージをロードし、計量名を指定し、いくつかの簡単な計算を実行する仕方を
184 例示します。
186 @example
187 (%i1) load("itensor");
188 (%o1)      /share/tensor/itensor.lisp
189 (%i2) imetric(g);
190 (%o2)                                done
191 (%i3) components(g([i,j],[]),p([i,j],[])*e([],[]))$
192 (%i4) ishow(g([k,l],[]))$
193 (%t4)                               e p
194                                        k l
195 (%i5) ishow(diff(v([i],[]),t))$
196 (%t5)                                  0
197 (%i6) depends(v,t);
198 (%o6)                               [v(t)]
199 (%i7) ishow(diff(v([i],[]),t))$
200                                     d
201 (%t7)                               -- (v )
202                                     dt   i
203 (%i8) ishow(idiff(v([i],[]),j))$
204 (%t8)                                v
205                                       i,j
206 (%i9) ishow(extdiff(v([i],[]),j))$
207 (%t9)                             v    - v
208                                    j,i    i,j
209                                   -----------
210                                        2
211 (%i10) ishow(liediff(v,w([i],[])))$
212                                %3          %3
213 (%t10)                        v   w     + v   w
214                                    i,%3    ,i  %3
215 (%i11) ishow(covdiff(v([i],[]),j))$
216                                               %4
217 (%t11)                        v    - v   ichr2
218                                i,j    %4      i j
219 (%i12) ishow(ev(%,ichr2))$
220                 %4 %5
221 (%t12) v    - (g      v   (e p       + e   p     - e p       - e    p
222         i,j            %4     j %5,i    ,i  j %5      i j,%5    ,%5  i j
224                                          + e p       + e   p    ))/2
225                                               i %5,j    ,j  i %5
226 (%i13) iframe_flag:true;
227 (%o13)                               true
228 (%i14) ishow(covdiff(v([i],[]),j))$
229                                              %6
230 (%t14)                        v    - v   icc2
231                                i,j    %6     i j
232 (%i15) ishow(ev(%,icc2))$
233                                              %6
234 (%t15)                        v    - v   ifc2
235                                i,j    %6     i j
236 (%i16) ishow(radcan(ev(%,ifc2,ifc1)))$
237              %6 %7                    %6 %7
238 (%t16) - (ifg      v   ifb       + ifg      v   ifb       - 2 v
239                     %6    j %7 i             %6    i j %7      i,j
241                                              %6 %7
242                                         - ifg      v   ifb      )/2
243                                                     %6    %7 i j
244 (%i17) ishow(canform(s([i,j],[])-s([j,i])))$
245 (%t17)                            s    - s
246                                    i j    j i
247 (%i18) decsym(s,2,0,[sym(all)],[]);
248 (%o18)                               done
249 (%i19) ishow(canform(s([i,j],[])-s([j,i])))$
250 (%t19)                                 0
251 (%i20) ishow(canform(a([i,j],[])+a([j,i])))$
252 (%t20)                            a    + a
253                                    j i    i j
254 (%i21) decsym(a,2,0,[anti(all)],[]);
255 (%o21)                               done
256 (%i22) ishow(canform(a([i,j],[])+a([j,i])))$
257 (%t22)                                 0
258 @end example
260 @c end concepts itensor
262 @c -----------------------------------------------------------------------------
263 @node Functions and Variables for itensor,  , Introduction to itensor, itensor
264 @section Functions and Variables for itensor
265 @subsection Managing indexed objects
266 @c -----------------------------------------------------------------------------
268 @c -----------------------------------------------------------------------------
269 @anchor{dispcon}
270 @deffn  {関数} dispcon (@var{tensor_1}, @var{tensor_2}, ...)
271 @deffnx {関数} dispcon (all)
273 @code{defcon}に与えられたような引数の縮約プロパティを表示します。
274 @code{dispcon (all)}は、定義された縮約プロパティすべてを表示します。
276 @opencatbox
277 @category{Display functions}
278 @closecatbox
280 @end deffn
282 @c -----------------------------------------------------------------------------
283 @deffn {関数} entertensor (@var{name})
285 プロンプトによって、
286 任意の数のテンソル添字や微分添字を持つ@var{name}と呼ばれる添字付きオブジェクトを生成することを許す関数です。
287 単一添字または(nullもありえる)添字のリストが容認可能な入力です。
288 (@code{covdiff}の下の例を参照してください。)
290 @opencatbox
291 @category{Package itensor}
292 @closecatbox
293 @end deffn
295 @c -----------------------------------------------------------------------------
296 @deffn {関数} changename (@var{old}, @var{new}, @var{expr})
298 @var{expr}の中の@var{old}と呼ばれるすべての添字付きオブジェクトの名前を@var{new}に変えます。
299 @var{old}はシンボルまたは形式@code{[@var{name}, @var{m}, @var{n}]}のリストであり得ます。
300 後者の場合、@var{m}個の共変添字と@var{n}個の反変添字を持つ
301 @var{name}と呼ばれるそれらの添字付きオブジェクトだけが@var{new}にリネームされます。
303 @opencatbox
304 @category{Package itensor}
305 @closecatbox
306 @end deffn
308 @deffn {関数} listoftens
310 テンソル式の中のすべてのテンソルを添字が完備した形でリストします。
311 例えば、
313 @example
315 (%i6) ishow(a([i,j],[k])*b([u],[],v)+c([x,y],[])*d([],[])*e)$
316                                          k
317 (%t6)                        d e c    + a    b
318                                   x y    i j  u,v
319 (%i7) ishow(listoftens(%))$
320                                k
321 (%t7)                        [a   , b   , c   , d]
322                                i j   u,v   x y
324 @end example
326 @opencatbox
327 @category{Package itensor}
328 @closecatbox
329 @end deffn
331 @c -----------------------------------------------------------------------------
332 @deffn {関数} ishow (@var{expr})
334 下付き添字としての共変添字と上付き添字としての反変添字を持つように
335 添字付きオブジェクトを持つ形で@var{expr}を表示します。
336 微分添字は、共変添字からコンマで区切られた下付き添字として表示されます。
337 (このドキュメント至る所の例を参照してください。)
339 @opencatbox
340 @category{Package itensor}
341 @closecatbox
342 @end deffn
344 @c -----------------------------------------------------------------------------
345 @deffn {関数} indices (@var{expr})
347 2つの要素のリストを返します。
348 以下の例が例示するように、
349 一番目は、@var{expr}の中の自由添字(一度だけ現れるもの)のリストです。
350 二番目は、@var{expr}の中のダミー添字(正確に二回現れるもの)のリストです。
352 @example
354 (%i1) load("itensor");
355 (%o1)      /share/tensor/itensor.lisp
356 (%i2) ishow(a([i,j],[k,l],m,n)*b([k,o],[j,m,p],q,r))$
357                                 k l      j m p
358 (%t2)                          a        b
359                                 i j,m n  k o,q r
360 (%i3) indices(%);
361 (%o3)                 [[l, p, i, n, o, q, r], [k, j, m]]
363 @end example
365 同じ添字を二回以上含むテンソル積は構文的に認められていません。
366 @code{indices}は、これらの式を合理的な方法で扱おうとします;
367 しかしながら、そんな非合法な式上で動くようにコールされた時、その振る舞いは未定義と考えなければいけません。
369 @opencatbox
370 @category{Package itensor}
371 @closecatbox
372 @end deffn
374 @c -----------------------------------------------------------------------------
375 @deffn  {関数} rename (@var{expr})
376 @deffnx {関数} rename (@var{expr}, @var{count})
378 もしオプションの二番目の引数が省略されたら、
379 @var{expr}と同値な、
380 しかし、各項に対して、集合@code{[%1, %2,...]}から選ばれたダミー添字を持つ式を返します。
381 そうでなければ、ダミー添字は@var{count}の値で始まるようインデックスされます。
382 積の中のそれぞれのダミー添字は異なります。
383 和に関しては、@code{rename}は各項毎にカウンタが再設定されるように和の中の各項上で作用します。
384 この方法で、@code{rename}はテンソル整理器として利用できます。
385 加えて、
386 (もし@code{allsym}が@code{true}なら、)
387 添字は、
388 @code{flipflag}の値に依存して共変または反変添字に関して、
389 英数字順に並び替えられます。
390 もし@code{flipflag}が@code{false}なら、
391 添字は反変添字の順に従ってリネームされます。
392 もし@code{flipflag}が@code{true}なら、
393 リネームは共変添字の順に従って起こるでしょう。
394 2つのリネームの組み合わせた効果が、それ自身によって、
395 どちらか1つよりも更に式を簡単にすることがしばしば起こります。
397 @example
399 (%i1) load("itensor");
400 (%o1)      /share/tensor/itensor.lisp
401 (%i2) allsym:true;
402 (%o2)                                true
403 (%i3) g([],[%4,%5])*g([],[%6,%7])*ichr2([%1,%4],[%3])*
404 ichr2([%2,%3],[u])*ichr2([%5,%6],[%1])*ichr2([%7,r],[%2])-
405 g([],[%4,%5])*g([],[%6,%7])*ichr2([%1,%2],[u])*
406 ichr2([%3,%5],[%1])*ichr2([%4,%6],[%3])*ichr2([%7,r],[%2]),noeval$
407 (%i4) expr:ishow(%)$
408 @group
409        %4 %5  %6 %7      %3         u          %1         %2
410 (%t4) g      g      ichr2      ichr2      ichr2      ichr2
411                          %1 %4      %2 %3      %5 %6      %7 r
413         %4 %5  %6 %7      u          %1         %3         %2
414      - g      g      ichr2      ichr2      ichr2      ichr2
415                           %1 %2      %3 %5      %4 %6      %7 r
416 @end group
417 (%i5) flipflag:true;
418 (%o5)                                true
419 (%i6) ishow(rename(expr))$
420        %2 %5  %6 %7      %4         u          %1         %3
421 (%t6) g      g      ichr2      ichr2      ichr2      ichr2
422                          %1 %2      %3 %4      %5 %6      %7 r
424         %4 %5  %6 %7      u          %1         %3         %2
425      - g      g      ichr2      ichr2      ichr2      ichr2
426                           %1 %2      %3 %4      %5 %6      %7 r
427 (%i7) flipflag:false;
428 (%o7)                                false
429 (%i8) rename(%th(2));
430 (%o8)                                  0
431 (%i9) ishow(rename(expr))$
432        %1 %2  %3 %4      %5         %6         %7        u
433 (%t9) g      g      ichr2      ichr2      ichr2     ichr2
434                          %1 %6      %2 %3      %4 r      %5 %7
436         %1 %2  %3 %4      %6         %5         %7        u
437      - g      g      ichr2      ichr2      ichr2     ichr2
438                           %1 %3      %2 %6      %4 r      %5 %7
439 @end example
441 @opencatbox
442 @category{Package itensor}
443 @closecatbox
444 @end deffn
446 @c THIS FUNCTION IS IN THE SHARE PACKAGE itensor.lisp
447 @c MOVE THIS DESCRIPTION TO Itensor.texi
449 @c -----------------------------------------------------------------------------
450 @anchor{show}
451 @deffn {関数} show (@var{expr})
452 下付き添字として共変インデックス、上付き添字として反変インデックスを持つよう、
453 インデックスされたオブジェクトと一緒に@code{expr}を表示します。
454 微分インデックスは下付き添字として表示され、
455 コンマによって共変インデックスと区別されます。
457 @opencatbox
458 @category{Package itensor}
459 @category{Display functions}
460 @closecatbox
462 @end deffn
464 @c -----------------------------------------------------------------------------
465 @defvr {オプション変数} flipflag
467 デフォルト: @code{false}.
468 もし@code{false}なら反変添字の順に従って、
469 そうでなければ、共変添字の順に従って、
470 添字がリネームされます。
472 もし@code{flipflag}が@code{false}なら、
473 @code{rename}は
474 左から右に現れるよう反変添字のリストを形成します
475 (もし@code{true}なら共変添字について同様に)。
476 リストの最初のダミー添字は@code{%1}に、次は@code{%2}にというように、リネームされます。
477 そして、@code{rename}の後、並び替えが起こります。
478 (@code{rename}の下の例を参照してください。)
480 @opencatbox
481 @category{Package itensor}
482 @closecatbox
483 @end defvr
485 @c -----------------------------------------------------------------------------
486 @deffn {関数} defcon (@var{tensor_1})
487 @deffnx {関数} defcon (@var{tensor_1}, @var{tensor_2}, @var{tensor_3})
488 @var{tensor_1}に、
489 @var{tensor_1}と@var{tensor_2}の積の縮約が
490 適切な添字を持つ@var{tensor_3}に帰着するという
491 プロパティを与えます。
492 もし引数が@var{tensor_1}1つだけ与えれたなら、
493 , then the contraction of the product of 
494 適切な添字を持つ任意の添字付きオブジェクト(@code{my_tensor}とします)との@var{tensor_1}の積の縮約はその名前、すなわち、@code{my_tensor}と、実行された縮約を反映した添字の新しい集合を持つ添字付きオブジェクトをもたらします。
495 例えば、もし@code{imetric:g}なら、@code{defcon(g)}は
496 計量テンソルとの縮約を通して添字の上げ下げを実行します。
497 1つ以上の@code{defcon}を同じ添字付きオブジェクトに関して与えることができます;
498 特定の縮約に関して適用する最新のものが使われます。
499 @code{contractions}は、
500 @code{defcon}で縮約プロパティを与えられたそれら添字付きオブジェクトのリストです。
502 @opencatbox
503 @category{Package itensor}
504 @closecatbox
505 @end deffn
507 @c -----------------------------------------------------------------------------
508 @deffn {関数} remcon (@var{tensor_1}, ..., @var{tensor_n})
509 @deffnx {関数} remcon (all)
510 @var{tensor_1}, ..., @var{tensor_n}からすべての縮約プロパティを取り除きます。
511 @code{remcon(all)}は、すべての添字付きオブジェクトから
512 すべての縮約プロパティを取り除きます。
514 @opencatbox
515 @category{Package itensor}
516 @closecatbox
517 @end deffn
519 @c -----------------------------------------------------------------------------
520 @deffn {関数} contract (@var{expr})
522 和と積の任意の組み合わせであり得る
523 @var{expr}に関して
524 テンソル縮約を実行します。
525 この関数は
526 @code{defcon}関数に与えられた情報を使います。
527 最高の結果として、
528 @code{expr}は完全に展開されなければいけません。
529 もし項の分母の中に変数がないなら、
530 @code{ratexpand}は
531 和の積やべきを展開する
532 最速の方法です。
533 もしGCD消去が不要なら、
534 @code{gcd}スイッチは@code{false}でなければいけません。
536 @opencatbox
537 @category{Package itensor}
538 @closecatbox
539 @end deffn
541 @c -----------------------------------------------------------------------------
542 @deffn {関数} indexed_tensor (@var{tensor})
544 値に関する美しい姿が既に
545 @code{ichr1}, @code{ichr2}, @code{icurvature}とともにあるように存在する
546 @var{tensor}に成分を割り当てる前に実行されなければいけません。
547 @code{icurvature}の下の例を参照してください。
549 @opencatbox
550 @category{Package itensor}
551 @closecatbox
552 @end deffn
554 @c -----------------------------------------------------------------------------
555 @deffn {関数} components (@var{tensor}, @var{expr})
557 @var{tensor}の成分の値を与える式@var{expr}に添字値を割り当てることを許します。
558 その添字のすべてとともに起こるときはいつでも、これらは自動的にテンソルに代入されます。
559 テンソルは、形式@code{t([...],[...])}でなければいけません。
560 ここで形式@code{t([...],[...])}の中のリストのいずれかは空であり得えます。
561 @var{expr}は、
562 @var{tensor}と同じ自由添字を持つ他のオブジェクトを含む任意の添字付き式であり得ます。
563 成分がダミー添字を含む計量テンソルへ値を割り当てるのに使われる時、
564 複数のダミー添字の生成を避けるようにこれらの添字を定義するように注意しなければいけません。
565 この割り当ての削除は関数@code{remcomps}に与えられます。
567 It is important to keep in mind that 
568 @code{components}はテンソル価についてだけ知る必要があり、特別な添字順序について知る必要がないことを覚えておくことは重要です。
569 このように、成分を、例えば、@code{x([i,-j],[])}, @code{x([-j,i],[])}または
570 @code{x([i],[j])}すべてに割り当てることは、同じ結果、
571 すなわち、
572 価@code{(1,1)}を持つ@code{x}と名付けられたテンソルに割り当てられた
573 成分を生成します。
575 成分を、4つの方法で添字付き式に割り当てることができます。
576 そのうちの2つは@code{components}コマンドの使用を含みます:
578 1) 添字付き式として。例えば:
580 @example
581 (%i2) components(g([],[i,j]),e([],[i])*p([],[j]))$
582 (%i3) ishow(g([],[i,j]))$
583                                       i  j
584 (%t3)                                e  p
586 @end example
588 2) 行列として:
590 @example
592 (%i5) lg:-ident(4)$lg[1,1]:1$lg;
593 @group
594                             [ 1   0    0    0  ]
595                             [                  ]
596                             [ 0  - 1   0    0  ]
597 (%o5)                       [                  ]
598                             [ 0   0   - 1   0  ]
599                             [                  ]
600                             [ 0   0    0   - 1 ]
601 @end group
602 (%i6) components(g([i,j],[]),lg);
603 (%o6)                                done
604 (%i7) ishow(g([i,j],[]))$
605 (%t7)                                g
606                                       i j
607 (%i8) g([1,1],[]);
608 (%o8)                                  1
609 (%i9) g([4,4],[]);
610 (%o9)                                 - 1
611 @end example
613 3) 関数として。Maxima関数を使って、添字に基づいたテンソルの成分を指定することができます。
614 例えば、以下のコードは、
615 もし@code{h}が同じ数の共変添字と反変添字を持ち、微分添字を持たないなら、@code{kdelta}を@code{h}に割り当て、そうでなければ、@code{g}を割り当てます:
617 @example
619 (%i4) h(l1,l2,[l3]):=if length(l1)=length(l2) and length(l3)=0
620   then kdelta(l1,l2) else apply(g,append([l1,l2], l3))$
621 (%i5) ishow(h([i],[j]))$
622                                           j
623 (%t5)                               kdelta
624                                           i
625 (%i6) ishow(h([i,j],[k],l))$
626                                      k
627 (%t6)                               g
628                                      i j,l
629 @end example
631 4) Maximaのパターンマッチング機能、特に@code{defrule}と@code{applyb1}コマンド
632 を使って:
634 @example
636 (%i1) load("itensor");
637 (%o1)      /share/tensor/itensor.lisp
638 (%i2) matchdeclare(l1,listp);
639 (%o2)                                done
640 (%i3) defrule(r1,m(l1,[]),(i1:idummy(),
641       g([l1[1],l1[2]],[])*q([i1],[])*e([],[i1])))$
643 (%i4) defrule(r2,m([],l1),(i1:idummy(),
644       w([],[l1[1],l1[2]])*e([i1],[])*q([],[i1])))$
646 (%i5) ishow(m([i,n],[])*m([],[i,m]))$
647 @group
648                                     i m
649 (%t5)                              m    m
650                                          i n
651 @end group
652 (%i6) ishow(rename(applyb1(%,r1,r2)))$
653                            %1  %2  %3 m
654 (%t6)                     e   q   w     q   e   g
655                                          %1  %2  %3 n
656 @end example
658 @opencatbox
659 @category{Package itensor}
660 @closecatbox
661 @end deffn
663 @deffn {関数} remcomps (@var{tensor})
665 @code{components}関数で割り当てられたすべての値を
666 @var{tensor}からアンバインドします。
668 @opencatbox
669 @category{Package itensor}
670 @closecatbox
671 @end deffn
673 @c NEED LIST OF ARGUMENTS HERE
675 @c -----------------------------------------------------------------------------
676 @deffn {関数} showcomps (@var{tensor})
678 @code{components}コマンドを使って作られたように
679 テンソルの成分割り当てを表示します。
680 以下の例で明示されるように、
681 行列が、@code{components}を使って
682 添字テンソルに割り当てられている時、
683 この関数は特に役に立ちます:
685 @example
687 (%i1) load("ctensor");
688 (%o1)       /share/tensor/ctensor.mac
689 (%i2) load("itensor");
690 (%o2)      /share/tensor/itensor.lisp
691 (%i3) lg:matrix([sqrt(r/(r-2*m)),0,0,0],[0,r,0,0],
692                 [0,0,sin(theta)*r,0],[0,0,0,sqrt((r-2*m)/r)]);
693                [         r                                     ]
694                [ sqrt(-------)  0       0              0       ]
695                [      r - 2 m                                  ]
696                [                                               ]
697                [       0        r       0              0       ]
698 (%o3)          [                                               ]
699                [       0        0  r sin(theta)        0       ]
700                [                                               ]
701                [                                      r - 2 m  ]
702                [       0        0       0        sqrt(-------) ]
703                [                                         r     ]
704 (%i4) components(g([i,j],[]),lg);
705 (%o4)                                done
706 (%i5) showcomps(g([i,j],[]));
707                   [         r                                     ]
708                   [ sqrt(-------)  0       0              0       ]
709                   [      r - 2 m                                  ]
710                   [                                               ]
711                   [       0        r       0              0       ]
712 (%t5)      g    = [                                               ]
713             i j   [       0        0  r sin(theta)        0       ]
714                   [                                               ]
715                   [                                      r - 2 m  ]
716                   [       0        0       0        sqrt(-------) ]
717                   [                                         r     ]
718 (%o5)                                false
720 @end example
722 @code{showcomps}コマンドは
723 2よりも高い階数のテンソルの成分も表示することができます。
725 @opencatbox
726 @category{Package itensor}
727 @closecatbox
728 @end deffn
730 @c -----------------------------------------------------------------------------
731 @deffn {関数} idummy ()
733 Increments 
734 @code{icounter}を1つ増やし、
735 形式@code{%n}の添字を値として返します。ここでnは正の整数です。
736 これは式を形成する際必要なダミー添字が既に使用中の添字とぶつからないことを保証します。
737 (@code{indices}の下の例を参照してください。)
739 @opencatbox
740 @category{Package itensor}
741 @closecatbox
742 @end deffn
744 @defvr {オプション変数} idummyx
745 デフォルト値: @code{%}
747 ダミー添字の接頭辞です。
748 (@code{indices}の下の例を参照してください。)
750 @opencatbox
751 @category{Package itensor}
752 @closecatbox
753 @end defvr
755 @c -----------------------------------------------------------------------------
756 @defvr {オプション変数} icounter
757 デフォルト値: @code{1}
759 テンソルパッケージで次のダミー添字を生成する際使われる数値接尾を決定します。
760 接頭辞はオプション@code{idummy} (デフォルト: @code{%})で決定されます。
762 @opencatbox
763 @category{Package itensor}
764 @closecatbox
765 @end defvr
767 @c -----------------------------------------------------------------------------
768 @deffn {関数} kdelta (@var{L1}, @var{L2})
769 共変添字のリスト@var{L1}と反変添字のリスト@var{L2}を使って
770 @code{itensor}パッケージで定義された
771 一般化されたKroneckerのデルタ関数です。
772 @code{kdelta([i],[j])}は通常のKroneckerデルタを返します。
773 コマンド@code{ev(@var{expr},kdelta)}は
774 @code{kdelta([],[])}を多様体の次元に含む
775 式の評価をもたらします。
777 この表記法の乱用となることですが、
778 @code{itensor}は
779 @code{kdelta}が2つの共変添字だけ、または、2つの反変添字だけを持つことも許し、
780 事実上、共(反)変「単位行列」を供給します。
781 これは厳密にはプログラミング目的としてみなされ、
782 @code{kdelta([i,j],[])}が有効なテンソルオブジェクトだということを意味するつもりではありません。
784 @opencatbox
785 @category{Package itensor}
786 @closecatbox
787 @end deffn
789 @c -----------------------------------------------------------------------------
790 @deffn {関数} kdels (@var{L1}, @var{L2})
792 いくつかの計算で使われる、対称化されたKroneckerデルタ。
793 例えば:
795 @example
797 (%i1) load("itensor");
798 (%o1)      /share/tensor/itensor.lisp
799 (%i2) kdelta([1,2],[2,1]);
800 (%o2)                                 - 1
801 (%i3) kdels([1,2],[2,1]);
802 (%o3)                                  1
803 (%i4) ishow(kdelta([a,b],[c,d]))$
804                              c       d         d       c
805 (%t4)                  kdelta  kdelta  - kdelta  kdelta
806                              a       b         a       b
807 (%i4) ishow(kdels([a,b],[c,d]))$
808                              c       d         d       c
809 (%t4)                  kdelta  kdelta  + kdelta  kdelta
810                              a       b         a       b
812 @end example
814 @opencatbox
815 @category{Package itensor}
816 @closecatbox
817 @end deffn
819 @c -----------------------------------------------------------------------------
820 @deffn {関数} levi_civita (@var{L})
821 もしリスト@var{L}が整数の偶置換から成るなら1を返し、
822 @var{L}が奇置換なら成るなら-1を返し、
823 @var{L}のいくつかの添字が繰り返しなら0を返す
824 置換(別名Levi-Civita)テンソルです。
826 @opencatbox
827 @category{Package itensor}
828 @closecatbox
829 @end deffn
831 @c -----------------------------------------------------------------------------
832 @deffn {関数} lc2kdt (@var{expr})
833 Levi-Civitaシンボルを含む式を整理し、可能ならこれらをKroneckerデルタ式に変換します。
834 この関数と単にLevi-Civitaシンボルを評価することの主な違いは、
835 直接評価はしばしば数値添字を含むKronecker式に帰着することです。
836 これは、更なる整理を妨げるので、しばしば望ましくないことです。
837 @code{lc2kdt}関数はこの問題を避けて、
838 @code{rename}や@code{contract}を使って更に容易に整理される式をもたらします。
840 @example
842 (%i1) load("itensor");
843 (%o1)      /share/tensor/itensor.lisp
844 (%i2) expr:ishow('levi_civita([],[i,j])
845                  *'levi_civita([k,l],[])*a([j],[k]))$
846                                   i j  k
847 (%t2)                  levi_civita    a  levi_civita
848                                        j            k l
849 (%i3) ishow(ev(expr,levi_civita))$
850                                   i j  k       1 2
851 (%t3)                       kdelta    a  kdelta
852                                   1 2  j       k l
853 (%i4) ishow(ev(%,kdelta))$
854              i       j         j       i   k
855 (%t4) (kdelta  kdelta  - kdelta  kdelta ) a
856              1       2         1       2   j
858                                1       2         2       1
859                         (kdelta  kdelta  - kdelta  kdelta )
860                                k       l         k       l
861 (%i5) ishow(lc2kdt(expr))$
862                      k       i       j    k       j       i
863 (%t5)               a  kdelta  kdelta  - a  kdelta  kdelta
864                      j       k       l    j       k       l
865 (%i6) ishow(contract(expand(%)))$
866                                  i           i
867 (%t6)                           a  - a kdelta
868                                  l           l
869 @end example
871 @code{lc2kdt}関数は時々計量テンソルを利用します。
872 もし前もって計量テンソルが@code{imetric}で定義されていなかったなら、
873 これはエラーになります。
875 @example
877 (%i7) expr:ishow('levi_civita([],[i,j])
878                  *'levi_civita([],[k,l])*a([j,k],[]))$
879 @group
880                                  i j            k l
881 (%t7)                 levi_civita    levi_civita    a
882                                                      j k
883 @end group
884 (%i8) ishow(lc2kdt(expr))$
885 Maxima encountered a Lisp error:
887  Error in $IMETRIC [or a callee]:
888  $IMETRIC [or a callee] requires less than two arguments.
890 Automatically continuing.
891 To reenable the Lisp debugger set *debugger-hook* to nil.
892 (%i9) imetric(g);
893 (%o9)                                done
894 (%i10) ishow(lc2kdt(expr))$
895          %3 i       k   %4 j       l     %3 i       l   %4 j
896 (%t10) (g     kdelta   g     kdelta   - g     kdelta   g    
897                     %3             %4               %3
898               k
899         kdelta  ) a
900               %4   j k
901 (%i11) ishow(contract(expand(%)))$
902                                   l i    l i  j
903 (%t11)                           a    - g    a
904                                               j
905 @end example
908 @opencatbox
909 @category{Package itensor}
910 @closecatbox
911 @end deffn
913 @c HMM, WHICH CATEGORY DOES THIS FALL INTO -- FUNCTION, VARIABLE, OTHER ??
915 @c -----------------------------------------------------------------------------
916 @deffn {関数} lc_l
918 未評価のLevi-Civitaシンボル(@code{levi_civita})を含む式のために使われる整理ルール。
919 @code{lc_u}と組み合わせて、
920 たくさんの式を、@code{levi_civita}の評価より、より効率的に整理するのに使うことができます。
922 例えば:
924 @example
926 (%i1) load("itensor");
927 (%o1)      /share/tensor/itensor.lisp
928 (%i2) el1:ishow('levi_civita([i,j,k],[])*a([],[i])*a([],[j]))$
929                              i  j
930 (%t2)                       a  a  levi_civita
931                                              i j k
932 (%i3) el2:ishow('levi_civita([],[i,j,k])*a([i])*a([j]))$
933                                        i j k
934 (%t3)                       levi_civita      a  a
935                                               i  j
936 (%i4) canform(contract(expand(applyb1(el1,lc_l,lc_u))));
937 (%t4)                                  0
938 (%i5) canform(contract(expand(applyb1(el2,lc_l,lc_u))));
939 (%t5)                                  0
941 @end example
943 @opencatbox
944 @category{Package itensor}
945 @closecatbox
946 @end deffn
948 @c HMM, WHICH CATEGORY DOES THIS FALL INTO -- FUNCTION, VARIABLE, OTHER ??
950 @c -----------------------------------------------------------------------------
951 @deffn {関数} lc_u
953 未評価のLevi-Civitaシンボル(@code{levi_civita})を含む式のために使われる整理ルール。
954 @code{lc_l}と組み合わせて、
955 たくさんの式を、@code{levi_civita}の評価より、より効率的に整理するのに使うことができます。
956 詳しくは、@code{lc_l}を参照してください。
958 @opencatbox
959 @category{Package itensor}
960 @closecatbox
961 @end deffn
963 @c -----------------------------------------------------------------------------
964 @deffn {関数} canten (@var{expr})
965 名前を変えて(@code{rename}を参照してください)、ダミー添字を置換することで、
966 @var{expr}を整理します。
967 @code{rename}は
968 微分がないテンソル積の和に制限されます。
969 本当に限定されていて、
970 もし@code{canform}が要求された整理を実行する能力がない時だけ使われるはずです。
972 @code{canten}関数は、
973 引数が添字が完全に対称な式の時だけ数学的に正確な結果を返します。
974 この理由から、@code{canten}は、
975 もし@code{allsym}が@code{true}に設定されてないなら
976 エラーを返します。
979 @opencatbox
980 @category{Package itensor}
981 @closecatbox
982 @end deffn
984 @c -----------------------------------------------------------------------------
985 @deffn {関数} concan (@var{expr})
986 @code{canten}に似ていますが、添字縮約も実行します。
988 @opencatbox
989 @category{Package itensor}
990 @closecatbox
991 @end deffn
993 @c -----------------------------------------------------------------------------
994 @subsection Tensor symmetries
995 @c -----------------------------------------------------------------------------
997 @c -----------------------------------------------------------------------------
998 @defvr {オプション変数} allsym
1000 デフォルト: @code{false}。
1001 もし@code{true}なら、すべての添字付きオブジェクトは共変、反変添字のすべてに関して対称と仮定されます。
1002 もし@code{false}なら、これらの添字に関して、いかなる種類の対称性も仮定されません。
1003 @code{iframe_flag}が@code{true}に設定されない限り、
1004 微分添字はいつも対称と取られます。
1006 @opencatbox
1007 @category{Package itensor}
1008 @closecatbox
1009 @end defvr
1011 @c -----------------------------------------------------------------------------
1012 @deffn {関数} decsym (@var{tensor}, @var{m}, @var{n}, [@var{cov_1}, @var{cov_2}, ...], [@var{contr_1}, @var{contr_2}, ...])
1014 @var{m}個の共変添字と@var{n}個の反変添字を持つ@var{tensor}に関する
1015 対称プロパティを宣言します。
1016 @var{cov_i}と@var{contr_i}は
1017 それぞれ、共変添字と反変添字の間の対称関係を表す擬似関数です。
1018 これらは
1019 contravariant indices respectively.  These are of the form
1020 形式@code{symoper(@var{index_1}, @var{index_2},...)}を取ります。
1021 ここで@code{symoper}は
1022 @code{sym}, @code{anti}もしくは@code{cyc}のいずれかで、
1023  and the 
1024 @var{index_i}は
1025 @var{tensor}の添字の位置を示す整数です。
1026 これは、@var{tensor}が@var{index_i}に関してそれぞれ対称、反対称、巡回であると宣言します。
1027 @code{symoper(all)}も対称条件に従う添字すべてを示す有効な形式です。
1028 例えば、
1029 5つの共変添字を持つオブジェクト@code{b}が与えられたとして、
1030 @code{decsym(b,5,3,[sym(1,2),anti(3,4)],[cyc(all)])}は、
1031 @code{b}が一番目と二番目の共変添字に対して対称であり、三番目、四番目の共変添字に対して反対称であり、反変添字すべてに対して巡回的であると宣言します。
1032 対称宣言のリストのどれかは空であり得ます。
1033 式整理を実行する関数は
1034 以下の例で示すように@code{canform}です。
1036 @example
1038 (%i1) load("itensor");
1039 (%o1)      /share/tensor/itensor.lisp
1040 (%i2) expr:contract( expand( a([i1, j1, k1], [])
1041            *kdels([i, j, k], [i1, j1, k1])))$
1042 (%i3) ishow(expr)$
1043 @group
1044 (%t3)         a      + a      + a      + a      + a      + a
1045                k j i    k i j    j k i    j i k    i k j    i j k
1046 @end group
1047 (%i4) decsym(a,3,0,[sym(all)],[]);
1048 (%o4)                                done
1049 (%i5) ishow(canform(expr))$
1050 (%t5)                              6 a
1051                                       i j k
1052 (%i6) remsym(a,3,0);
1053 (%o6)                                done
1054 (%i7) decsym(a,3,0,[anti(all)],[]);
1055 (%o7)                                done
1056 (%i8) ishow(canform(expr))$
1057 (%t8)                                  0
1058 (%i9) remsym(a,3,0);
1059 (%o9)                                done
1060 (%i10) decsym(a,3,0,[cyc(all)],[]);
1061 (%o10)                               done
1062 (%i11) ishow(canform(expr))$
1063 (%t11)                        3 a      + 3 a
1064                                  i k j      i j k
1065 (%i12) dispsym(a,3,0);
1066 (%o12)                     [[cyc, [[1, 2, 3]], []]]
1068 @end example
1070 @opencatbox
1071 @category{Package itensor}
1072 @closecatbox
1073 @end deffn
1075 @c -----------------------------------------------------------------------------
1076 @deffn {関数} remsym (@var{tensor}, @var{m}, @var{n})
1077 @var{m}個の共変添字と@var{n}個の反変添字を持つ@var{tensor}から
1078 すべての対称プロパティを取り除きます。
1080 @opencatbox
1081 @category{Package itensor}
1082 @closecatbox
1083 @end deffn
1085 @c -----------------------------------------------------------------------------
1086 @deffn {関数} canform (@var{expr})
1087 @deffnx {関数} canform (@var{expr}, @var{rename})
1088 ダミー添字をリネームして、
1089 それらに課せられた対称条件によって指令されたようにすべての添字を並べ替えることで、
1090 @var{expr}を整理します。
1091 もし@code{allsym}が@code{true}なら、
1092 すべての添字は対称と仮定され、
1093 そうでなければ、@code{decsym}宣言が提供する対称情報が使われます。
1094 ダミー添字は@code{rename}関数に関するものと同じ方法でリネームされます。
1095 @code{canform}が大きな式に適用される時、
1096 計算にかなりの時間が費やされるかもしれません。
1097 この時間は最初に式に対して@code{rename}をコールすることで短くできます。
1098 @code{decsym}の下の例も参照してください。
1099 注意: @code{canform}は
1100 いつも数学的に正しい結果を返しますが、
1101 式を最も簡単な形式に完全に整理できないかもしれません。
1103 オプションの二番目のパラメータ@var{rename}は、
1104 もし@code{false}に設定されたなら、リネームを抑制します。
1106 @opencatbox
1107 @category{Package itensor}
1108 @closecatbox
1109 @end deffn
1111 @c -----------------------------------------------------------------------------
1112 @subsection Indicial tensor calculus
1113 @c -----------------------------------------------------------------------------
1115 @c -----------------------------------------------------------------------------
1116 @deffn {関数} diff (@var{expr}, @var{v_1}, [@var{n_1}, [@var{v_2}, @var{n_2}] ...])
1118 @code{itensor}のための能力に関して拡張された
1119 通常のMaxima微分関数です。
1120 It takes the derivative of 
1121 @var{v_1}に関して @var{n_1}階、
1122 @var{v_2}に関して @var{n_2}階、
1123 という@var{expr}の微分を取ります。
1124 テンソルパッケージでは、
1125 @var{v_i}が1から変数 @code{dim}の値までの整数であるように
1126 関数が修正されています。
1127 これによって、
1128 微分がリスト @code{vect_coords}の @var{v_i}番目の要素に関して実行されます。
1129 もし
1130 @code{vect_coords}がアトム変数にバインドされているなら、
1131 @var{v_i}が下付きしたその変数が
1132 微分変数として使われます。
1133 これは
1134 座標名や、@code{x[1]}, @code{x[2]}, ... のような下付き名の配列を使うことを可能にします。
1136 更なる拡張は、
1137 添字付き変数に関する微分を計算する能力を@code{diff}に追加します。
1138 特にテンソルパッケージは
1139 計量テンソルと、計量テンソルやその一階微分、二階微分に関する微分を含む
1140 式を微分する方法を知っています。
1141 この能力は
1142 重力理論のLagrange形式を考える時、
1143 特に役に立ちます。
1144 作用原理からEinsteinテンソルと場の方程式を演繹することを可能にします。
1146 @opencatbox
1147 @category{Package itensor}
1148 @closecatbox
1149 @end deffn
1151 @c -----------------------------------------------------------------------------
1152 @deffn {関数} idiff (@var{expr}, @var{v_1}, [@var{n_1}, [@var{v_2}, @var{n_2}] ...])
1153 添字微分。
1154 独立変数に関して微分する@code{diff}と異なり、
1155 @code{idiff)}は座標に関して微分するのにつかうことができます。
1156 添字付きオブジェクトに関して,
1157 結果的に、これは
1158 @var{v_i}を微分添字として追加することになります。
1159 @code{iframe_flag}が @code{true}に設定されていない限り
1160 続いて,微分添字が並び替えられます。
1162 @code{idiff}は計量テンソルの行列式も微分することができます。
1163 従って、もし @code{imetric}が
1164 @code{G}にバインドされていたら、
1165 @code{idiff(determinant(g),k)}は
1166 ダミー添字 @code{%i}が適当に選ばれて
1167 @code{2 * determinant(g) * ichr2([%i,k],[%i])}を返します。
1169 @opencatbox
1170 @category{Package itensor}
1171 @closecatbox
1172 @end deffn
1174 @c -----------------------------------------------------------------------------
1175 @deffn {関数} liediff (@var{v}, @var{ten})
1177 ベクトル場 @var{v}に対してテンソル式 @var{ten}のLie微分を計算します。
1178 @var{ten}は任意の添字付きテンソル式でなければいけません;
1179 @var{v}はベクトル場の(添字なしの)名前でなければいけません。
1180 例えば:
1182 @example
1184 (%i1) load("itensor");
1185 (%o1)      /share/tensor/itensor.lisp
1186 (%i2) ishow(liediff(v,a([i,j],[])*b([],[k],l)))$
1187        k    %2            %2          %2
1188 (%t2) b   (v   a       + v   a     + v   a    )
1189        ,l       i j,%2    ,j  i %2    ,i  %2 j
1191                           %1  k        %1  k      %1  k
1192                       + (v   b      - b   v    + v   b   ) a
1193                               ,%1 l    ,l  ,%1    ,l  ,%1   i j
1195 @end example
1197 @opencatbox
1198 @category{Package itensor}
1199 @closecatbox
1200 @end deffn
1202 @c -----------------------------------------------------------------------------
1203 @deffn {関数} rediff (@var{ten})
1205 テンソル式 @var{ten}の中の@code{idiff}コマンドすべてを評価します。
1207 @opencatbox
1208 @category{Package itensor}
1209 @closecatbox
1210 @end deffn
1212 @c -----------------------------------------------------------------------------
1213 @deffn {関数} undiff (@var{expr})
1215 @var{expr}と同値な、
1216 添字付きオブジェクトの微分すべてが@code{idiff}関数の名詞形で置き換えられた
1217 式を返します。
1218 引数はもし微分が実行されていたらその添字付きオブジェクトをもたらします。
1219 微分された添字付きオブジェクトを
1220 @var{expr}を生じるある関数定義で置き換えて、
1221 @code{ev(@var{expr}, idiff)}で微分を実行したい時、
1222 これは役に立ちます。
1225 @opencatbox
1226 @category{Package itensor}
1227 @closecatbox
1228 @end deffn
1230 @c -----------------------------------------------------------------------------
1231 @deffn {関数} evundiff (@var{expr})
1233 @code{undiff}の実行と同値ですが、@code{ev}と @code{rediff}が続きます。
1235 この演算のポイントは
1236 微分形式で直接評価できない式を簡単に評価することです。
1237 例えば、以下はエラーをもたらします:
1239 @example
1240 (%i1) load("itensor");
1241 (%o1)      /share/tensor/itensor.lisp
1242 (%i2) icurvature([i,j,k],[l],m);
1243 Maxima encountered a Lisp error:
1245  Error in $ICURVATURE [or a callee]:
1246  $ICURVATURE [or a callee] requires less than three arguments.
1248 Automatically continuing.
1249 To reenable the Lisp debugger set *debugger-hook* to nil.
1250 @end example
1252 しかし、もし @code{icurvature}は名詞形で入っているなら、
1253 @code{evundiff}を使って評価できます:
1255 @example
1256 (%i3) ishow('icurvature([i,j,k],[l],m))$
1257                                          l
1258 (%t3)                          icurvature
1259                                          i j k,m
1260 (%i4) ishow(evundiff(%))$
1261              l              l         %1           l           %1
1262 (%t4) - ichr2        - ichr2     ichr2      - ichr2       ichr2
1263              i k,j m        %1 j      i k,m        %1 j,m      i k
1265              l              l         %1           l           %1
1266       + ichr2        + ichr2     ichr2      + ichr2       ichr2
1267              i j,k m        %1 k      i j,m        %1 k,m      i j
1268 @end example
1270 注意: Maximaの以前のバージョンでは、
1271 Christoffel記号の微分形式も評価できませんでした。
1272 これは現在修正されています。
1273 だから @code{evundiff}はもはやこのような式に関しては不要です:
1275 @example
1276 (%i5) imetric(g);
1277 (%o5)                                done
1278 (%i6) ishow(ichr2([i,j],[k],l))$
1279        k %3
1280       g     (g         - g         + g        )
1281               j %3,i l    i j,%3 l    i %3,j l
1282 (%t6) -----------------------------------------
1283                           2
1285                          k %3
1286                         g     (g       - g       + g      )
1287                          ,l     j %3,i    i j,%3    i %3,j
1288                       + -----------------------------------
1289                                          2
1290 @end example
1292 @opencatbox
1293 @category{Package itensor}
1294 @closecatbox
1295 @end deffn
1297 @c -----------------------------------------------------------------------------
1298 @deffn {関数} flush (@var{expr}, @var{tensor_1}, @var{tensor_2}, ...)
1299 @var{expr}において、
1300 微分添字を持たない @var{tensor_i}をすべて0にします。
1302 @opencatbox
1303 @category{Package itensor}
1304 @closecatbox
1305 @end deffn
1307 @c -----------------------------------------------------------------------------
1308 @deffn {関数} flushd (@var{expr}, @var{tensor_1}, @var{tensor_2}, ...)
1309 @var{expr}において、
1310 微分添字を持つ @var{tensor_i}をすべて0にします。
1312 @opencatbox
1313 @category{Package itensor}
1314 @closecatbox
1315 @end deffn
1317 @c -----------------------------------------------------------------------------
1318 @deffn {関数} flushnd (@var{expr}, @var{tensor}, @var{n})
1319 以下の例で例示されるように、
1320 @var{expr}において、
1321 @var{n}以上の微分添字を持つ微分されたオブジェクト @var{tensor}をすべて0にします。
1322 @example
1324 (%i1) load("itensor");
1325 (%o1)      /share/tensor/itensor.lisp
1326 (%i2) ishow(a([i],[J,r],k,r)+a([i],[j,r,s],k,r,s))$
1327                                 J r      j r s
1328 (%t2)                          a      + a
1329                                 i,k r    i,k r s
1330 (%i3) ishow(flushnd(%,a,3))$
1331                                      J r
1332 (%t3)                               a
1333                                      i,k r
1334 @end example
1336 @opencatbox
1337 @category{Package itensor}
1338 @closecatbox
1339 @end deffn
1341 @c -----------------------------------------------------------------------------
1342 @deffn {関数} coord (@var{tensor_1}, @var{tensor_2}, ...)
1344 @var{tensor_i}に、
1345 その名前が@var{tensor_i}の1つである反変ベクトルの微分がKroneckerデルタをもたらす
1346 座標微分プロパティを与えます。
1347 例えば、
1348 もし @code{coord(x)}が実行されたら、
1349 @code{idiff(x([],[i]),j)}は @code{kdelta([i],[j])}を与えます。
1350 @code{coord}はこのプロパティを持つ添字付きオブジェクトすべてのリストです。
1352 @opencatbox
1353 @category{Package itensor}
1354 @closecatbox
1355 @end deffn
1357 @c -----------------------------------------------------------------------------
1358 @deffn {関数} remcoord (@var{tensor_1}, @var{tensor_2}, ...)
1359 @deffnx {関数} remcoord (all)
1361 @code{tensor_i}から
1362 関数 @code{coord}がもたらした座標微分プロパティを削除します。
1363 @code{remcoord(all)}は添字付きオブジェクトすべてからこのプロパティを削除します。
1365 @opencatbox
1366 @category{Package itensor}
1367 @closecatbox
1368 @end deffn
1370 @c -----------------------------------------------------------------------------
1371 @deffn {関数} makebox (@var{expr})
1372 @code{show}と同じように @var{expr}を表示します;
1373 しかし、
1374 @var{expr}に現れるテンソル d'Alembert演算子はすべて記号 @code{[]}を使って示されます。
1375 例えば、 @code{[]p([m],[n])}は
1376 @code{g([],[i,j])*p([m],[n],i,j)}を表します。
1378 @opencatbox
1379 @category{Package itensor}
1380 @closecatbox
1381 @end deffn
1383 @c -----------------------------------------------------------------------------
1384 @deffn {関数} conmetderiv (@var{expr}, @var{tensor})
1386 計量テンソルの共変と反変形式両方(現在の制約)の常微分を含む式を整理します。
1387 例えば、 以下に見られるように、
1388 @code{conmetderiv}は
1389 反変計量テンソルの微分をChristoffelシンボルに結びつけます:
1391 @example
1393 (%i1) load("itensor");
1394 (%o1)      /share/tensor/itensor.lisp
1395 (%i2) ishow(g([],[a,b],c))$
1396                                       a b
1397 (%t2)                                g
1398                                       ,c
1399 (%i3) ishow(conmetderiv(%,g))$
1400                          %1 b      a       %1 a      b
1401 (%t3)                 - g     ichr2     - g     ichr2
1402                                    %1 c              %1 c
1403 @end example
1405 @opencatbox
1406 @category{Package itensor}
1407 @closecatbox
1408 @end deffn
1410 @c -----------------------------------------------------------------------------
1411 @deffn {関数} simpmetderiv (@var{expr})
1412 @deffnx {関数} simpmetderiv (@var{expr}[, @var{stop}])
1414 計量テンソルの微分の積を含む式を整理します。
1415 特に、 @code{simpmetderiv}は2つの恒等式を知っています:
1417 @example
1419    ab        ab           ab                 a
1420   g   g   + g   g     = (g   g  )   = (kdelta )   = 0
1421    ,d  bc        bc,d         bc ,d          c ,d
1423 @end example
1425 従って、
1427 @example
1429    ab          ab
1430   g   g   = - g   g
1431    ,d  bc          bc,d
1432 @end example
1436 @example
1438   ab          ab
1439  g   g     = g   g
1440   ,j  ab,i    ,i  ab,j
1442 @end example
1444 これはChristoffel記号の対称性の結果です。
1446 @code{simpmetderiv}関数はオプションパラメータを1つ取ります。
1447 それは、与えられた時、
1448 積式の中の最初にうまくいった代入の後、関数が停止するようにします。
1449 @code{simpmetderiv}関数は
1450 ``正準''順序を積添字に適用する方法を決めるグローバル変数 @var{flipflag}も利用します。
1452 まとめると、
1453 これらの機能は
1454 そうでなければ遂行困難か不可能な強力な式整理を達成するのに使うことができます。
1455 これは、
1456 縮約式を得るために@code{simpmetderiv}の部分的な整理の特長を明示的に使う
1457 以下の例を通じて例示されます:
1459 @example
1461 (%i1) load("itensor");
1462 (%o1)      /share/tensor/itensor.lisp
1463 (%i2) imetric(g);
1464 (%o2)                                done
1465 (%i3) ishow(g([],[a,b])*g([],[b,c])*g([a,b],[],d)*g([b,c],[],e))$
1466                              a b  b c
1467 (%t3)                       g    g    g      g
1468                                        a b,d  b c,e
1469 (%i4) ishow(canform(%))$
1471 errexp1 has improper indices
1472  -- an error.  Quitting.  To debug this try debugmode(true);
1473 (%i5) ishow(simpmetderiv(%))$
1474                              a b  b c
1475 (%t5)                       g    g    g      g
1476                                        a b,d  b c,e
1477 (%i6) flipflag:not flipflag;
1478 (%o6)                                true
1479 (%i7) ishow(simpmetderiv(%th(2)))$
1480                                a b  b c
1481 (%t7)                         g    g    g    g
1482                                ,d   ,e   a b  b c
1483 (%i8) flipflag:not flipflag;
1484 (%o8)                                false
1485 (%i9) ishow(simpmetderiv(%th(2),stop))$
1486                                a b  b c
1487 (%t9)                       - g    g    g      g
1488                                     ,e   a b,d  b c
1489 (%i10) ishow(contract(%))$
1490                                     b c
1491 (%t10)                           - g    g
1492                                     ,e   c b,d
1494 @end example
1496 Weylテンソルの縮約を整理するために
1497 @code{simpmetderiv}と @code{conmetderiv}を一緒に使う例として、
1498 @code{weyl.dem}も参照してください。
1500 @opencatbox
1501 @category{Package itensor}
1502 @closecatbox
1503 @end deffn
1505 @c -----------------------------------------------------------------------------
1506 @deffn {関数} flush1deriv (@var{expr}, @var{tensor})
1508 @var{expr}において、
1509 微分添字を1つだけ持つ @var{tensor}をすべて0にします。
1511 @opencatbox
1512 @category{Package itensor}
1513 @closecatbox
1514 @end deffn
1516 @c -----------------------------------------------------------------------------
1517 @subsection Tensors in curved spaces
1518 @c -----------------------------------------------------------------------------
1520 @c -----------------------------------------------------------------------------
1521 @deffn {関数} imetric (@var{g})
1522 @deffnx {システム変数} imetric
1524 変数 @code{imetric:@var{g}}を割り当てることで計量を指定します。
1525 加えて、
1526 コマンド @code{defcon(@var{g}),defcon(@var{g}, @var{g}, kdelta)}を実行することで
1527 計量 @var{g}の縮約プロパティが設定されます。
1528 (デフォルトではバインドされていない)変数 @code{imetric}は
1529 @code{imetric(@var{g})}コマンドが割り当てる計量にバインドされます。
1531 @opencatbox
1532 @category{Package itensor}
1533 @closecatbox
1534 @end deffn
1536 @c -----------------------------------------------------------------------------
1537 @deffn {関数} idim (@var{n})
1538 計量の次元を設定します。
1539 与えられた次元でLevi-Civita記号の反対称プロパティも初期化します。
1541 @opencatbox
1542 @category{Package itensor}
1543 @closecatbox
1544 @end deffn
1546 @c -----------------------------------------------------------------------------
1547 @deffn {関数} ichr1 ([@var{i}, @var{j}, @var{k}])
1548 以下の定義を介して第一種Christoffel記号をもたらします。
1549 @example
1550        (g      + g      - g     )/2 .
1551          ik,j     jk,i     ij,k
1552 @end example
1553 @noindent
1554 特定の計量で Christoffel記号を評価するには、
1555 @code{chr2}の下の例のように
1556 変数 @code{imetric}が名前を割り当てられなければいけません。
1558 @opencatbox
1559 @category{Package itensor}
1560 @closecatbox
1561 @end deffn
1563 @c -----------------------------------------------------------------------------
1564 @deffn {関数} ichr2 ([@var{i}, @var{j}], [@var{k}])
1565 以下の定義を介して第二種Christoffel記号をもたらします。
1566 @example
1567                        ks
1568    ichr2([i,j],[k]) = g    (g      + g      - g     )/2
1569                              is,j     js,i     ij,s
1570 @end example
1572 @opencatbox
1573 @category{Package itensor}
1574 @closecatbox
1575 @end deffn
1577 @c -----------------------------------------------------------------------------
1578 @deffn {関数} icurvature ([@var{i}, @var{j}, @var{k}], [@var{h}])
1579 第二種Christoffel記号(@code{ichr2})を使った
1580 Riemann曲率テンソルをもたらします。
1581 以下の表記法が使われます:
1582 @example
1583             h             h            h         %1         h
1584   icurvature     = - ichr2      - ichr2     ichr2    + ichr2
1585             i j k         i k,j        %1 j      i k        i j,k
1586                             h          %1
1587                      + ichr2      ichr2
1588                             %1 k       i j
1589 @end example
1591 @opencatbox
1592 @category{Package itensor}
1593 @closecatbox
1594 @end deffn
1596 @c -----------------------------------------------------------------------------
1597 @deffn {関数} covdiff (@var{expr}, @var{v_1}, @var{v_2}, ...)
1598 第二種Christoffel記号(@code{ichr2})を使って、
1599 変数 @var{v_i}に対する
1600 @var{expr}の共変微分をもたらします。
1601 これらを評価するには、
1602 @code{ev(@var{expr},ichr2)}を使わなければ行けません。
1604 @example
1606 (%i1) load("itensor");
1607 (%o1)      /share/tensor/itensor.lisp
1608 (%i2) entertensor()$
1609 Enter tensor name: a;
1610 Enter a list of the covariant indices: [i,j];
1611 Enter a list of the contravariant indices: [k];
1612 Enter a list of the derivative indices: [];
1613                                       k
1614 (%t2)                                a
1615                                       i j
1616 (%i3) ishow(covdiff(%,s))$
1617              k         %1     k         %1     k
1618 (%t3)     - a     ichr2    - a     ichr2    + a
1619              i %1      j s    %1 j      i s    i j,s
1621              k     %1
1622       + ichr2     a
1623              %1 s  i j
1624 (%i4) imetric:g;
1625 (%o4)                                  g
1626 (%i5) ishow(ev(%th(2),ichr2))$
1627          %1 %4  k
1628         g      a     (g       - g       + g      )
1629                 i %1   s %4,j    j s,%4    j %4,s
1630 (%t5) - ------------------------------------------
1631                             2
1632 @group
1633     %1 %3  k
1634    g      a     (g       - g       + g      )
1635            %1 j   s %3,i    i s,%3    i %3,s
1636  - ------------------------------------------
1637                        2
1638     k %2  %1
1639    g     a    (g        - g        + g       )
1640           i j   s %2,%1    %1 s,%2    %1 %2,s     k
1641  + ------------------------------------------- + a
1642                         2                         i j,s
1643 @end group
1644 (%i6)
1645 @end example
1647 @opencatbox
1648 @category{Package itensor}
1649 @closecatbox
1650 @end deffn
1652 @c -----------------------------------------------------------------------------
1653 @deffn {関数} lorentz_gauge (@var{expr})
1654 反変添字と同一の微分添字を持つ @var{expr}の中で
1655 添字付きオブジェクトすべてに0を代入することで、
1656 Lorentz条件を課します。
1658 @opencatbox
1659 @category{Package itensor}
1660 @closecatbox
1661 @end deffn
1663 @c -----------------------------------------------------------------------------
1664 @deffn {関数} igeodesic_coords (@var{expr}, @var{name})
1666 @var{expr}内の、未微分 Christoffel記号と
1667 計量テンソルの一階微分を消すようにします。
1668 @code{igeodesic_coords}関数での @var{name}は
1669 (もし @var{expr})の中で現れるなら)
1670 計量 @var{name}を参照します。
1671 一方で、接続係数は
1672 名前 @code{ichr1}か @code{ichr2}でコールされなければいけません。
1673 以下の例は、
1674 @code{igeodesic_coords}関数を使った、
1675 Riemann曲率テンソルが満たす巡回恒等式の検証を例示します。
1677 @example
1679 (%i1) load("itensor");
1680 (%o1)      /share/tensor/itensor.lisp
1681 (%i2) ishow(icurvature([r,s,t],[u]))$
1682              u            u         %1         u     
1683 (%t2) - ichr2      - ichr2     ichr2    + ichr2      
1684              r t,s        %1 s      r t        r s,t 
1686                                               u         %1
1687                                        + ichr2     ichr2
1688                                               %1 t      r s
1689 (%i3) ishow(igeodesic_coords(%,ichr2))$
1690                                  u            u
1691 (%t3)                       ichr2      - ichr2
1692                                  r s,t        r t,s
1693 (%i4) ishow(igeodesic_coords(icurvature([r,s,t],[u]),ichr2)+
1694             igeodesic_coords(icurvature([s,t,r],[u]),ichr2)+
1695             igeodesic_coords(icurvature([t,r,s],[u]),ichr2))$
1696              u            u            u            u
1697 (%t4) - ichr2      + ichr2      + ichr2      - ichr2
1698              t s,r        t r,s        s t,r        s r,t
1700                                              u            u
1701                                       - ichr2      + ichr2
1702                                              r t,s        r s,t
1703 (%i5) canform(%);
1704 (%o5)                                  0
1706 @end example
1708 @opencatbox
1709 @category{Package itensor}
1710 @closecatbox
1711 @end deffn
1713 @c -----------------------------------------------------------------------------
1714 @subsection Moving frames
1715 @c -----------------------------------------------------------------------------
1717 今ではMaximaは
1718 動標構(moving frame)を使って計算を実行する能力があります。
1719 これらは直交標構(テトラド、四脚場)か任意系であり得ます。
1721 標構(frame)を使うには、
1722 最初に@code{iframe_flag}を @code{true}に設定しなければいけません。
1723 これにより、
1724 計算内で、
1725 Christoffel記号, @code{ichr1}と @code{ichr2}が
1726 もっと一般的な標構(frame)の接続係数
1727 @code{icc1}と @code{icc2}に置き換えられることになります。
1728 特に、
1729 @code{covdiff}と @code{icurvature}の振る舞いが変わります。
1731 系は2つのテンソルで定義されます:
1732 逆標枠場 (@code{ifri}, 双対基底四脚場)と
1733 標構計量(frame metric) @code{ifg}。
1734 標構計量は直交標構の単位行列、すなわち、
1735 Minkowski時空での直交標構のLorentz計量です。
1736 逆標枠場は標構基底(単位ベクトル)を定義します。
1737 標枠と標構計量に縮約プロパティが定義されます。
1739 @code{iframe_flag}がtrueなら、
1740 たくさんの @code{itensor}式が、
1741 @code{imetric}が上付き添字と下付き添字に関して定義する計量の代わりに
1742 標構計量 @code{ifg}を使います。
1744 重要: 変数 @code{iframe_flag}を @code{true}に設定することは
1745 @code{defcon}や @code{imetric}のコールによって定義された計量の縮約プロパティを
1746 未定義に戻しません。
1747 もし標枠場が使われるなら、
1748 @code{imetric}関数を呼び出さず、
1749 変数 @code{imetric}に名前を割り当てて計量を定義することが最良です。
1752 Maximaはこれら2つのテンソルを使って、
1753 接続係数 (@code{icc1}と @code{icc2})の一部を形成する
1754 標構係数 (@code{ifc1}と @code{ifc2})を定義します。
1755 以下の例がそれを例示します:
1757 @example
1759 (%i1) load("itensor");
1760 (%o1)      /share/tensor/itensor.lisp
1761 (%i2) iframe_flag:true;
1762 (%o2)                                true
1763 (%i3) ishow(covdiff(v([],[i]),j))$
1764                                i        i     %1
1765 (%t3)                         v   + icc2     v
1766                                ,j       %1 j
1767 (%i4) ishow(ev(%,icc2))$
1768                                %1     i       i
1769 (%t4)                         v   ifc2     + v
1770                                       %1 j    ,j
1771 (%i5) ishow(ev(%,ifc2))$
1772                           %1    i %2                i
1773 (%t5)                    v   ifg     ifc1        + v
1774                                          %1 j %2    ,j
1775 (%i6) ishow(ev(%,ifc1))$
1776 @group
1777             %1    i %2
1778            v   ifg     (ifb        - ifb        + ifb       )
1779                            j %2 %1      %2 %1 j      %1 j %2     i
1780 (%t6)      -------------------------------------------------- + v
1781                                    2                             ,j
1782 @end group
1783 (%i7) ishow(ifb([a,b,c]))$
1784                                                    %3    %4
1785 (%t7)               (ifri        - ifri       ) ifr   ifr
1786                          a %3,%4       a %4,%3     b     c
1788 @end example
1790 もし @code{iframe_bracket_form}フラグが @code{false}に設定されているなら
1791 標構ブラケット(frame bracket) (@code{ifb})を計算するのに代わりの方法が使われます:
1793 @example
1795 (%i8) block([iframe_bracket_form:false],ishow(ifb([a,b,c])))$
1796                                 %6    %5        %5      %6
1797 (%t8)              ifri     (ifr   ifr     - ifr     ifr  )
1798                        a %5     b     c,%6      b,%6    c
1800 @end example
1802 @c -----------------------------------------------------------------------------
1803 @deffn {関数} iframes ()
1805 Maximaのこのバージョン以来、
1806 @code{ifr}と @code{ifri}に関する縮約恒等式がいつも定義されます。
1807 as is the frame bracket (@code{ifb}), 
1808 この関数は何もしません。
1810 @opencatbox
1811 @category{Package itensor}
1812 @closecatbox
1813 @end deffn
1815 @c -----------------------------------------------------------------------------
1816 @defvr {変数} ifb
1818 標構ブラケット(frame bracket)。
1819 標構計量の接続係数への寄与が標構ブラケットを使って表されます:
1821 @example
1823           - ifb      + ifb      + ifb
1824                c a b      b c a      a b c
1825 ifc1    = --------------------------------
1826     abc                  2
1828 @end example
1830 標構ブラケット自身は
1831 標枠と標構計量を使って定義されます。
1832 @code{frame_bracket_form}の値に依存して
1833 2つの代わりの計算方法が使われます。
1834 もし true (デフォルト)か、もし @code{itorsion_flag}が @code{true}なら:
1836 @example
1838           d      e                                      f
1839 ifb =  ifr    ifr   (ifri      - ifri      - ifri    itr   )
1840    abc    b      c       a d,e       a e,d       a f    d e
1843 @end example
1845 そうでないなら:
1847 @example
1849              e      d        d      e
1850 ifb    = (ifr    ifr    - ifr    ifr   ) ifri
1851    abc       b      c,e      b,e    c        a d
1853 @end example
1855 @opencatbox
1856 @category{Package itensor}
1857 @closecatbox
1858 @end defvr
1861 @c -----------------------------------------------------------------------------
1862 @defvr {変数} icc1
1864 第一種接続係数。
1865 @code{itensor}では、以下のように定義されます。
1867 @example
1869 icc1    = ichr1    - ikt1    - inmc1
1870     abc        abc       abc        abc
1872 @end example
1874 この式では、
1875 もし @code{iframe_flag}が trueなら、
1876 Christoffel記号 @code{ichr1}が
1877 標構接続係数 @code{ifc1}に置き換えられます。
1878 もし @code{itorsion_flag}が @code{false}なら、
1879  @code{ikt1}は省略されます。
1880 もし標構基底が使われるなら、
1881 ねじれが標構ブラケットの一部として既に計算されているので、
1882 その時にも @code{ikt1}は省略されます。
1883 最後に、
1884 @code{inonmet_flag}が @code{false}なら、
1885 @code{inmc1}は存在しません。
1887 @opencatbox
1888 @category{Package itensor}
1889 @closecatbox
1890 @end defvr
1892 @c -----------------------------------------------------------------------------
1893 @defvr {変数} icc2
1895 第二種接続係数。
1896 @code{itensor}では、以下のように定義されます。
1898 @example
1900     c         c        c         c
1901 icc2   = ichr2   - ikt2   - inmc2
1902     ab        ab       ab        ab
1904 @end example
1906 この式では、
1907 もし @code{iframe_flag}が trueなら、
1908 Christoffel記号 @code{ichr2}が
1909 標構接続係数 @code{ifc2}に置き換えられます。
1910 もし @code{itorsion_flag}が @code{false}なら、
1911  @code{ikt2}は省略されます。
1912 もし標構基底が使われるなら、
1913 ねじれが標構ブラケットの一部として既に計算されているので、
1914 その時にも @code{ikt1}は省略されます。
1915 最後に、
1916 @code{inonmet_flag}が @code{false}なら、
1917 @code{inmc1}は存在しません。
1919 @opencatbox
1920 @category{Package itensor}
1921 @closecatbox
1922 @end defvr
1924 @c -----------------------------------------------------------------------------
1925 @defvr {変数} ifc1
1927 (Ricci回転係数としても知られている)第一種標構係数。
1928 このテンソルは
1929 標構計量の第一種接続係数への寄与を表します。
1930 以下のように定義されます:
1932 @example
1934           - ifb      + ifb      + ifb
1935                c a b      b c a      a b c
1936 ifc1    = --------------------------------
1937     abc                   2
1940 @end example
1942 @opencatbox
1943 @category{Package itensor}
1944 @closecatbox
1945 @end defvr
1947 @c -----------------------------------------------------------------------------
1948 @defvr {変数} ifc2
1950 第二種標構係数。
1951 このテンソルは標構計量の第一種接続係数への寄与を表します。
1952 必要に応じて、標構ブラケット (@code{ifb})の、
1953 適切な上付き、下付き添字での置換として定義されます:
1955 @example
1957     c       cd
1958 ifc2   = ifg   ifc1
1959     ab             abd
1961 @end example
1963 @opencatbox
1964 @category{Package itensor}
1965 @closecatbox
1966 @end defvr
1968 @defvr {変数} ifr
1970 標枠。
1971 標構計量(@code{ifg})を形成するために
1972 逆標構場 (@code{ifri})を
1973 縮約します。
1975 @opencatbox
1976 @category{Package itensor}
1977 @closecatbox
1978 @end defvr
1980 @c -----------------------------------------------------------------------------
1981 @defvr {変数} ifri
1983 逆標構場。
1984 (双対基底ベクトル)標構基底を指定します。
1985 標構計量と一緒に、
1986 標構に基づいた計算すべての基底を形成します。
1988 @opencatbox
1989 @category{Package itensor}
1990 @closecatbox
1991 @end defvr
1993 @c -----------------------------------------------------------------------------
1994 @defvr {変数} ifg
1996 標構計量。
1997 @code{kdelta}のデフォルトですが、
1998 @code{components}を使って変えることができます。
2000 @opencatbox
2001 @category{Package itensor}
2002 @closecatbox
2003 @end defvr
2005 @c -----------------------------------------------------------------------------
2006 @defvr {変数} ifgi
2008 逆標構計量。
2009 標構計量 (@code{ifg})を @code{kdelta}に縮約します。
2011 @opencatbox
2012 @category{Package itensor}
2013 @closecatbox
2014 @end defvr
2016 @c -----------------------------------------------------------------------------
2017 @defvr {オプション変数} iframe_bracket_form
2018 デフォルト値: @code{true}
2020 標構ブラケット (@code{ifb})が如何に計算されるか指定します。
2022 @opencatbox
2023 @category{Package itensor}
2024 @closecatbox
2025 @end defvr
2027 @c -----------------------------------------------------------------------------
2028 @subsection Torsion and nonmetricity
2029 @c -----------------------------------------------------------------------------
2031 Maximaは今では、ねじれと非計量性を考慮することができます。
2032 フラグ @code{itorsion_flag}が @code{true}に設定されている時、
2033 ねじれの寄与が
2034 接続係数に加えられます。
2035 同様に、
2036 フラグ @code{inonmet_flag}が trueの時、
2037 非計量性成分が含まれます。
2039 @c -----------------------------------------------------------------------------
2040 @defvr {変数} inm
2042 非計量性ベクトル。
2043 共形非計量性は計量テンソルの共変微分を通して定義されます。
2044 @code{inonmet_flag}が @code{true}に設定されている時
2045 通常零の計量テンソルの共変微分は以下のように評価されます:
2047 @example
2049 g     =- g  inm
2050  ij;k     ij   k
2052 @end example
2054 @opencatbox
2055 @category{Package itensor}
2056 @closecatbox
2057 @end defvr
2059 @c -----------------------------------------------------------------------------
2060 @defvr {変数} inmc1
2062 非計量ベクトル成分の共変置換。
2063 以下のように定義されます:
2065 @example
2067            g   inm  - inm  g   - g   inm
2068             ab    c      a  bc    ac    b
2069 inmc1    = ------------------------------
2070      abc                 2
2072 @end example
2074 (もし標構計量を使うなら、@code{ifg}を @code{g}に代入します。)
2076 @opencatbox
2077 @category{Package itensor}
2078 @closecatbox
2079 @end defvr
2081 @c -----------------------------------------------------------------------------
2082 @defvr {変数} inmc2
2084 非計量ベクトル成分の反変置換。
2085 もし @code{inonmet_flag}が @code{true}なら
2086 接続係数で使われます。
2087 以下のように定義されます:
2089 @example
2091                       c         c         cd
2092           -inm  kdelta  - kdelta  inm  + g   inm  g
2093      c        a       b         a    b          d  ab
2094 inmc2   = -------------------------------------------
2095      ab                        2
2097 @end example
2099 (もし標構計量を使うなら、@code{ifg}を @code{g}に代入します。)
2101 @opencatbox
2102 @category{Package itensor}
2103 @closecatbox
2104 @end defvr
2106 @c -----------------------------------------------------------------------------
2107 @defvr {変数} ikt1
2109 (コントーションとしても知られる)ねじれテンソルの共変置換。
2110 以下のように定義されます:
2112 @example
2114                   d           d       d
2115           -g   itr  - g    itr   - itr   g
2116             ad    cb    bd    ca      ab  cd
2117 ikt1    = ----------------------------------
2118     abc                   2
2120 @end example
2122 (もし標構計量を使うなら、@code{ifg}を @code{g}に代入します。)
2124 @opencatbox
2125 @category{Package itensor}
2126 @closecatbox
2127 @end defvr
2129 @c -----------------------------------------------------------------------------
2130 @defvr {変数} ikt2
2132 (コントーションとしても知られる)ねじれテンソルの共変置換。
2133 以下のように定義されます:
2135 @example
2137     c     cd
2138 ikt2   = g   ikt1
2139     ab           abd
2141 @end example
2143 (もし標構計量を使うなら、@code{ifg}を @code{g}に代入します。)
2145 @opencatbox
2146 @category{Package itensor}
2147 @closecatbox
2148 @end defvr
2150 @c -----------------------------------------------------------------------------
2151 @defvr {変数} itr
2153 ねじれテンソル。
2154 以下の例で例示されるように、
2155 ねじれを伴う計量に関してスカラー関数上の繰り返される共変微分は計算されません:
2157 @example
2158 (%i1) load("itensor");
2159 (%o1)      /share/tensor/itensor.lisp
2160 (%i2) imetric:g;
2161 (%o2)                                  g
2162 (%i3) covdiff( covdiff( f( [], []), i), j)
2163                       - covdiff( covdiff( f( [], []), j), i)$
2164 (%i4) ishow(%)$
2165                                    %4              %2
2166 (%t4)                    f    ichr2    - f    ichr2
2167                           ,%4      j i    ,%2      i j
2168 (%i5) canform(%);
2169 (%o5)                                  0
2170 (%i6) itorsion_flag:true;
2171 (%o6)                                true
2172 (%i7) covdiff( covdiff( f( [], []), i), j)
2173                       - covdiff( covdiff( f( [], []), j), i)$
2174 (%i8) ishow(%)$
2175                            %8             %6
2176 (%t8)             f    icc2    - f    icc2    - f     + f
2177                    ,%8     j i    ,%6     i j    ,j i    ,i j
2178 (%i9) ishow(canform(%))$
2179                                    %1             %1
2180 (%t9)                     f    icc2    - f    icc2
2181                            ,%1     j i    ,%1     i j
2182 (%i10) ishow(canform(ev(%,icc2)))$
2183                                    %1             %1
2184 (%t10)                    f    ikt2    - f    ikt2
2185                            ,%1     i j    ,%1     j i
2186 (%i11) ishow(canform(ev(%,ikt2)))$
2187                       %2 %1                    %2 %1
2188 (%t11)          f    g      ikt1       - f    g      ikt1
2189                  ,%2            i j %1    ,%2            j i %1
2190 (%i12) ishow(factor(canform(rename(expand(ev(%,ikt1))))))$
2191                            %3 %2            %1       %1
2192                      f    g      g      (itr    - itr   )
2193                       ,%3         %2 %1     j i      i j
2194 (%t12)               ------------------------------------
2195                                       2
2196 (%i13) decsym(itr,2,1,[anti(all)],[]);
2197 (%o13)                               done
2198 (%i14) defcon(g,g,kdelta);
2199 (%o14)                               done
2200 (%i15) subst(g,nounify(g),%th(3))$
2201 (%i16) ishow(canform(contract(%)))$
2202                                            %1
2203 (%t16)                           - f    itr
2204                                     ,%1    i j
2206 @end example
2208 @opencatbox
2209 @category{Package itensor}
2210 @closecatbox
2211 @end defvr
2213 @c -----------------------------------------------------------------------------
2214 @subsection Exterior algebra
2215 @c -----------------------------------------------------------------------------
2217 @code{itensor}パッケージは
2218 完全反対称共変テンソル場上の
2219 演算を実行できます。
2220 回数 (0,L)の完全反対称テンソル場は
2221 微分L形式に対応します。
2222 これらのオブジェクト上で、
2223 外積やウェッジ積として知られる乗算が定義されます。
2225 不運にも、
2226 すべての作者がウェッジ積の定義に同意しません。
2227 何人の作者は反対称の概念に対応した定義を好みます:
2228 これらの仕事では、
2229 2つのベクトル場のウェッジ積は
2230 例えば、以下のように定義されます。
2232 @example
2233             a a  - a a
2234              i j    j i
2235  a  /\ a  = -----------
2236   i     j        2
2237 @end example
2239 もっと一般的に、
2240 p形式や q形式の積は以下のように定義されます。
2242 @example
2243                        1     k1..kp l1..lq
2244 A       /\ B       = ------ D              A       B
2245  i1..ip     j1..jq   (p+q)!  i1..ip j1..jq  k1..kp  l1..lq
2246 @end example
2248 ここで、 @code{D}はKroneckerのデルタを表します。
2250 しかし、他の作者は容積要素の概念に対応する
2251 ``幾何的''定義を好みます:
2253 @example
2254 a  /\ a  = a a  - a a
2255  i     j    i j    j i
2256 @end example
2258 そいて、一般的な場合,
2260 @example
2261                        1    k1..kp l1..lq
2262 A       /\ B       = ----- D              A       B
2263  i1..ip     j1..jq   p! q!  i1..ip j1..jq  k1..kp  l1..lq
2264 @end example
2266 @code{itensor}はテンソル代数パッケージなので、
2267 これら2つの定義の前者がより自然なもののようです。
2268 しかし、多くの応用は後者の定義を使います。
2269 このジレンマを解決するに、
2270 ウェッジ積の振る舞いを制御するフラグが実装されました:
2271 もし @code{igeowedge_flag}が @code{false} (デフォルト)なら、
2272 前者の "テンソル的"定義が使われ、
2273 層でないなら,後者の"幾何的"定義が適用されます。
2275 @defvr {演算子} ~
2276 @ifinfo
2277 @fnindex Wedge product
2278 @end ifinfo
2280 ウェッジ積演算子は
2281 ティルデ @code{~}で示されれます。
2282 これは二項演算子です。
2283 引数は、
2284 スカラ、階数1の共変テンソル、
2285 共変添字すべてに関して反対称と宣言された階数 @code{l}の共変テンソルを含む式
2286 でなければいけません。
2288 以下の例のように、
2289 ウェッジ積演算子の振る舞いは
2290 @code{igeowedge_flag}
2291 フラグで制御されます:
2293 @example
2294 (%i1) load("itensor");
2295 (%o1)      /share/tensor/itensor.lisp
2296 (%i2) ishow(a([i])~b([j]))$
2297                                  a  b  - b  a
2298                                   i  j    i  j
2299 (%t2)                            -------------
2300                                        2
2301 (%i3) decsym(a,2,0,[anti(all)],[]);
2302 (%o3)                                done
2303 (%i4) ishow(a([i,j])~b([k]))$
2304                           a    b  + b  a    - a    b
2305                            i j  k    i  j k    i k  j
2306 (%t4)                     ---------------------------
2307                                        3
2308 (%i5) igeowedge_flag:true;
2309 (%o5)                                true
2310 (%i6) ishow(a([i])~b([j]))$
2311 (%t6)                            a  b  - b  a
2312                                   i  j    i  j
2313 (%i7) ishow(a([i,j])~b([k]))$
2314 (%t7)                     a    b  + b  a    - a    b
2315                            i j  k    i  j k    i k  j
2316 @end example
2318 @opencatbox
2319 @category{Package itensor}
2320 @category{Operators}
2321 @closecatbox
2322 @end defvr
2324 @c -----------------------------------------------------------------------------
2325 @defvr {演算子} |
2326 @ifinfo
2327 @fnindex Contraction with a vector
2328 @end ifinfo
2330 縦線 @code{|}は
2331 "ベクトルの縮約"二項演算子を示します。
2332 完全反対称共変テンソルが反変ベクトルと縮約される時、
2333 結果は、どの添字が縮約に使われるかに関わらず同じです。
2334 このように、
2335 添字に無関係な方法で縮約演算子を定義することが可能です。
2337 @code{itensor}パッケージでは、
2338 ベクトルとの縮約は常に
2339 文字通りの並べ順で最初の添字に対して実行されます。
2340 これは
2341 @code{|}演算子を含む式のより良い整理を保証します。
2342 例えば:
2344 @example
2345 (%i1) load("itensor");
2346 (%o1)      /share/tensor/itensor.lisp
2347 (%i2) decsym(a,2,0,[anti(all)],[]);
2348 (%o2)                                done
2349 (%i3) ishow(a([i,j],[])|v)$
2350                                     %1
2351 (%t3)                              v   a
2352                                         %1 j
2353 (%i4) ishow(a([j,i],[])|v)$
2354                                      %1
2355 (%t4)                             - v   a
2356                                          %1 j
2357 @end example
2359 @code{|}演算子で使われるテンソルは
2360 は共変添字に対して完全反対称と宣言されなければいけないことが
2361 本質的であることに注意してください。
2362 そうでないなら、結果は正しくありません。
2364 @opencatbox
2365 @category{Package itensor}
2366 @category{Operators}
2367 @closecatbox
2368 @end defvr
2370 @c -----------------------------------------------------------------------------
2371 @deffn {関数} extdiff (@var{expr}, @var{i})
2373 添字 @var{i}に対する
2374 @var{expr}の外積を計算します。
2375 外微分は形式的に
2376 偏微分演算子のウェッジ積で微分形式として定義されます。
2377 そんなように、
2378 演算子も
2379 @code{igeowedge_flag}の設定で制御されます。
2380 例えば:
2382 @example
2383 (%i1) load("itensor");
2384 (%o1)      /share/tensor/itensor.lisp
2385 (%i2) ishow(extdiff(v([i]),j))$
2386                                   v    - v
2387                                    j,i    i,j
2388 (%t2)                             -----------
2389                                        2
2390 (%i3) decsym(a,2,0,[anti(all)],[]);
2391 (%o3)                                done
2392 (%i4) ishow(extdiff(a([i,j]),k))$
2393                            a      - a      + a
2394                             j k,i    i k,j    i j,k
2395 (%t4)                      ------------------------
2396                                       3
2397 (%i5) igeowedge_flag:true;
2398 (%o5)                                true
2399 (%i6) ishow(extdiff(v([i]),j))$
2400 (%t6)                             v    - v
2401                                    j,i    i,j
2402 (%i7) ishow(extdiff(a([i,j]),k))$
2403 (%t7)                    - (a      - a      + a     )
2404                              k j,i    k i,j    j i,k
2406 @end example
2408 @opencatbox
2409 @category{Package itensor}
2410 @closecatbox
2411 @end deffn
2413 @c -----------------------------------------------------------------------------
2414 @deffn {関数} hodge (@var{expr})
2416 @var{expr}のHodge双対を計算します。
2417 例えば:
2419 @example
2421 (%i1) load("itensor");
2422 (%o1)      /share/tensor/itensor.lisp
2423 (%i2) imetric(g);
2424 (%o2)                            done
2425 (%i3) idim(4);
2426 (%o3)                            done
2427 (%i4) icounter:100;
2428 (%o4)                             100
2429 (%i5) decsym(A,3,0,[anti(all)],[])$
2431 (%i6) ishow(A([i,j,k],[]))$
2432 (%t6)                           A
2433                                  i j k
2434 (%i7) ishow(canform(hodge(%)))$
2435                           %1 %2 %3 %4
2436                levi_civita            g        A
2437                                        %1 %102  %2 %3 %4
2438 (%t7)          -----------------------------------------
2439                                    6
2440 (%i8) ishow(canform(hodge(%)))$
2441                  %1 %2 %3 %8            %4 %5 %6 %7
2442 (%t8) levi_civita            levi_civita            g       
2443                                                      %1 %106
2444                              g        g        g      A         /6
2445                               %2 %107  %3 %108  %4 %8  %5 %6 %7
2446 (%i9) lc2kdt(%)$
2448 (%i10) %,kdelta$
2450 (%i11) ishow(canform(contract(expand(%))))$
2451 (%t11)                     - A
2452                               %106 %107 %108
2454 @end example
2456 @opencatbox
2457 @category{Package itensor}
2458 @closecatbox
2459 @end deffn
2461 @c -----------------------------------------------------------------------------
2462 @defvr {オプション変数} igeowedge_flag
2463 デフォルト値: @code{false}
2465 ウェッジ積と外微分の振る舞いを制御します。
2466 @code{false} (デフォルト)に設定された時、
2467 微分形式の概念は
2468 完全反対称共変テンソル場のそれに対応します。
2469 @code{true}に設定された時、
2470 微分形式は容積要素の概念に一致します。
2472 @opencatbox
2473 @category{Package itensor}
2474 @closecatbox
2475 @end defvr
2477 @c -----------------------------------------------------------------------------
2478 @subsection Exporting TeX expressions
2479 @c -----------------------------------------------------------------------------
2481 @code{itensor}パッケージは
2482 テンソル式をTexにエクスポートするための限定サポートを提供します。
2483 @code{itensor}式は関数コールとして現れるので、
2484 いつもの Maxima @code{tex}コマンドは
2485 期待された出力を生成しません。
2486 代わりに@code{tentex}コマンドを試すことができます。
2487 これは、テンソル式を適切に添字が付けられたTeXオブジェクトに翻訳しようとします。
2489 @c -----------------------------------------------------------------------------
2490 @deffn {関数} tentex (@var{expr})
2492 以下の例のように、
2493 @code{tentex}関数を使うには、
2494 最初に@code{tentex}をロードしなければいけません:
2496 @example
2498 (%i1) load("itensor");
2499 (%o1)      /share/tensor/itensor.lisp
2500 (%i2) load("tentex");
2501 (%o2)       /share/tensor/tentex.lisp
2502 (%i3) idummyx:m;
2503 (%o3)                                  m
2504 (%i4) ishow(icurvature([j,k,l],[i]))$
2505             m1       i           m1       i           i
2506 (%t4)  ichr2    ichr2     - ichr2    ichr2     - ichr2
2507             j k      m1 l        j l      m1 k        j l,k
2509                                                       i
2510                                                + ichr2
2511                                                       j k,l
2512 (%i5) tentex(%)$
2513 $$\Gamma_@{j\,k@}^@{m_1@}\,\Gamma_@{l\,m_1@}^@{i@}-\Gamma_@{j\,l@}^@{m_1@}\,
2514  \Gamma_@{k\,m_1@}^@{i@}-\Gamma_@{j\,l,k@}^@{i@}+\Gamma_@{j\,k,l@}^@{i@}$$
2515 @end example
2517 コンパイルエラーに導かれるTeX式でのパーセント符号の出現を避けるための、
2518 @code{idummyx}割り当ての使用に注意してください。
2520 注意せよ: このバージョンの@code{tentex}関数は幾分実験的です。
2522 @opencatbox
2523 @category{Package itensor}
2524 @category{TeX output}
2525 @closecatbox
2526 @end deffn
2528 @c -----------------------------------------------------------------------------
2529 @subsection Interfacing with ctensor
2530 @c -----------------------------------------------------------------------------
2532 @code{itensor}パッケージは
2533 @code{ctensor}パッケージの文脈で実行することができる
2534 Maximaコードを生成する能力があります。
2535 この仕事を実行する関数は @code{ic_convert}です。
2537 @c -----------------------------------------------------------------------------
2538 @deffn {関数} ic_convert (@var{eqn})
2540 @code{itensor}方程式 @var{eqn}を
2541 @code{ctensor}割り当て文に変換します。
2542 添字付きオブジェクトが配列に変換される一方で、
2543 ダミー添字上の暗黙の和は明示的にされます。
2545 (配列下付き添字は添字付きオブジェクトの反変添字が続く共変の順です。)
2546 添字付きオブジェクトの微分は、
2547 微分添字で下に添えられた @code{ct_coords}に対して取られる @code{diff}の名詞形に
2548 置き換えられます。
2549 Christoffel記号 @code{ichr1}と @code{ichr2}は
2550 それぞれ、@code{lcs}と @code{mcs}に翻訳されます。
2551 もし @code{metricconvert}が @code{true}なら、
2552 2つの共変(反変)添字を持つ計量はすべて
2553 @code{lg} (@code{ug})にリネームされます。
2554 更に、 自由添字すべての上で足される@code{do}ループが導入されます。
2555 なので、
2556 ただ @code{ev}するだけで
2557 変換される割り当て分を評価することができます。
2558 以下の例はこの関数の特長を例示します。
2560 @example
2561 (%i1) load("itensor");
2562 (%o1)      /share/tensor/itensor.lisp
2563 (%i2) eqn:ishow(t([i,j],[k])=f([],[])*g([l,m],[])*a([],[m],j)
2564       *b([i],[l,k]))$
2565                              k        m   l k
2566 (%t2)                       t    = f a   b    g
2567                              i j      ,j  i    l m
2568 (%i3) ic_convert(eqn);
2569 (%o3) for i thru dim do (for j thru dim do (
2570        for k thru dim do
2571         t        : f sum(sum(diff(a , ct_coords ) b
2572          i, j, k                   m           j   i, l, k
2574  g    , l, 1, dim), m, 1, dim)))
2575   l, m
2576 (%i4) imetric(g);
2577 (%o4)                                done
2578 (%i5) metricconvert:true;
2579 (%o5)                                true
2580 (%i6) ic_convert(eqn);
2581 (%o6) for i thru dim do (for j thru dim do (
2582        for k thru dim do
2583         t        : f sum(sum(diff(a , ct_coords ) b
2584          i, j, k                   m           j   i, l, k
2586  lg    , l, 1, dim), m, 1, dim)))
2587    l, m
2588 @end example
2590 @opencatbox
2591 @category{Package itensor}
2592 @category{Package ctensor}
2593 @closecatbox
2594 @end deffn
2596 @c -----------------------------------------------------------------------------
2597 @subsection Reserved words
2598 @c -----------------------------------------------------------------------------
2600 以下の Maximaワードは @code{itensor}パッケージで内部的に使われているので、
2601 再定義してはいけません:
2603 @c REFORMAT THIS TABLE USING TEXINFO MARKUP
2604 @example
2605   Keyword    Comments
2606   ------------------------------------------
2607   indices2() Internal version of indices()
2608   conti      Lists contravariant indices
2609   covi       Lists covariant indices of a indexed object
2610   deri       Lists derivative indices of an indexed object
2611   name       Returns the name of an indexed object
2612   concan
2613   irpmon
2614   lc0
2615   _lc2kdt0
2616   _lcprod
2617   _extlc
2618 @end example