このディレクトリの索引

# # 出典::プログラミングのための線形代数 p179 サンプルコード # # LU分解(コレスキー分解) # 'LU分解'(LL1,LL2) :- '行数・列数のうち小さい方の回数制御ならび'(LL1,_回数制御ならび), 'LU分解'(_回数制御ならび,LL1,LL2). '行数・列数のうち小さい方の回数制御ならび'(LL1,_回数制御ならび) :- 行数(LL1,_行数), 列数(LL1,_列数), min_list([_行数,_列数],Len), length(_回数制御ならび,Len). 行数(LL1,_行数) :- length(LL1,_行数). 列数([L|_],_列数) :- length(L,_列数). 'LU分解'([],LL,LL). 'LU分解'([_|Ln],_主小行列_1,[_lL|_LU_3]) :- '_lLと_uLと_主小行列に分割し主小行列部分を計算する'(_主小行列_1,_lL,_uL,_主小行列_2), 'LU分解'(Ln,_主小行列_2,_LU_2), '_uLを主小行列に貼り付ける'(_uL,_LU_2,_LU_3). '_lLと_uLと_主小行列に分割し主小行列部分を計算する'([_lL|R1],_lL,_uL,_主小行列) :- _lL = [_l|L], '_uLと_主小行列を切り出す'(_l,R1,_uL,R2), '主小行列部分を計算する'(R2,_lL,_uL,_主小行列). '_uLと_主小行列を切り出す'(_,[],[],[]). '_uLと_主小行列を切り出す'(_l,[[_u_1|L]|R2],[_u_2|R3],[L|R4]) :- 分数を含む除算(_u_1,_l,_u_2), '_uLと_主小行列を切り出す'(_l,R2,R3,R4). 主小行列部分を計算する([],[],[],[]). 主小行列部分を計算する([L1|R1],_lL,[_u|_uL],[L3|R4]) :- 主小行列部分の一行を計算する(L1,_lL,_u,L3), 主小行列部分を計算する(R1,_lL,_uL,R4). 主小行列部分の一行を計算する([],[],_,[]) :- !. 主小行列部分の一行を計算する([_d_1|R1],[_l|R3],_u,[_d_2|R4]) :- '_d_2 is _d_1 - _u * _l'(_u,_l,_d_1,_d_2), 主小行列部分の一行を計算する(R1,R3,_u,R4). '_d_2 is _d_1 - _u * _l'(_u,_l,_d_1,_d_2) :- 分数を含む掛算(_u,_l,Y), 分数を含む減算(_d_1,Y,_d_2). '_uLを主小行列に貼り付ける'([],[],[]). '_uLを主小行列に貼り付ける'([_u|_uL],[L1|_LU_2],[[_u|L1]|_LU_3]) :- '_uLを主小行列に貼り付ける'(_uL,_LU_2,_LU_3). 分数を含む掛算(A1 rdiv A2,B1 rdiv B2,C) :- S1 is A1 * B1, S2 is A2 * B2, 約分(S1 rdiv S2,C),!. 分数を含む掛算(A1 rdiv A2,B,C) :- S1 is A1 * B, 約分(S1 rdiv A2,C),!. 分数を含む掛算(A,B1 rdiv B2,C) :- S1 is B1 * A, 約分(S1 rdiv B2,C),!. 分数を含む掛算(A,B,C) :- C is A * B. 分数を含む除算(A,B,C) :- number(A), number(B), 約分(A rdiv B,C),!. 分数を含む除算(A1 rdiv B1,A2 rdiv B2,C) :- 分数を含む乗算(A1 rdiv B1,B2 rdiv A2,C),!. 分数を含む除算(V,A2 rdiv B2,C) :- number(V), 分数を含む乗算(V,B2 rdiv A2,C),!. 分数を含む除算(A1 rdiv B1,V,C) :- number(V), B2 is V * B1, 約分(A1 rdiv B2,C),!. 分数を含む加算(A,B,C) :- number(A), number(B), C is A + B,!. 分数を含む加算(A1 rdiv B1,A2 rdiv B2,C) :- A3 is A1 * B2 + A2 * B1, B3 is B1 * B2, 約分(A3 rdiv B3,C),!. 分数を含む加算(A1 rdiv B1,V,C) :- number(V), A2 is V * B1, C3 is A1 + A2, 約分(C3 rdiv B1,C),!. 分数を含む加算(V,A2 rdiv B2,C) :- number(V), A1 is V * B2, C3 is A1 + A2, 約分(C3 rdiv B2,C),!. 分数を含む減算(A,B,C) :- number(A), number(B), C is A - B,!. 分数を含む減算(A1 rdiv B1,A2 rdiv B2,C) :- A3 is A1 * B2 - A2 * B1, B3 is B1 * B2, 約分(A3 rdiv B3,C),!. 分数を含む減算(A1 rdiv B1,V,C) :- number(V), A2 is V * B1, C3 is A1 - A2, 約分(C3 rdiv B1,C),!. 分数を含む減算(V,A2 rdiv B2,C) :- number(V), A1 is V * B2, C3 is A1 - A2, 約分(C3 rdiv B2,C),!. 約分(B rdiv A,X) :- 最大公約数(B,A,C), _分子 is B // C, _分母 is A // C, 約分の二(_分子,_分母,X),!. 約分の二(_分子,1,_分子) :- !. 約分の二(_分子,1.0,_分子) :- !. 約分の二(_分子_1,_分母_1,_分子 rdiv _分母) :- 分母が負数だったら分子分母ともに符号を反転する(_分子_1,_分母_1,_分子,_分母),!. 約分の二(_分子,_分母,_分子 rdiv _分母). 分母が負数だったら分子分母ともに符号を反転する(_分子_1,_分母_1,_分子,_分母) :- _分母_1 < 0, _分子 is _分子_1 * -1, _分母 is _分母_1 * -1. 最大公約数(M,N,X) :- 最大公約数をユークリッドの互除法で求める(M,N,X),!. 最大公約数をユークリッドの互除法で求める(M,N,N) :- 0 is M mod N,!. 最大公約数をユークリッドの互除法で求める(M,N,X) :- Mod is M mod N, 最大公約数をユークリッドの互除法で求める(N,Mod,X) .