このディレクトリの索引

'LU分解'(L1,L,U) :-
        'LU分解(L1,L2),
        'LとUに二つの行列に分離する'(L2,L,U).

'LU分解'([L],[L]) :- !.
'LU分解'(LL,LU) :-
        第一行と第一列を切り取り第一列には除算処理を施す(LL,L1,L2,LL_1),
        '第一行と第一列を使って残り行列の値を更新する'(LL_1,L1,L2,LL2),
        'LU分解'(LL2,LU2),
        第一行と第一列を付加する(LU2,L1,L2,LU).

第一行と第一列を切り取り第一列には除算処理を施す(LL,_第一行,_更新された第二行以下の第一列,_残り行列) :-
        第一行を切り取る(LL,_左上角要素,_第一行,_第二行以下の行列),
        第一列と第二列以降を分離する(_第二行以下の行列,_第二行以下の第一列,_残り行列),
        左上角要素を除数として第一列を除算する(_左上角要素,_第二行以下の第一列,_更新された第二行以下の第一列).

第一行を切り取る([[A|R1]|LL_1],A,[A|R1],LL_1).

第一列と第二列以降を分離する([],[],[]).
第一列と第二列以降を分離する([A|R1],[A|R2],[R1|R3]) :-
        第一列と第二列以降を分離する(R1,R2,R3).

左上角要素を除数として第一列を除算する(_,[],[]).
左上角要素を除数として第一列を除算する(_除数,[_第一列要素|R1],[_更新される第一列要素|R2]) :-
        分数を含む除算(_第一列要素,_除数,_更新される第一列要素),
        左上角要素を除数として第一列を除算する(_除数,R1,R2).

'第一行と第一列を使って残り行列の値を更新する'([],_,_,[]).
'第一行と第一列を使って残り行列の値を更新する'([L|R1],[A|R2],L2,[L4|R4]) :-
        行を更新する(L,A,L2,L4),
        '第一行と第一列を使って残り行列の値を更新する'(R1,R2,L2,R4).

行を更新する([],_,_,[]).
行を更新する([V1|R1],A,[B|R3],[V|R4]) :-
        'Vの更新'(V1,A,B,V),
        行を更新する(R1,A,R3,R4).

'Vの更新'(V1,A,B,V) :-
        分数を含む乗算(A,B,C),
        分数を含む減算(V1,C,V),!.

第一行と第一列を付加する(LU2,L1,L2,LU) :-
        第一列を付加する(L2,LU2,LU1),
        LU = [L1|LU1].

第一列を付加する([],[],[]).
第一列を付加する([A|R1],[L2|R2],[[A|L2]|R3]) :-
        第一列を付加する(R1,R2,R3).

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

'LとUに二つの行列に分離する'(LU,L,U) :-
        'Lを分離する'(LU,L),
        'Uを分離する'(LU,U).

'Lを分離する'(LU,LL) :-
        findall(LL,(
                   member(L1,LU),
                   append(L0,[A|R],L1),
                   '対角要素Aを1として残り要素Rをすべて0に置き換える'(L1,L0,R,L3),
                LL).
                   
'対角要素Aを1として残り要素Rをすべて0に置き換える'(L1,L0,R,L2) :-
        length(R,Len),
        length(R1,Len),
        all(R1,0),
        append(L0,[1|R1],L2),!.

'Uを分離する'(LU,UU) :-
        findall(L2,(
                   member(L,LU),
                   append(L0,L1,L),
                   'L0の全要素を0に置き換える'(L,L0,L1,L2)),
                UU).

'L0の全要素を0に置き換える'(L,L0,L1,L2) :-
        length(L0,Len),
        length(L01,Len),
        all(L01,0),
        append(L01,L1,L2),!.

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

分数を含む乗算(A1/B1,A2/B2,C) :-
        B3 is B1 * B2,
        A3 is A1 * A2,
        約分(A3/B3,C),!.
分数を含む乗算(V,A2/B2,C) :-
        number(V),
        A3 is V * A2,
        約分(U/B2,C),!.
分数を含む乗算(A1/B1,V,C) :-
        number(V),
        A3 is A1 * V,
        約分(A3/B1,C),!.
分数を含む乗算(A,B,C) :-
        C is A * B.

分数を含む除算(A,B,C) :-
        number(A),
        number(B),
        約分(A/B,C),!.
分数を含む除算(V,A2/B2,C) :-
        number(V),
        分数を含む乗算(V,B2/A2,C),!.
分数を含む除算(A1/B1,A2/B2,C) :-
        分数を含む乗算(A1/B1,B2/A2,C),!.
分数を含む除算(A1/B1,V,C) :-
        number(V),
        B2 is V * B1,
        約分(A1/B2,C),!.

分数を含む減算(A,B,C) :-
        number(A),
        number(B),
        C is A - B,!.        
分数を含む減算(A1/B1,A2/B2,C) :-
        A3 is A1 * B2 - A2 * B1,
        B3 is B1 * B2,
        約分(A3/B3,C),!.
分数を含む減算(A1/B1,V,C) :-
        number(V),
        A2 is V * B1,
        C3 is A1 - A2,
        約分(C3/B1,C),!.
分数を含む減算(V,A2/B2,C) :-
        number(V),
        A1 is V * B2,
        C3 is A1 - A2,
        約分(C3/B2,C),!.