Annotation of OpenXM/src/asir-contrib/packages/doc/gtt_ekn/gtt_ekn-ja.texi, Revision 1.10
1.10 ! takayama 1: %% $OpenXM: OpenXM/src/asir-contrib/packages/doc/gtt_ekn/gtt_ekn-ja.texi,v 1.9 2019/02/14 02:22:09 takayama Exp $
1.7 takayama 2: %% xetex gtt_ekn.texi (.texi までつける. )
1.6 takayama 3: %% 以下コメントは @comment で始める. \input texinfo 以降は普通の tex 命令は使えない.
1.7 takayama 4: \input texinfo-ja
1.1 takayama 5: @iftex
6: @catcode`@#=6
7: @def@fref#1{@xrefX[#1,,@code{#1},,,]}
1.7 takayama 8: @def@b#1{{@bf #1}}
1.1 takayama 9: @catcode`@#=@other
10: @end iftex
11: @overfullrule=0pt
1.7 takayama 12: @documentlanguage ja
1.1 takayama 13: @c -*-texinfo-*-
14: @comment %**start of header
1.6 takayama 15: @comment --- おまじない終り ---
1.1 takayama 16:
1.6 takayama 17: @comment --- GNU info ファイルの名前 ---
1.1 takayama 18: @setfilename xyzman
19:
1.6 takayama 20: @comment --- タイトル ---
21: @settitle 2元分割表HGM
1.1 takayama 22:
23: @comment %**end of header
24: @comment %@setchapternewpage odd
25:
1.6 takayama 26: @comment --- おまじない ---
1.1 takayama 27: @ifinfo
28: @macro fref{name}
29: @ref{\name\,,@code{\name\}}
30: @end macro
31: @end ifinfo
32:
33: @iftex
34: @comment @finalout
35: @end iftex
36:
37: @titlepage
1.6 takayama 38: @comment --- おまじない終り ---
1.1 takayama 39:
1.6 takayama 40: @comment --- タイトル, バージョン, 著者名, 著作権表示 ---
41: @title 2元分割表HGM関数
42: @subtitle Risa/Asir 2元分割表HGM関数説明書
1.8 takayama 43: @subtitle 1.2 版
44: @subtitle 2019 年 2 月 14 日
1.1 takayama 45:
46: @author by Y.Goto, Y.Tachibana, N.Takayama
47: @page
48: @vskip 0pt plus 1filll
49: Copyright @copyright{} Risa/Asir committers
50: 2004--2010. All rights reserved.
51: @end titlepage
52:
1.6 takayama 53: @comment --- おまじない ---
1.1 takayama 54: @synindex vr fn
1.6 takayama 55: @comment --- おまじない終り ---
1.1 takayama 56:
1.6 takayama 57: @comment --- @node は GNU info, HTML 用 ---
58: @comment --- @node の引数は node-name, next, previous, up ---
1.1 takayama 59: @node Top,, (dir), (dir)
60:
1.6 takayama 61: @comment --- @menu は GNU info, HTML 用 ---
62: @comment --- chapter 名を正確に並べる ---
63: @comment --- この文書では chapter XYZ, Chapter Index がある.
64: @comment --- Chapter XYZ には section XYZについて, section XYZに関する関数がある.
1.1 takayama 65: @menu
1.6 takayama 66: * 2元分割表HGMの関数説明書について::
67: * 2元分割表HGMの関数::
68: * modular計算
1.1 takayama 69: * Index::
70: @end menu
71:
1.6 takayama 72: @comment --- chapter の開始 ---
73: @comment --- 親 chapter 名を正確に. 親がない場合は Top ---
74: @node 2元分割表HGMの関数説明書について,,, Top
75: @chapter 2元分割表HGMの関数説明書について
76:
77: この説明書では
78: HGM(holonomic gradient method) を用いた2元分割表の関数について説明する.
79: ChangeLog の項目は www.openxm.org の cvsweb で
80: ソースコードを読む時の助けになる情報が書かれている.
1.8 takayama 81: このパッケージは下記のようにロードする.
82: @example
83: load("gtt_ekn.rr");
84: @end example
85: @noindent
86: 最新版の asir-contrib package を取得するには, 下記のように更新関数を呼び出す.
87: @example
88: import("names.rr");
89: asir_contrib_update(|update=1);
90: @end example
91: @noindent
1.6 takayama 92: 本文中で引用している文献を列挙する.
1.1 takayama 93: @itemize @bullet
94: @item [GM2016]
95: Y.Goto, K.Matsumoto, Pfaffian equations and contiguity relations of the hypergeometric function of type (k+1,k+n+2) and their applications, arxiv:1602.01637 (version 1)
96: @item [T2016]
1.6 takayama 97: Y.Tachibana, 差分ホロノミック勾配法のモジュラーメソッドによる計算の高速化,
98: 2016, 神戸大学修士論文.
1.1 takayama 99: @item [GTT2016]
1.6 takayama 100: Y.Goto, Y.Tachibana, N.Takayama, 2元分割表に対する差分ホロノミック勾配法の実装,
1.8 takayama 101: 数理研講究録.
102: @item [TGKT]
103: Y.Tachibana, Y.Goto, T.Koyama, N.Takayama,
104: Holonomic Gradient Method for Two Way Contingency Tables,
105: arxiv:1803.04170
1.1 takayama 106: @item [TKT2015]
107: N.Takayama, S.Kuriki, A.Takemura,
108: $A$-hypergeometric distributions and Newton polytopes.
109: arxiv:1510.02269
110: @end itemize
111:
1.6 takayama 112: このマニュアルで説明する関数を用いたプログラム例は
1.1 takayama 113: gtt_ekn/test-t1.rr
1.6 takayama 114: など.
1.1 takayama 115:
1.4 takayama 116:
1.6 takayama 117: @node 2元分割表HGMの関数,,, Top
118: @chapter 2元分割表HGMの関数
1.1 takayama 119:
1.6 takayama 120: @comment --- section ``実験的関数'' の subsection xyz_abc
121: @comment --- subsection xyz_pqr xyz_stu がある.
1.1 takayama 122: @menu
123: * gtt_ekn.gmvector::
124: * gtt_ekn.nc::
125: * gtt_ekn.lognc::
126: * gtt_ekn.expectation::
127: * gtt_ekn.setup::
128: * gtt_ekn.upAlpha::
1.5 takayama 129: * gtt_ekn.cmle::
1.8 takayama 130: * gtt_ekn.set_debug_level::
1.9 takayama 131: * gtt_ekn.show_path::
1.10 ! takayama 132: * gtt_ekn.assert1::
! 133: * gtt_ekn.assert2::
1.1 takayama 134: @end menu
135:
1.6 takayama 136: @node 超幾何関数E(k,n),,, 2元分割表HGMの関数
137: @section 超幾何関数E(k,n)
1.1 takayama 138:
139: @comment **********************************************************
1.6 takayama 140: @comment --- ◯◯◯◯ の説明
141: @comment --- 個々の関数の説明の開始 ---
142: @comment --- section 名を正確に ---
143: @node gtt_ekn.gmvector,,, 超幾何関数E(k,n)
1.1 takayama 144: @subsection @code{gtt_ekn.gmvector}
1.6 takayama 145: @comment --- 索引用キーワード
1.1 takayama 146: @findex gtt_ekn.gmvector
147:
148: @table @t
149: @item gtt_ekn.gmvector(@var{beta},@var{p})
1.6 takayama 150: :: 周辺和 @var{beta}, セルの確率 @var{p} の二元分割表に付随する超幾何関数
151: E(k,n) の値およびその微分の値を戻す.
1.1 takayama 152: @item gtt_ekn.ekn_cBasis_2(@var{beta},@var{p})
1.6 takayama 153: の別名である.
1.1 takayama 154: @end table
155:
1.6 takayama 156: @comment --- 引数の簡単な説明 --- 以下まだ書いてない.
1.1 takayama 157: @table @var
158: @item return
1.6 takayama 159: ベクトル, 超幾何関数の値とその微分. 詳しくは下記.
1.1 takayama 160: @item beta
1.6 takayama 161: 行和, 列和のリスト. 成分はすべて正であること.
1.1 takayama 162: @item p
1.6 takayama 163: 二元分割表のセルの確率のリスト
1.1 takayama 164: @end table
165:
1.6 takayama 166: @comment --- ここで関数の詳しい説明 ---
167: @comment --- @itemize〜@end itemize は箇条書き ---
168: @comment --- @bullet は黒点付き ---
1.1 takayama 169: @itemize @bullet
170: @item
1.6 takayama 171: gmvector は Gauss-Manin vector の略である [GM2016].
1.1 takayama 172: @item
1.6 takayama 173: gmvector の戻り値は
174: [GM2016] の 6章 p.23 のベクトル Sである.
175: これは
176: [GM2016] の4章で定義されているベクトル F の定数倍であり,
177: その定数は
178: 第一成分が [GM2016] の6章で定義されている級数 S の値と等しく
179: なるように決められている.
1.1 takayama 180: @item
1.6 takayama 181: r1 x r2 分割表を考える.
182: m+1=r1, n+1=r2 とおく.
183: 正規化定数 Z は分割表 u を (m+1) × (n+1) 行列とするとき p^u/u! の和である.
184: ここで和は行和列和が @var{beta} であるような u 全体でとる
1.1 takayama 185: [TKT2015], [GM2016].
1.6 takayama 186: S はこの多項式 Z の p を
1.1 takayama 187: @verbatim
188: [[1,y11,...,y1n],
189: [1,y21,...,y2n],...,
190: [1,ym1, ...,ymn],
191: [1,1, ..., 1]]
192: @end verbatim
1.6 takayama 193: (1 が L 字型に並ぶ),
194: と正規化した級数である.
1.1 takayama 195: @item
1.6 takayama 196: 2x(n+1)分割表で, gmvector の戻り値を Lauricella F_D で書くことが
197: 以下のようにできる
198: (b[2][1]-b[1][1] >= 0 の場合).
199: ここで b[1][1], b[1][2] は, それぞれ 1 行目の行和, 2 行目の行和,
200: b[2][i] は i 列目の列和である.
1.1 takayama 201: @comment ekn/Talks/2015-12-3-goto.tex
202: @verbatim
203: S=F_D(-b[1,1], [-b[2,2],...,-b[2,n+1]], b[2,1]-b[1,1]+1 ; y)/C,
204: @end verbatim
1.8 takayama 205: C=b[1,1]! b[2,2]! ... b[2,n+1]! (b[2,1]-b[1,1])!
1.6 takayama 206: とおく.
207: 1/C は L 字型の分割表
1.1 takayama 208: @verbatim
209: [[b[1,1], 0, ..., 0 ],
210: [b[2,1]-b[1,1],b[2,2], ..., b[2,n+1]]]
211: @end verbatim
1.6 takayama 212: に対応.
213: gmvector は
1.1 takayama 214: @verbatim
215: [S,(y11/a2) d_11 S,(y12/a3) d_12 S, ..., (y1n/a_(n+1)) d_1n S]
216: @end verbatim
1.6 takayama 217: である.
218: ここで d_ij は yij についての微分,
1.1 takayama 219: @verbatim
220: [a0, a1, ... ,a_(n+2)]
221: = [-b[1,2],-b[1,1],b[2,2], ..., b[2,n+1],b[2,1]]
222: @end verbatim
1.6 takayama 223: である.
1.1 takayama 224: @item
1.6 takayama 225: 周辺和 @var{beta}の時の正規化定数のセル確率 @var{p} に対する値は 多項式に退化した E(k,n) の値で表現できる. 文献 [TKT2015], [GM2016] 参照.
1.1 takayama 226: @item
1.6 takayama 227: option crt=1 (crt = Chinese remainder theorem) を与えると, 分散計算をおこなう
1.1 takayama 228: [T2016].
1.6 takayama 229: 分散計算用の各種パラメータの設定は
230: gtt_ekn.setup で行なう.
1.1 takayama 231: @end itemize
232:
1.6 takayama 233: @comment --- @example〜@end example は実行例の表示 ---
234: 例: 次は2 x 2 分割表で行和が [5,1], 列和が [3,3], 各セルの確率が
235: [[1/2,1/3],[1/7,1/5]] の場合の gmvector の値である.
1.1 takayama 236: @example
237: [3000] load("gtt_ekn.rr");
238: [3001] ekn_gtt.gmvector([[5,1],[3,3]],[[1/2,1/3],[1/7,1/5]])
239: [775/27783]
240: [200/9261]
241: @end example
242:
1.8 takayama 243: 例: N を2以上の自然数とする時, Gauss の超幾何関数(この場合は多項式となる)
244: F(-36N,-11N,2N,(1-1/N)/56) の値は T3 に代入される ( [TGKT] ).
245: @comment ekn/Prog2/2x2.rr
246: @example
247: N=2;
248: T2=gtt_ekn.gmvector([[36*N,13*N-1],[38*N-1,11*N]],[[1,(1-1/N)/56],[1,1]])[0][0];
249: D=fac(36*N)*fac(11*N)*fac(2*N-1);
250: T3=T2*D;
251: @end example
252: ちなみに同じ値を Mathematica に計算させるには
253: @example
254: n=2; Hypergeometric2F1[-36*n,-11*n,2*n,(1-1/n)/56]
255: @end example
256:
1.6 takayama 257: 参考: 2 x m 分割表(Lauricella FD)についてはパッケージ tk_fd でも下記のように同等な
258: 計算ができる.
259: 守備範囲の異なるプログラム同士の比較, debug 用参考.
1.1 takayama 260: @example
261: [3080] import("tk_fd.rr");
262: [3081] A=tk_fd.marginal2abc([4,5],[2,4,3]);
1.6 takayama 263: [-4,[-4,-3],-1] // 2変数 FD のパラメータ. a,[b1,b2],c
1.1 takayama 264: [3082] tk_fd.fd_hessian2(A[0],A[1],A[2],[1/2,1/3]);
265: Computing Dmat(ca) for parameters B=[-4,-3],X=[ 1/2 1/3 ]
266: [4483/124416,[ 1961/15552 185/1728 ],
267: [ 79/288 259/864 ]
268: [ 259/864 47/288 ]]
1.6 takayama 269: // 戻値は [F=F_D, gradient(F), Hessian(F)]
1.1 takayama 270:
1.6 takayama 271: // ekn_gt での例と同じパラメータ.
1.1 takayama 272: [3543] A=tk_fd.marginal2abc([5,1],[3,3]);
273: [-5,[-3],-1]
274: [3544] tk_fd.fd_hessian2(A[0],A[1],A[2],[(1/3)*(1/7)/((1/2)*(1/5))]);
275: Computing Dmat(ca) for parameters B=[-3],X=[ 10/21 ]
276: [775/27783,[ 20/147 ],[ 17/42 ]]
277: @end example
278:
1.6 takayama 279: 参考: 一般の A 分布の正規化定数についての Hessian の計算は実験的 package ot_hessian_ahg.rr
280: で実装のテストがされている. (これはまだ未完成のテスト版なので出力形式等も将来的には変更される.)
1.1 takayama 281: @example
282: import("ot_hgm_ahg.rr");
283: import("ot_hessian_ahg.rr");
284: def htest4() @{
285: extern C11_A;
286: extern C11_Beta;
287: Hess=newmat(7,7);
288: A =C11_A;
289: Beta0= [b0,b1,b2,b3];
290: BaseIdx=[4,5,6];
291: X=[x0,x1,x2,x3,x4,x5,x6];
292: for (I=0; I<7; I++) for (J=0; J<7; J++) @{
293: Idx = [I,J];
294: H=hessian_simplify(A,Beta0,X,BaseIdx,Idx);
295: Hess[I][J]=H;
296: printf("[I,J]=%a, Hessian_ij=%a\n",Idx,H);
297: @}
298: return(Hess);
299: @}
300: [2917] C11_A;
301: [[0,0,0,1,1,1,1],[1,0,0,1,0,1,0],[0,1,1,0,1,0,1],[1,1,0,1,1,0,0]]
302: [2918] C11_Beta;
303: [166,36,290,214]
304: [2919] Ans=htest4$
305: [2920] Ans[0][0];
306: [[((b1-b0-1)*x4)/(x0^2),[4]],[((b1-b0-1)*x6)/(x0^2),[6]],
307: [(b1^2+(-2*b0-1)*b1+b0^2+b0)/(x0^2),[]],[(x6)/(x0),[6,0]],[(x4)/(x0),[4,0]]]
308: @end example
309:
1.6 takayama 310: @comment --- 参照(リンク)を書く ---
1.1 takayama 311: @table @t
1.6 takayama 312: @item 参照
1.1 takayama 313: @ref{gtt_ekn.setup}
314: @ref{gtt_ekn.pfaffian_basis}
315: @end table
316:
1.6 takayama 317: @comment --- ChangeLog を書く. ソースコードの位置. 変更日時 など CVSサーバを見るため
1.1 takayama 318: @noindent
319: ChangeLog
320: @itemize @bullet
321: @item
1.6 takayama 322: この関数は
323: [GM2016] のアルゴリズムおよび
324: [T2016] による modular method を用いた高速化を実装したものである.
1.1 takayama 325: @item
1.6 takayama 326: 変更を受けたファイルは
1.1 takayama 327: OpenXM/src/asir-contrib/packages/src/gtt_ekn.rr 1.1, gtt_ekn/ekn_pfaffian_8.rr
328: @end itemize
329:
330:
331: @comment **********************************************************
1.6 takayama 332: @node gtt_ekn.nc,,, 超幾何関数E(k,n)
1.1 takayama 333: @subsection @code{gtt_ekn.nc}
1.6 takayama 334: @comment --- 索引用キーワード
1.1 takayama 335: @findex gtt_ekn.nc
336:
337: @table @t
338: @item gtt_ekn.nc(@var{beta},@var{p})
1.6 takayama 339: :: 周辺和 @var{beta}, セルの確率 @var{p} の二元分割表の条件付き確率の正規化定数 Z
340: およびその微分の値を戻す.
1.1 takayama 341: @end table
342:
1.6 takayama 343: @comment --- 引数の簡単な説明 --- 以下まだ書いてない.
1.1 takayama 344: @table @var
345: @item return
1.6 takayama 346: ベクトル [Z,[[d_11 Z, d_12 Z, ...], ..., [d_m1 Z, d_m2 Z, ...., d_mn Z]]]
1.1 takayama 347: @item beta
1.6 takayama 348: 行和, 列和のリスト. 成分はすべて正であること.
1.1 takayama 349: @item p
1.6 takayama 350: 二元分割表のセルの確率のリスト
1.1 takayama 351: @end table
352:
1.6 takayama 353: @comment --- ここで関数の詳しい説明 ---
354: @comment --- @itemize〜@end itemize は箇条書き ---
355: @comment --- @bullet は黒点付き ---
1.1 takayama 356: @itemize @bullet
357: @item
1.6 takayama 358: r1 x r2 分割表を考える.
359: m=r1, n=r2 とおく.
360: 正規化定数 Z は分割表 u を m × n 行列とするとき p^u/u! の和である.
361: ここで和は行和列和が @var{beta} であるような u 全体でとる
1.1 takayama 362: [TKT2015], [GM2016].
1.6 takayama 363: p^u は p_ij^u_ij の積, u! は u_ij! の積である.
364: d_ij Z で Z の変数 p_ij についての偏微分を表す.
1.1 takayama 365: @item
1.6 takayama 366: nc は gmvector の値を元に, [GM2016] の Prop
367: 7.1 に基づいて Z の値を計算する.
1.1 takayama 368: @item
1.6 takayama 369: option crt=1 (crt = Chinese remainder theorem) を与えると, 分散計算をおこなう.
370: 分散計算用の各種パラメータの設定は
371: gtt_ekn.setup で行なう.
1.1 takayama 372: @end itemize
373:
1.6 takayama 374: @comment --- @example〜@end example は実行例の表示 ---
375: 例: 2x3 分割表での Z とその微分の計算.
1.1 takayama 376: @example
377: [2237] gtt_ekn.nc([[4,5],[2,4,3]],[[1,1/2,1/3],[1,1,1]]);
378: [4483/124416,[ 353/7776 1961/15552 185/1728 ]
379: [ 553/20736 1261/15552 1001/13824 ]]
380: @end example
381:
1.6 takayama 382: 参考: 2 x m 分割表(Lauricella FD)についてはパッケージ tk_fd でも下記のように同等な
383: 計算ができる.
1.1 takayama 384: @example
385: [3076] import("tk_fd.rr");
386: [3077] A=tk_fd.marginal2abc([4,5],[2,4,3]);
387: [-4,[-4,-3],-1]
388: [3078] tk_fd.ahmat_abc(A[0],A[1],A[2],[[1,1/2,1/3],[1,1,1]]);
389: RS=[ 4 5 ], CSnew=[ 2 4 3 ], Ynew=[ 1 1/2 1/3 ]
390: [ 1 1 1 ]
391: Computing Dmat(ca) for parameters B=[-4,-3],X=[ 1/2 1/3 ]
392: [4483/124416,[[353/7776,1961/15552,185/1728],
393: [553/20736,1261/15552,1001/13824]]]
1.6 takayama 394: // 戻値は [Z, [[d_11 Z, d_12 Z, d_13 Z],
395: // [d_21 Z, d_22 Z, d_23 Z]]] の値.
396: // ここで d_ij は i,j 成分についての微分を表す.
1.1 takayama 397: @end example
398:
1.6 takayama 399: @comment --- 参照(リンク)を書く ---
1.1 takayama 400: @table @t
1.6 takayama 401: @item 参照
1.1 takayama 402: @ref{gtt_ekn.setup}
403: @ref{gtt_ekn.lognc}
404: @end table
405:
1.6 takayama 406: @comment --- ChangeLog を書く. ソースコードの位置. 変更日時 など CVSサーバを見るため
1.1 takayama 407: @noindent
408: ChangeLog
409: @itemize @bullet
410: @item
1.6 takayama 411: 変更を受けたファイルは
1.1 takayama 412: OpenXM/src/asir-contrib/packages/src/gtt_ekn.rr 1.1, gtt_ekn/ekn_eval.rr
413: @end itemize
414:
415:
416: @comment **********************************************************
1.6 takayama 417: @node gtt_ekn.lognc,,, 超幾何関数E(k,n)
1.1 takayama 418: @subsection @code{gtt_ekn.lognc}
1.6 takayama 419: @comment --- 索引用キーワード
1.1 takayama 420: @findex gtt_ekn.lognc
421:
422: @table @t
423: @item gtt_ekn.lognc(@var{beta},@var{p})
1.6 takayama 424: :: 周辺和 @var{beta}, セルの確率 @var{p} の二元分割表の条件付き確率の正規化定数 Z
425: の log の近似値およびその微分の近似値を戻す.
1.1 takayama 426: @end table
427:
1.6 takayama 428: @comment --- 引数の簡単な説明 --- 以下まだ書いてない.
1.1 takayama 429: @table @var
430: @item return
1.6 takayama 431: ベクトル [log(Z), [[d_11 log(Z), d_12 log(Z), ...], [d_21 log(Z),...], ... ]
1.1 takayama 432: @item beta
1.6 takayama 433: 行和, 列和のリスト. 成分はすべて正であること.
1.1 takayama 434: @item p
1.6 takayama 435: 二元分割表のセルの確率のリスト
1.1 takayama 436: @end table
437:
1.6 takayama 438: @comment --- ここで関数の詳しい説明 ---
439: @comment --- @itemize〜@end itemize は箇条書き ---
440: @comment --- @bullet は黒点付き ---
1.1 takayama 441: @itemize @bullet
442: @item
1.6 takayama 443: 条件付き最尤推定に利用する [TKT2015].
444: @item option crt=1 (crt = Chinese remainder theorem) を与えると, 分散計算をおこなう.
445: 分散計算用の各種パラメータの設定は
446: gtt_ekn.setup で行なう.
1.1 takayama 447: @end itemize
448:
1.6 takayama 449: @comment --- @example〜@end example は実行例の表示 ---
450: 例: 2 × 3 分割表での例. 第一成分のみ近似値.
1.1 takayama 451: @example
452: [2238] gtt_ekn.lognc([[4,5],[2,4,3]],[[1,1/2,1/3],[1,1,1]]);
453: [-3.32333832422461674630,[ 5648/4483 15688/4483 13320/4483 ]
454: [ 3318/4483 10088/4483 9009/4483 ]]
455: @end example
456:
1.6 takayama 457: 参考: 2 x m 分割表(Lauricella FD)についてはパッケージ tk_fd でも下記のように同等な
458: 計算ができる.
1.1 takayama 459: @example
460: [3076] import("tk_fd.rr");
461: [3077] A=tk_fd.marginal2abc([4,5],[2,4,3]);
462: [-4,[-4,-3],-1]
463: [3078] tk_fd.log_ahmat_abc(A[0],A[1],A[2],[[1,1/2,1/3],[1,1,1]]);
464: RS=[ 4 5 ], CSnew=[ 2 4 3 ], Ynew=[ 1 1/2 1/3 ]
465: [ 1 1 1 ]
466: Computing Dmat(ca) for parameters B=[-4,-3],X=[ 1/2 1/3 ]
467: [-3.32333832422461674639485797719209322217260539267246045320,
468: [[1.2598706, 3.499442, 2.971224],
469: [0.7401293, 2.250278, 2.009591]]]
1.6 takayama 470: // 戻値は [log(Z),
1.1 takayama 471: // [[d_11 log(Z), d_12 log(Z), d_13 log(Z)],
472: // [d_21 log(Z), d_22 log(Z), d_23 log(Z)]]]
1.6 takayama 473: // の近似値.
1.1 takayama 474: @end example
475:
1.6 takayama 476: @comment --- 参照(リンク)を書く ---
1.1 takayama 477: @table @t
1.6 takayama 478: @item 参照
1.1 takayama 479: @ref{gtt_ekn.setup}
480: @ref{gtt_ekn.nc}
481: @end table
482:
1.6 takayama 483: @comment --- ChangeLog を書く. ソースコードの位置. 変更日時 など CVSサーバを見るため
1.1 takayama 484: @noindent
485: ChangeLog
486: @itemize @bullet
487: @item
1.6 takayama 488: 変更を受けたファイルは
1.1 takayama 489: OpenXM/src/asir-contrib/packages/src/gtt_ekn.rr 1.1.
490: @end itemize
491:
492: @comment **********************************************************
1.6 takayama 493: @node gtt_ekn.expectation,,, 超幾何関数E(k,n)
1.1 takayama 494: @subsection @code{gtt_ekn.expectation}
1.6 takayama 495: @comment --- 索引用キーワード
1.1 takayama 496: @findex gtt_ekn.expectation
497:
498: @table @t
499: @item gtt_ekn.expectation(@var{beta},@var{p})
1.6 takayama 500: :: 周辺和 @var{beta}, セルの確率 @var{p} の二元分割表の期待値を計算する.
1.1 takayama 501: @end table
502:
1.6 takayama 503: @comment --- 引数の簡単な説明 --- 以下まだ書いてない.
1.1 takayama 504: @table @var
505: @item return
1.6 takayama 506: 二元分割表の各セルの期待値のリスト.
1.1 takayama 507: @item beta
1.6 takayama 508: 行和, 列和のリスト. 成分はすべて正であること.
1.1 takayama 509: @item p
1.6 takayama 510: 二元分割表のセルの確率のリスト
1.1 takayama 511: @end table
512:
1.6 takayama 513: @comment --- ここで関数の詳しい説明 ---
514: @comment --- @itemize〜@end itemize は箇条書き ---
515: @comment --- @bullet は黒点付き ---
1.1 takayama 516: @itemize @bullet
517: @item
1.6 takayama 518: [GM2016] の Algorithm 7.8 の実装.
519: @item option crt=1 (crt = Chinese remainder theorem) を与えると, 分散計算をおこなう.
520: 分散計算用の各種パラメータの設定は
521: gtt_ekn.setup で行なう.
522: @item option index を与えると, 指定された成分の期待値のみ計算する.
523: たとえば 2 x 2 分割表で index=[[0,0],[1,1]] と指定すると, 1 のある成分の期待値のみ計算する.
1.1 takayama 524: @end itemize
525:
1.6 takayama 526: @comment --- @example〜@end example は実行例の表示 ---
1.1 takayama 527:
1.6 takayama 528: 2×2, 3×3 の分割表の期待値計算例.
1.1 takayama 529: @example
530: [2235] gtt_ekn.expectation([[1,4],[2,3]],[[1,1/3],[1,1]]);
531: [ 2/3 1/3 ]
532: [ 4/3 8/3 ]
533: [2236] gtt_ekn.expectation([[4,5],[2,4,3]],[[1,1/2,1/3],[1,1,1]]);
534: [ 5648/4483 7844/4483 4440/4483 ]
535: [ 3318/4483 10088/4483 9009/4483 ]
536:
537: [2442] gtt_ekn.expectation([[4,14,9],[11,6,10]],[[1,1/2,1/3],[1,1/5,1/7],[1,1,1]]);
538: [ 207017568232262040/147000422096729819 163140751505489940/147000422096729819
539: 217843368649167296/147000422096729819 ]
540: [ 1185482401011137878/147000422096729819 358095302885438604/147000422096729819
541: 514428205457640984/147000422096729819 ]
542: [ 224504673820628091/147000422096729819 360766478189450370/147000422096729819
543: 737732646860489910/147000422096729819 ]
544: @end example
545:
1.6 takayama 546: 参考: 2 x m 分割表(Lauricella FD)についてはパッケージ tk_fd でも下記のように同等な
547: 計算ができる.
1.1 takayama 548: @example
549: [3076] import("tk_fd.rr");
550: [3077] A=tk_fd.marginal2abc([4,5],[2,4,3]);
551: [-4,[-4,-3],-1]
552: [3078] tk_fd.expectation_abc(A[0],A[1],A[2],[[1,1/2,1/3],[1,1,1]]);
553: RS=[ 4 5 ], CSnew=[ 2 4 3 ], Ynew=[ 1 1/2 1/3 ]
554: [ 1 1 1 ]
555: Computing Dmat(ca) for parameters B=[-4,-3],X=[ 1/2 1/3 ]
556: [[5648/4483,7844/4483,4440/4483],
557: [3318/4483,10088/4483,9009/4483]]
1.6 takayama 558: // 各セルの期待値.
1.1 takayama 559: @end example
560:
1.6 takayama 561: 参考: 一般の A 分布の計算は ot_hgm_ahg.rr. まだ実験的なため, module 化されていない.
562: ot_hgm_ahg.rr についての参考文献:
1.1 takayama 563: K.Ohara, N.Takayama, Pfaffian Systems of A-Hypergeometric Systems II --- Holonomic Gradient Method, arxiv:1505.02947
564: @example
565: [3237] import("ot_hgm_ahg.rr");
1.6 takayama 566: // 2 x 2 分割表.
1.1 takayama 567: [3238] hgm_ahg_expected_values_contiguity([[0,0,1,1],[1,0,1,0],[0,1,0,1]],
568: [9,6,8],[1/2,1/3,1/5,1/7],[x1,x2,x3,x4]|geometric=1);
569: oohg_native=0, oohg_curl=1
570: [1376777025/625400597,1750225960/625400597,
571: 2375626557/625400597,3252978816/625400597]
1.6 takayama 572: // 2 x 2 分割表の期待値.
1.1 takayama 573:
1.6 takayama 574: // 2 x 3 分割表.
1.1 takayama 575: [3238] hgm_ahg_expected_values_contiguity(
576: [[0,0,0,1,1,1],[1,0,0,1,0,0],[0,1,0,0,1,0],[0,0,1,0,0,1]],
577: [5,2,4,3],[1,1/2,1/3,1,1,1],[x1,x2,x3,x4,x5,x6]|geometric=1);
578: [5648/4483,7844/4483,4440/4483,3318/4483,10088/4483,9009/4483]
1.6 takayama 579: // 2 x 3 分割表の期待値. 上と同じ問題.
1.1 takayama 580: @end example
581:
1.6 takayama 582: 3 x 3 分割表. 構造的0が一つ.
1.1 takayama 583: @example
584: /*
1.6 takayama 585: dojo, p.221 のデータ. 成績3以下の生徒は集めてひとつに.
1.1 takayama 586: 2 1 1
587: 8 3 3
588: 0 2 6
589:
590: row sum: 4,14,8
591: column sum: 10,6,10
1.6 takayama 592: 0 を一つ含むので, (3,6) 型の A から 7 列目を抜く.
1.1 takayama 593: */
594:
595: A=[[0,0,0,1,1,1, 0,0],
596: [0,0,0,0,0,0, 1,1],
597: [1,0,0,1,0,0, 0,0],
598: [0,1,0,0,1,0, 1,0],
599: [0,0,1,0,0,1, 0,1]];
600: B=[14,8,10,6,10];
601: hgm_ahg_expected_values_contiguity(A,B,[1,1/2,1/3,1,1/5,1/7,1,1],
1.6 takayama 602: [x1,x2,x3,x4,x5,x6,x7,x8]|geometric=1);
1.1 takayama 603:
1.6 takayama 604: // 答.
1.1 takayama 605: [14449864949304/9556267369631,
606: 10262588586540/9556267369631, 13512615942680/9556267369631,
607: 81112808747006/9556267369631,
608: 21816297744346/9556267369631, 30858636683482/9556267369631,
609:
610: 25258717886900/9556267369631,51191421070148/9556267369631]
611: @end example
612:
1.6 takayama 613: 3 x 3 分割表.
1.1 takayama 614: @example
615: /*
1.6 takayama 616: 上のデータで 0 を 1 に変更.
1.1 takayama 617: 2 1 1
618: 8 3 3
619: 1 2 6
620:
621: row sum: 4,14,9
622: column sum: 11,6,10
623: */
624: A=[[0,0,0,1,1,1,0,0,0],
625: [0,0,0,0,0,0,1,1,1],
626: [1,0,0,1,0,0,1,0,0],
627: [0,1,0,0,1,0,0,1,0],
628: [0,0,1,0,0,1,0,0,1]];
629: B=[14,9,11,6,10];
630: hgm_ahg_expected_values_contiguity(A,B,[1,1/2,1/3,1,1/5,1/7,1,1,1],
631: [x1,x2,x3,x4,x5,x6,x7,x8]|geometric=1);
632:
1.6 takayama 633: // 期待値, 答. x9 を指定していないので, 9番目の期待値は出力してない.
1.1 takayama 634: [207017568232262040/147000422096729819,
635: 163140751505489940/147000422096729819,217843368649167296/147000422096729819,
636: 1185482401011137878/147000422096729819,
637: 358095302885438604/147000422096729819,514428205457640984/147000422096729819,
638: 224504673820628091/147000422096729819,360766478189450370/147000422096729819]
639:
1.6 takayama 640: // Z やその微分の計算は hgm_ahg_contiguity 関数がおこなうが, これの簡易インターフェースは
641: // まだ書いてない.
1.1 takayama 642: @end example
643:
644:
645:
1.6 takayama 646: @comment --- 参照(リンク)を書く ---
1.1 takayama 647: @table @t
1.6 takayama 648: @item 参照
1.1 takayama 649: @ref{gtt_ekn.setup}
650: @ref{gtt_ekn.nc}
651: @end table
652:
1.6 takayama 653: @comment --- ChangeLog を書く. ソースコードの位置. 変更日時 など CVSサーバを見るため
1.1 takayama 654: @noindent
655: ChangeLog
656: @itemize @bullet
657: @item
1.6 takayama 658: 変更を受けたファイルは
1.1 takayama 659: OpenXM/src/asir-contrib/packages/src/gtt_ekn.rr 1.1.
660: @end itemize
661:
662:
663: @comment **********************************************************
1.6 takayama 664: @comment --- ◯◯◯◯ の説明
665: @comment --- 個々の関数の説明の開始 ---
666: @comment --- section 名を正確に ---
667: @node gtt_ekn.setup,,, 超幾何関数E(k,n)
1.1 takayama 668: @subsection @code{gtt_ekn.setup}
1.6 takayama 669: @comment --- 索引用キーワード
1.1 takayama 670: @findex gtt_ekn.setup
671:
672: @table @t
673: @item gtt_ekn.setup()
1.6 takayama 674: :: 分散計算用の環境設定をおこなう. 現在の環境を報告する.
1.1 takayama 675: @end table
676:
1.6 takayama 677: @comment --- 引数の簡単な説明 --- 以下まだ書いてない.
1.1 takayama 678: @table @var
679: @item return
680:
681: @end table
682:
1.6 takayama 683: @comment --- ここで関数の詳しい説明 ---
684: @comment --- @itemize〜@end itemize は箇条書き ---
685: @comment --- @bullet は黒点付き ---
1.3 takayama 686: @itemize @bullet
1.6 takayama 687: @item 使用するプロセスと素数の個数, 最小の素数を表示する. 準備されていない場合はその旨を表示.
688: @item このパッケージでの分散計算は複数のcpuを搭載した計算機で実行されることを想定している.
689: @item option nps (または number_of_processes)を与えると指定した数だけプロセスを用意する.
690: @item option nprm (または number_of_primes)を与えるとnprmが文字列の場合指定された素数リストのファイルを読み込む. nprmが自然数の場合さらにoption minp (minp =MINimum Prime)を与えるとminpより大きな素数をnprm個生成する. その際option fgp (または file_of_generated_primes)を与えると生成した素数リストをファイル名をfgpとして保存する.
691: @item 上記のoption を指定しなかった場合次のデフォルト値が用いられる. nps=1. nprm=10. fgp=0.
692: @item option report=1を与えると現在の環境の報告のみを行う. setup(|report=1)の別名としてreport関数を使用することもできる.
693: @item option subprogs=[file1,file2,...] により分散計算の子供プロセスにロードすべきファイル file1, file2, ... を指定する. default は subprogs=["gtt_ekn/childprocess.rr"] である.
1.8 takayama 694: @item gtt_ekn.set_debug_level(Mode) で Ekn_debug の値を設定する.
1.1 takayama 695: @end itemize
696:
1.6 takayama 697: @comment --- @example〜@end example は実行例の表示 ---
698: 例: 素数のリストを生成してファイル p.txt へ書き出す.
1.1 takayama 699: @example
700: gtt_ekn.setup(|nps=2,nprm=20,minp=10^10,fgp="p.txt")$
701: @end example
702:
1.8 takayama 703: 例: chinese remainder theorem (crt) を使って gmvector を計算.
704: @example
705: [2867] gtt_ekn.setup(|nprm=20,minp=10^20);
706: [2868] N=2; T2=gtt_ekn.gmvector([[36*N,13*N-1],[38*N-1,11*N]],
707: [[1,(1-1/N)/56],[1,1]] | crt=1)$
708: @end example
709:
1.1 takayama 710:
1.6 takayama 711: @comment --- 参照(リンク)を書く ---
1.1 takayama 712: @table @t
1.6 takayama 713: @item 参照
1.1 takayama 714: @ref{gtt_ekn.nc}
715: @ref{gtt_ekn.gmvector}
716: @end table
717:
1.6 takayama 718: @comment --- ChangeLog を書く. ソースコードの位置. 変更日時 など CVSサーバを見るため
1.1 takayama 719: @noindent
720: ChangeLog
721: @itemize @bullet
722: @item
1.6 takayama 723: 変更を受けたファイルは
1.1 takayama 724: OpenXM/src/asir-contrib/packages/src/gtt_ekn.rr 1.1,
725: gtt_ekn/g_mat_fac.rr
726:
727: @end itemize
728:
729: @comment **********************************************************
1.6 takayama 730: @comment --- ◯◯◯◯ の説明
731: @comment --- 個々の関数の説明の開始 ---
732: @comment --- section 名を正確に ---
733: @node gtt_ekn.upAlpha,,, 超幾何関数E(k,n)
1.1 takayama 734: @subsection @code{gtt_ekn.upAlpha}
1.6 takayama 735: @comment --- 索引用キーワード
1.1 takayama 736: @findex gtt_ekn.upAlpha
737:
738: @table @t
739: @item gtt_ekn.upAlpha(@var{i},@var{k},@var{n})
740: ::
741: @end table
742:
1.6 takayama 743: @comment --- 引数の簡単な説明 --- 以下まだ書いてない.
1.1 takayama 744: @table @var
1.6 takayama 745: @item i a_i を a_i+1 と変化させる contiguity relation.
746: @item k E(k+1,n+k+2)型の超幾何関数の k. 分割表では (k+1)×(n+1).
747: @item n E(k+1,n+k+2)型の超幾何関数の n. 分割表では (k+1)×(n+1).
748: @item return contiguity relation の pfaffian_basis についての行列表現を戻す. [GM2016] の Cor 6.3.
1.1 takayama 749: @end table
750:
1.6 takayama 751: @comment --- ここで関数の詳しい説明 ---
752: @comment --- @itemize〜@end itemize は箇条書き ---
753: @comment --- @bullet は黒点付き ---
1.1 takayama 754: @itemize @bullet
755: @item
1.6 takayama 756: upAlpha は [GM2016] の Cor 6.3 の行列 U_i を戻す.
757: @item 関連する各関数の簡潔な説明と例も加える.
758: @item a_i を a_i-1 と変化させたい場合は関数 downAlpha を用いる.
759: @item a_i と分割表の周辺和を見るには, 関数 marginaltoAlpha([行和,列和]) を用いる.
1.1 takayama 760: @item
1.6 takayama 761: pfaffian_basis は [GM2016] の4章のベクトル F に対応する偏微分を戻す.
1.1 takayama 762: @end itemize
763:
1.6 takayama 764: @comment --- @example〜@end example は実行例の表示 ---
765: 例: 以下の例は 2×2分割表(E(2,4)), 2×3分割表(E(2,5))の場合である.
766: [2225] までは出力を略している.
1.1 takayama 767: @example
768: [2221] gtt_ekn.marginaltoAlpha([[1,4],[2,3]]);
769: [[a_0,-4],[a_1,-1],[a_2,3],[a_3,2]]
1.6 takayama 770: [2222] gtt_ekn.upAlpha(1,1,1); // E(2,4) の a_1 方向の
771: // contiguity を表現する行列
772: [2223] gtt_ekn.upAlpha(2,1,1); // E(2,4) の a_2 方向
773: [2224] gtt_ekn.upAlpha(3,1,1); // E(2,4) の a_3 方向
1.1 takayama 774: [2225] function f(x_1_1);
775: [2232] gtt_ekn.pfaffian_basis(f(x_1_1),1,1);
776: [ f(x_1_1) ]
777: [ (f{1}(x_1_1)*x_1_1)/(a_2) ]
778: [2233] function f(x_1_1,x_1_2);
779: f() redefined.
1.6 takayama 780: [2234] gtt_ekn.pfaffian_basis(f(x_1_1,x_1_2),1,2); // E(2,5), 2*3 分割表
1.1 takayama 781: [ f(x_1_1,x_1_2) ]
782: [ (f{1,0}(x_1_1,x_1_2)*x_1_1)/(a_2) ]
783: [ (f{0,1}(x_1_1,x_1_2)*x_1_2)/(a_3) ]
784: @end example
785:
786:
1.6 takayama 787: @comment --- 参照(リンク)を書く ---
1.1 takayama 788: @table @t
1.6 takayama 789: @item 参照
1.1 takayama 790: @ref{gtt_ekn.nc}
791: @ref{gtt_ekn.gmvector}
792: @end table
793:
1.6 takayama 794: @comment --- ChangeLog を書く. ソースコードの位置. 変更日時 など CVSサーバを見るため
1.1 takayama 795: @noindent
796: ChangeLog
797: @itemize @bullet
798: @item
1.6 takayama 799: この関数は [GM2016]
800: で与えられたアルゴリズムに従い contiguity relation を導出する.
1.1 takayama 801: @item
1.6 takayama 802: 変更を受けたファイルは
1.1 takayama 803: OpenXM/src/asir-contrib/packages/src/gtt_ekn/ekn_pfaffian_8.rr 1.1.
804: @end itemize
805:
806:
1.5 takayama 807: @comment **********************************************************
1.6 takayama 808: @comment --- ◯◯◯◯ の説明
809: @comment --- 個々の関数の説明の開始 ---
810: @comment --- section 名を正確に ---
811: @node gtt_ekn.cmle,,, 超幾何関数E(k,n)
1.5 takayama 812: @subsection @code{gtt_ekn.cmle}
1.6 takayama 813: @comment --- 索引用キーワード
1.5 takayama 814: @findex gtt_ekn.cmle
815:
816: @table @t
1.6 takayama 817: @item gtt_ekn.cmle(@var{u}) u を観測データとするとき, P(U=u | row sum, column sum = these of U) を最大化する, 各セルの確率の近似値を求める.
1.5 takayama 818: ::
819: @end table
820:
1.6 takayama 821: @comment --- 引数の簡単な説明 --- 以下まだ書いてない.
1.5 takayama 822: @table @var
1.6 takayama 823: @item u 観測データ(分割表)
824: @item return セルの確率(分割表形式)
1.5 takayama 825: @end table
826:
1.6 takayama 827: @comment --- ここで関数の詳しい説明 ---
828: @comment --- @itemize〜@end itemize は箇条書き ---
829: @comment --- @bullet は黒点付き ---
1.5 takayama 830: @itemize @bullet
1.6 takayama 831: @item u を観測データとするとき, P(U=u | row sum, column sum = these of U) を最大化する, 各セルの確率の近似値を求める.
832: @item optional parameter で algorithm の振る舞い(たとえば有理数を近似して, 分母分子が小さい有理数にする, gradient descent の step幅)を調整すべきだが, これは作業中. 2017.03.03
1.5 takayama 833: @end itemize
834:
1.6 takayama 835: @comment --- @example〜@end example は実行例の表示 ---
836: 例: 2 x 4 分割表.
1.5 takayama 837: @example
838: U=[[1,1,2,3],[1,3,1,1]];
839: gtt_ekn.cmle(U);
840: [[ 1 1 2 3 ]
841: [ 1 3 1 1 ],[[7,6],[2,4,3,4]], // Data, row sum, column sum
842: [ 1 67147/183792 120403/64148 48801/17869 ] // probability obtained.
843: [ 1 1 1 1 ]]
844: @end example
845:
1.6 takayama 846: 例: 上の例は次の関数に.
1.5 takayama 847: @example
848: gtt_ekn.cmle_test3();
849: @end example
850:
1.6 takayama 851: @comment --- 参照(リンク)を書く ---
1.5 takayama 852: @table @t
1.6 takayama 853: @item 参照
1.5 takayama 854: @ref{gtt_ekn.expectation}
855: @end table
856:
1.6 takayama 857: @comment --- ChangeLog を書く. ソースコードの位置. 変更日時 など CVSサーバを見るため
1.5 takayama 858: @noindent
859: ChangeLog
860: @itemize @bullet
1.6 takayama 861: @item gtt_ekn/mle.rr に本体がある.
862: @item gtt_ekn.rr の cmle 関数は wrapper.
1.5 takayama 863: @end itemize
864: @comment end cmle.
865:
1.8 takayama 866: @comment **********************************************************
867: @comment --- ◯◯◯◯ の説明
868: @comment --- 個々の関数の説明の開始 ---
869: @comment --- section 名を正確に ---
870: @node gtt_ekn.set_debug_level,,, 超幾何関数E(k,n)
1.9 takayama 871: @node gtt_ekn.show_path,,, 超幾何関数E(k,n)
1.10 ! takayama 872: @node gtt_ekn.assert1,,, 超幾何関数E(k,n)
! 873: @node gtt_ekn.assert2,,, 超幾何関数E(k,n)
! 874: @subsection @code{gtt_ekn.set_debug_level}, @code{gtt_ekn.show_path}, @code{gtt_ekn.assert1}, @code{gtt_ekn.assert2}
1.8 takayama 875: @comment --- 索引用キーワード
876: @findex gtt_ekn.set_debug_level
1.9 takayama 877: @findex gtt_ekn.show_path
1.10 ! takayama 878: @findex gtt_ekn.assert1
! 879: @findex gtt_ekn.assert2
1.8 takayama 880:
881: @table @t
882: @item gtt_ekn.set_debug_level(@var{m}) debug メッセージのレベルを設定.
1.9 takayama 883: @item gtt_ekn.show_path() どのように contiguity を適用したかの情報.
1.10 ! takayama 884: @item gtt_ekn.assert1(@var{N}) 2x2 分割表で動作チェック.
! 885: @item gtt_ekn.assert2(@var{N}) 3x3 分割表で動作チェック.
1.8 takayama 886: ::
887: @end table
888:
889: @comment --- 引数の簡単な説明 --- 以下まだ書いてない.
890: @table @var
891: @item m レベル.
892: @end table
893:
894: @comment --- ここで関数の詳しい説明 ---
895: @comment --- @itemize〜@end itemize は箇条書き ---
896: @comment --- @bullet は黒点付き ---
897: @itemize @bullet
898: @item (@var{m} & 0x1) == 0x1 の時 g_mat_fac_test_plain と g_mat_fac_itor の両方を呼び出し値を比較する (gtt_ekn.setup した状態で).
899: @item (@var{m} & 0x2) == 0x2 の時 g_mat_fac_itor への引数を tmp-input.ab として保存.
900: @item (@var{m} & 0x4) == 0x4 の時 matrix factorial の計算の呼び出し引数を表示.
1.10 ! takayama 901: @item @var{N} は問題の周辺和のサイズ.
1.8 takayama 902: @end itemize
903:
904: @comment --- @example〜@end example は実行例の表示 ---
1.10 ! takayama 905: 例.
1.8 takayama 906: @example
907: [2846] gtt_ekn.set_debug_level(0x4);
908: [2847] N=2; T2=gtt_ekn.gmvector([[36*N,13*N-1],[38*N-1,11*N]],
909: [[1,(1-1/N)/56],[1,1]])$
910: [2848] level&0x4: g_mat_fac_test([ 113/112 ]
911: [ 1/112 ],[ (t+225/112)/(t^2+4*t+4) (111/112*t+111/112)/(t^2+4*t+4) ]
912: [ (1/112)/(t^2+4*t+4) (111/112*t+111/112)/(t^2+4*t+4) ],0,20,1,t)
913: Note: we do not use g_mat_fac_itor. Call gtt_ekn.setup(); to use the crt option.
914: level&0x4: g_mat_fac_test([ 67/62944040755546030080000 ]
915: [ 1/125888081511092060160000 ],[ (t+24)/(t^2+25*t+46) (2442)/(t^2+25*t+46) ]
916: [ (1)/(t^2+25*t+46) (-111*t-111)/(t^2+25*t+46) ],0,73,1,t)
917: level&0x4: g_mat_fac_test ------ snip
918: @end example
919:
1.10 ! takayama 920: 例.
1.9 takayama 921: @example
922: [2659] gtt_ekn.nc([[4,5],[2,4,3]],[[1,1/2,1/3],[1,1,1]])$
923: [2660] L=matrix_transpose(gtt_ekn.show_path())$
924: [2661] L[2];
925: [1 4 3 2]
926: @end example
1.10 ! takayama 927: [1 4 3 2] の index をもつパラメーター alpha の方向の contigity を求めそれを掛けて
1.9 takayama 928: 計算したことがわかる. L[0] は用いた contiguity の行列.
1.10 ! takayama 929: L[1] はcontiguity を適用する step 数.
! 930:
! 931: 例. 値を計算せずに path のみ求めたい場合.
! 932: @example
! 933: A=gtt_ekn.marginaltoAlpha_list([[400,410,1011],[910,411,500]])$
! 934: [2666] gtt_ekn.contiguity_mat_list_2(A,2,2)$
! 935: [2667] L=matrix_transpose(gtt_ekn.show_path())$
! 936: [2668] L[2];
! 937: [ 2 1 5 4 3 ]
! 938: @end example
! 939:
! 940: 例. 0 が戻れば g_mat_fac_plain と指定した計算方法の結果が一致したことがわかる.
! 941: option を書かないと g_mat_fac_int との比較となる.
! 942: @example
! 943: [8859] gtt_ekn.assert2(1);
! 944: Marginal=[[130,170,353],[90,119,444]]
! 945: P=[[17/100,1,10],[7/50,1,33/10],[1,1,1]]
! 946: Try g_mat_fac_test_int: Note: we do not use g_mat_fac_itor. Call gtt_ekn.setup(); to use the crt option.
! 947: Timing (int) =0.413916 (CPU) + 0.590723 (GC) = 1.00464 (total), real time=0.990672
! 948:
! 949: Try g_mat_fac_test_plain: Note: we do not use g_mat_fac_itor. Call gtt_ekn.setup(); to use the crt option.
! 950: Timing (rational) =4.51349 (CPU) + 6.32174 (GC) = 10.8352 (total)
! 951: diff of both method =
! 952: [ 0 0 0 ]
! 953: [ 0 0 0 ]
! 954: [ 0 0 0 ]
! 955: [8860]
! 956:
! 957: [8863] gtt_ekn.setup(|nprm=100,minp=10^50);
! 958: Number of processes = 1.
! 959: Number of primes = 100.
! 960: Min of plist = 100000000000000000000000000000000000000000000000151.
! 961: 0
! 962: [8864] gtt_ekn.assert2(1 | crt=1);
! 963: Marginal=[[130,170,353],[90,119,444]]
! 964: P=[[17/100,1,10],[7/50,1,33/10],[1,1,1]]
! 965: Try [[crt,1]]
! 966: ---- snip
! 967: @end example
! 968: なお二番目の例の timing (total) [例では省略] は mod 計算を subprocess がやっているので正しい値ではない. real time が計算時間の目安になる.
1.9 takayama 969:
1.8 takayama 970: @comment --- 参照(リンク)を書く ---
971: @table @t
972: @item 参照
973: @ref{gtt_ekn.nc}
974: @end table
975:
976: @comment --- ChangeLog を書く. ソースコードの位置. 変更日時 など CVSサーバを見るため
977: @noindent
978: ChangeLog
979: @itemize @bullet
980: @item gtt_ekn/ekn_eval.rr で matrix factorial の計算の呼び出し引数を表示する.
981: @item grep 'iand(Ekn_debug,0x1)' *.rr でソースコードの該当の位置をさがす.
982: @end itemize
983: @comment end set_debug_level
984:
1.5 takayama 985:
986:
1.6 takayama 987: @node modular計算,,, 2元分割表HGMの関数
988: @chapter modular計算
1.4 takayama 989:
990: @menu
991: * gtt_ekn.chinese_itor::
992: @end menu
993:
1.6 takayama 994: @node 中国剰余定理とitor,,, modular計算
995: @section 中国剰余定理とitor
1.4 takayama 996:
997: @comment **********************************************************
1.6 takayama 998: @comment --- ◯◯◯◯ の説明
999: @comment --- 個々の関数の説明の開始 ---
1000: @comment --- section 名を正確に ---
1.4 takayama 1001: @node gtt_ekn.chinese_itor,,,
1002: @subsection @code{gtt_ekn.chinese_itor}
1.6 takayama 1003: @comment --- 索引用キーワード
1004: @findex gtt_ekn.chinese_itor 中国剰余定理とitor
1.4 takayama 1005:
1006: @table @t
1007: @item gtt_ekn.chinese_itor(@var{data},@var{idlist})
1.6 takayama 1008: :: mod p で計算した結果(ベクトル)から chinese remainder theorem, itor(integer to rational) で有理数ベクトルを得る.
1.4 takayama 1009: @end table
1010:
1.6 takayama 1011: @comment --- 引数の簡単な説明 --- 以下まだ書いてない.
1.4 takayama 1012: @table @var
1.6 takayama 1013: @item return [val, n] ここで val は答え. また, n = n1*n2*...
1014: @item data [[val1,n1],[val2,n2], ...], ここで val mod n1 = val1, val mod n2 = val2,...
1015: @item idlist chinese, itor を実行するサーバIDのリスト.
1.4 takayama 1016: @end table
1017:
1.6 takayama 1018: @comment --- ここで関数の詳しい説明 ---
1019: @comment --- @itemize〜@end itemize は箇条書き ---
1020: @comment --- @bullet は黒点付き ---
1.4 takayama 1021: @itemize @bullet
1.6 takayama 1022: @item 中国剰余定理を用いて val0 mod n1 = val1, val0 mod n2 = val2, ... となる val0 を求める. val に algorithm itor を適用する.
1023: @item sqrt(n) より val0 が大きい時は itor が適用されて val0 が有理数 val=a/b に変換される. つまり b*x =1 mod n となる逆数 x を考えて, x*a % n = val0 となる数 val を戻す. 見つからないときは failure を戻す.
1.4 takayama 1024: @end itemize
1025:
1.6 takayama 1026: @comment --- @example〜@end example は実行例の表示 ---
1027: 例: [3!, 5^3*3!]=[6,750] が戻り値.
1028: 6 mod 109 =6, 750 mod 109=96 が最初の引数の [[6,96],109]. 以下同様.
1.4 takayama 1029: @example
1030: gtt_ekn.setup(|nps=2,nprm=3,minp=101,fgp="p_small.txt");
1031: SS=gtt_ekn.get_svalue();
1032: SS[0];
1033: [103,107,109] // list of primes
1034: SS[1];
1035: [0,2] // list of server ID's
1036: gtt_ekn.chinese_itor([[[ 6,96 ],109],[[ 6,29 ],103],[[ 6,1 ],107]],SS[1]);
1037: [[ 6 750 ],1201289]
1038:
1.6 takayama 1039: // 引数はスカラーでもよい.
1.4 takayama 1040: gtt_ekn.chinese_itor([[96,109],[29,103]],SS[1]);
1041: [[ 750 ],11227]
1042: @end example
1043:
1044:
1.6 takayama 1045: @comment --- @example〜@end example は実行例の表示 ---
1046: 例: gtt_ekn/childprocess.rr (server で実行される) の関数 chinese (chinese remainder theorem) と euclid.
1.4 takayama 1047: @example
1048: load("gtt_ekn/childprocess.rr");
1049: chinese([newvect(2,[6,29]),103],[newvect(2,[6,750]),107*109]);
1.6 takayama 1050: // mod 103 で [6,29], mod (107*109) で [6,750] となる数を mod 103*(107*109)
1051: // で求めると,
1.4 takayama 1052: [[ 6 750 ],1201289]
1.6 takayama 1053: euclid(3,103); // mod 103 での 3 の逆数. つまり 1/3
1.4 takayama 1054: -34
1.6 takayama 1055: 3*(-34) % 103; // 確かに逆数.
1.4 takayama 1056: 1
1057: @end example
1058:
1.6 takayama 1059: @comment --- @example〜@end example は実行例の表示 ---
1060: 例: gtt_ekn/childprocess.rr (server で実行される) の関数 itor (integer to rational) の例.
1061: itor(Y,Q,Q2,Idx) では Y < Q2 なら Y がそのまま戻る. Idx は 内部用の index で好きな数でよい. 戻り値の第2成分となる.
1.4 takayama 1062: @example
1063: load("gtt_ekn/childprocess.rr");
1064: for (I=1;I<11; I++) print([I,itor(I,11,3,0)]);
1065: [1,[1,0]]
1066: [2,[2,0]]
1.6 takayama 1067: [3,[-2/3,0]] //euclid(3,11); ->4, 4*(-2)%11 -> 3 なので確かに -2/3 は元の数の候補
1.4 takayama 1068: [4,[failure,0]]
1069: [5,[-1/2,0]]
1070: [6,[1/2,0]]
1071: [7,[-1/3,0]]
1072: [8,[failure,0]]
1073: [9,[-2,0]]
1074: [10,[-1,0]]
1075: @end example
1076:
1077:
1.6 takayama 1078: @comment --- 参照(リンク)を書く ---
1.4 takayama 1079: @table @t
1.6 takayama 1080: @item 参照
1.4 takayama 1081: @ref{gtt_ekn.setup}
1082: @end table
1083:
1.6 takayama 1084: @comment --- ChangeLog を書く. ソースコードの位置. 変更日時 など CVSサーバを見るため
1.4 takayama 1085: @noindent
1086: ChangeLog
1087: @itemize @bullet
1088: @item
1.6 takayama 1089: 関連ファイルは
1.4 takayama 1090: gtt_ekn/g_mat_fac.rr
1091: gtt_ekn/childprocess.rr
1092: @end itemize
1093:
1094:
1.1 takayama 1095:
1.6 takayama 1096: @comment --- おまじない ---
1.1 takayama 1097: @node Index,,, Top
1098: @unnumbered Index
1099: @printindex fn
1100: @printindex cp
1101: @iftex
1102: @vfill @eject
1103: @end iftex
1104: @summarycontents
1105: @contents
1106: @bye
1.6 takayama 1107: @comment --- おまじない終り ---
1.1 takayama 1108:
1109:
1.6 takayama 1110: @comment テンプレート. start_of_template.
1.5 takayama 1111: @comment **********************************************************
1.6 takayama 1112: @comment --- ◯◯◯◯ の説明
1113: @comment --- 個々の関数の説明の開始 ---
1114: @comment --- section 名を正確に ---
1115: @node gtt_ekn.hoge,,, 超幾何関数E(k,n)
1.5 takayama 1116: @subsection @code{gtt_ekn.hoge}
1.6 takayama 1117: @comment --- 索引用キーワード
1.5 takayama 1118: @findex gtt_ekn.hoge
1119:
1120: @table @t
1121: @item gtt_ekn.hoge(@var{i})
1122: ::
1123: @end table
1124:
1.6 takayama 1125: @comment --- 引数の簡単な説明 --- 以下まだ書いてない.
1.5 takayama 1126: @table @var
1127: @item i hage
1128: @item return
1129: @end table
1130:
1.6 takayama 1131: @comment --- ここで関数の詳しい説明 ---
1132: @comment --- @itemize〜@end itemize は箇条書き ---
1133: @comment --- @bullet は黒点付き ---
1.5 takayama 1134: @itemize @bullet
1.6 takayama 1135: @item 説明.
1.5 takayama 1136: @end itemize
1137:
1.6 takayama 1138: @comment --- @example〜@end example は実行例の表示 ---
1139: 例:
1.5 takayama 1140: @example
1141: [2221] gtt_ekn.hoge([[1,4],[2,3]]);
1142: @end example
1143:
1144:
1.6 takayama 1145: @comment --- 参照(リンク)を書く ---
1.5 takayama 1146: @table @t
1.6 takayama 1147: @item 参照
1.5 takayama 1148: @ref{gtt_ekn.nc}
1149: @ref{gtt_ekn.gmvector}
1150: @end table
1151:
1.6 takayama 1152: @comment --- ChangeLog を書く. ソースコードの位置. 変更日時 など CVSサーバを見るため
1.5 takayama 1153: @noindent
1154: ChangeLog
1155: @itemize @bullet
1156: @item
1157: @end itemize
1158: @comment end_of_template
1159:
1160:
1.6 takayama 1161: // 2 x m 分割表において似た機能を有する関数の利用例を参考までに記載する;
1162: // 正規化定数とその微分関連.
1163: // その1.
1.1 takayama 1164: [3077] A=tk_fd.marginal2abc([4,5],[2,4,3]);
1165: [-4,[-4,-3],-1]
1166: [3078] tk_fd.ahmat_abc(A[0],A[1],A[2],[[1,1/2,1/3],[1,1,1]]);
1167: RS=[ 4 5 ], CSnew=[ 2 4 3 ], Ynew=[ 1 1/2 1/3 ]
1168: [ 1 1 1 ]
1169: Computing Dmat(ca) for parameters B=[-4,-3],X=[ 1/2 1/3 ]
1170: [4483/124416,[[353/7776,1961/15552,185/1728],[553/20736,1261/15552,1001/13824]]]
1.6 takayama 1171: // 戻値は [Z, [[d_11 Z, d_12 Z, d_13 Z],[d_21 Z, d_22 Z, d_23 Z]]] の値.
1.1 takayama 1172:
1.6 takayama 1173: // その2.
1.1 takayama 1174: [3079] tk_fd.log_ahmat_abc(A[0],A[1],A[2],[[1,1/2,1/3],[1,1,1]]);
1175: RS=[ 4 5 ], CSnew=[ 2 4 3 ], Ynew=[ 1 1/2 1/3 ]
1176: [ 1 1 1 ]
1177: Computing Dmat(ca) for parameters B=[-4,-3],X=[ 1/2 1/3 ]
1178: [-3.32333832422461674639485797719209322217260539267246045320,
1179: [[1.25987062235110417131385233102832924380994869507026544724,3.49944233772027660049074280615659156814633058219942003122,2.97122462636627258532232879768012491635065804149007361142],
1180: [0.740129377648895828686147668971670756190051304929734552754,2.25027883113986169975462859692170421592683470890028998438,2.00959179121124247155922373410662502788311398616997546285]]]
1.6 takayama 1181: // 戻値は [log(Z),
1.1 takayama 1182: // [[d_11 log(Z), d_12 log(Z), d_13 log(Z)],
1183: // [d_21 log(Z), d_22 log(Z), d_23 log(Z)]]]
1.6 takayama 1184: // の近似値.
1.1 takayama 1185:
1.6 takayama 1186: // その3.
1.1 takayama 1187: [3082] fd_hessian2(A[0],A[1],A[2],[1/2,1/3]);
1188: Computing Dmat(ca) for parameters B=[-4,-3],X=[ 1/2 1/3 ]
1189: [4483/124416,[ 1961/15552 185/1728 ],
1190: [ 79/288 259/864 ]
1191: [ 259/864 47/288 ]]
1.6 takayama 1192: // 戻値は [F=F_D, gradient(F), Hessian(F)]
1.1 takayama 1193:
1.6 takayama 1194: // 参考.
1195: // ygahvec で巾関数分の調整. 独立した関数はないようだ.
1.1 takayama 1196:
1197: //-----------------------------------------------------------------------
1.6 takayama 1198: // 2 x m 分割表において似た機能を有する関数の利用例を参考までに記載する;
1199: // 期待値関連.
1.1 takayama 1200: [3079] A=tk_fd.marginal2abc([4,5],[2,4,3]);
1201: [-4,[-4,-3],-1]
1202: [3080] tk_fd.expectation_abc(A[0],A[1],A[2],[[1,1/2,1/3],[1,1,1]]);
1203: RS=[ 4 5 ], CSnew=[ 2 4 3 ], Ynew=[ 1 1/2 1/3 ]
1204: [ 1 1 1 ]
1205: Computing Dmat(ca) for parameters B=[-4,-3],X=[ 1/2 1/3 ]
1206: [[5648/4483,7844/4483,4440/4483],
1207: [3318/4483,10088/4483,9009/4483]]
1.6 takayama 1208: // 各セルの期待値.
1.1 takayama 1209:
1210: //-----------------------------------------------------------------------
1.6 takayama 1211: // ot_hgm_ahg.rr の例. 実験的なため module 化されていない.
1.1 takayama 1212: [3237] import("ot_hgm_ahg.rr");
1.6 takayama 1213: // 2 x 2 分割表.
1.1 takayama 1214: [3238] hgm_ahg_expected_values_contiguity([[0,0,1,1],[1,0,1,0],[0,1,0,1]],
1215: [9,6,8],[1/2,1/3,1/5,1/7],[x1,x2,x3,x4]|geometric=1);
1216: oohg_native=0, oohg_curl=1
1217: [1376777025/625400597,1750225960/625400597,2375626557/625400597,3252978816/625400597]
1.6 takayama 1218: // 2 x 2 分割表の期待値.
1.1 takayama 1219:
1.6 takayama 1220: // 2 x 3 分割表.
1.1 takayama 1221: [3238] hgm_ahg_expected_values_contiguity(
1222: [[0,0,0,1,1,1],[1,0,0,1,0,0],[0,1,0,0,1,0],[0,0,1,0,0,1]],
1223: [5,2,4,3],[1,1/2,1/3,1,1,1],[x1,x2,x3,x4,x5,x6]|geometric=1);
1224: [5648/4483,7844/4483,4440/4483,3318/4483,10088/4483,9009/4483]
1.6 takayama 1225: // 2 x 3 分割表の期待値. 上と同じ問題.
1.1 takayama 1226:
1227: /*
1.6 takayama 1228: dojo, p.221. 成績3以下の生徒は集めてひとつに.
1.1 takayama 1229: 2 1 1
1230: 8 3 3
1231: 0 2 6
1232:
1233: row sum: 4,14,8
1234: column sum: 10,6,10
1.6 takayama 1235: 0 を一つ含むので, (3,6) 型の A から 7 列目を抜く.
1.1 takayama 1236: */
1.6 takayama 1237: // 3 x 3 分割表. 構造的0が一つ.
1.1 takayama 1238:
1239: A=[[0,0,0,1,1,1, 0,0],
1240: [0,0,0,0,0,0, 1,1],
1241: [1,0,0,1,0,0, 0,0],
1242: [0,1,0,0,1,0, 1,0],
1243: [0,0,1,0,0,1, 0,1]];
1244: B=[14,8,10,6,10];
1245: hgm_ahg_expected_values_contiguity(A,B,[1,1/2,1/3,1,1/5,1/7,1,1],[x1,x2,x3,x4,x5,x6,x7,x8]|geometric=1);
1246:
1.6 takayama 1247: // 答.
1.1 takayama 1248: [14449864949304/9556267369631,10262588586540/9556267369631,13512615942680/9556267369631,
1249: 81112808747006/9556267369631,21816297744346/9556267369631,30858636683482/9556267369631,
1250: 25258717886900/9556267369631,51191421070148/9556267369631]
1251:
1252:
1253: /*
1.6 takayama 1254: 上のデータで 0 を 1 に変更.
1.1 takayama 1255: 2 1 1
1256: 8 3 3
1257: 1 2 6
1258:
1259: row sum: 4,14,9
1260: column sum: 11,6,10
1261: */
1.6 takayama 1262: // 3 x 3 分割表.
1.1 takayama 1263: A=[[0,0,0,1,1,1,0,0,0],
1264: [0,0,0,0,0,0,1,1,1],
1265: [1,0,0,1,0,0,1,0,0],
1266: [0,1,0,0,1,0,0,1,0],
1267: [0,0,1,0,0,1,0,0,1]];
1268: B=[14,9,11,6,10];
1269: hgm_ahg_expected_values_contiguity(A,B,[1,1/2,1/3,1,1/5,1/7,1,1,1],[x1,x2,x3,x4,x5,x6,x7,x8]|geometric=1);
1270:
1.6 takayama 1271: // 期待値, 答.
1.1 takayama 1272: [207017568232262040/147000422096729819,163140751505489940/147000422096729819,217843368649167296/147000422096729819,
1273: 1185482401011137878/147000422096729819,358095302885438604/147000422096729819,514428205457640984/147000422096729819,
1274: 224504673820628091/147000422096729819,360766478189450370/147000422096729819]
1275:
1.6 takayama 1276: // Z やその微分の計算は hgm_ahg_contiguity 関数がおこなうが, これの簡易インターフェースは
1277: // まだ書いてない.
1.1 takayama 1278:
1279:
1.6 takayama 1280: 4. x_ij は [GM2016] の1章で,
1281: たとえば 3x3 の時 [[1,1,1],[x_11,x_12,1],[x_21,x_22,1]]
1282: となっているが, [GM2016] の Prop 7.1 の対応では,
1283: p = [[1,x_11,x_12],[1,x_21,x_22],[1,1,1]] となっているので注意.
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>