このディレクトリの索引

ガウス法によるLU分解(_n,LL,LU,L,U) :-
        解が生成される変数行列とその転置行列の生成(_n,LU,LU2),
        転置(LL,LL2),
        ガウス法によるLU分解(LL,LL2,LU,LU2),
        'LとUに分解'(LU,L,U),!.

解が生成される変数行列とその転置行列の生成(_n,LU,LU2) :-
        length(LU,_n),
        findall(L,(
                    between(1,_n,_),
                    length(L,_n)),
                LU),
        転置(LU,LU2),!.

ガウス法によるLU分解([],[],[],[]) :- !.
ガウス法によるLU分解([[A|L1]|R1],[[A|L2]|R2],[[A|L3]|R3],[[A|L2]|R4]) :-
        '第一行は各列を隅要素(A)で割って置換する'(A,L1,L3),
        第二行以下は次の対象矩形を生成する(L2,L3,R1,_次の対象矩形),
        '次の対象矩形の変数行列(第一行と第一列だけ段々に確定していく)'(R3,R4,R31,R41),
        転置(_次の対象矩形,_転置された次の対象矩形),
        ガウス法によりLu分解(_次の対象矩形,_転置された次の対象矩形,R31,R41),

'第一行は各列を隅要素(A)で割って置換する'(A,[],[]).
'第一行は各列を隅要素(A)で割って置換する'(A,[A1|R1],[B1|R2]) :-
        'A1をAで割る'(A,A1,B1),
        '第一行は各列を隅要素(A)で割って置換する'(A,R1,R2).

'A1をAで割る'(A,A1,B1) :-
        行基本変形除算(A,1,A1,B1).

第二行以下は次の対象矩形を生成する([],_,[],[]) :- !.
第二行以下は次の対象矩形を生成する([A|R1],L2,[[_|L3]|R3],[L|R]) :-
        '各行の列を現在値(C)を基礎に第一列の値(A)と第一行の値(B)から書き換える'(A,L2,L3,L),
        第二行以下は次の対象矩形を生成する(R1,L2,R3,R).

'各行の列を現在値(C)を基礎に第一列の値(A)と第一行の値(B)から書き換える'(_,[],[],[]) :- !.
'各行の列を現在値(C)を基礎に第一列の値(A)と第一行の値(B)から書き換える'(A,[B|R2],[C|R3],[D|R4]) :-
        'D is C - A * B'(A,B,C,D),
        '各行の列を現在値(C)を基礎に第一列の値(A)と第一行の値(B)から書き換える'(A,R2,R3,R4).

'D is C - A * B'(A,B,C,D) :-
        行基本変形乗算(A,B,V),
        行基本変形減算(C,V,D),!.

'次の対象矩形の変数行列(第一行と第一列だけ段々に確定していく)'([],[],[],[]).
'次の対象矩形の変数行列(第一行と第一列だけ段々に確定していく)'([[_|L3]|R3],[[_|L4]|R4],[L3|R31],[L4|R41]) :-
        '次の対象矩形の変数行列(第一行と第一列だけ段々に確定していく)'(R3,R4,R31,R41).

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

'LとUに分解'(LU,L,U) :-
        'Lに分解'(LU,L),
        'Uに分解'(LU,U).

'Lに分解'(LU,LL) :-
        findall(L2,(
                   member(L1,LU),
                   append(L0,R,L1),
                   \+(L0 = []),
                   '残り要素Rをすべて0に置き換える'(L0,R,L2)),
                LL).
                   
'残り要素Rをすべて0に置き換える'(L0,R,L2) :-
        length(R,Len),
        length(R1,Len),
        all(R1,0),
        append(L0,R1,L2),!.

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

'L0の全要素を0に置き換える'(L,L0,[A|R1],L2) :-
        length(L0,Len),
        length(L0_2,Len),
        all(L0_2,0),
        'L1を先頭要素で割る'(L1,L1_2),
        append(L0_2,L1_2,L2),!.

'L1を先頭要素で割る'([_先頭要素|R1],[1|R2]) :-
        findall(M,(
                    member(A,R1),
                    分数を含む除算(A,_先頭要素,M)),
                R2).

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

行基本変形乗算(_乗数_1,_乗数_2,X) :-
        integer(_乗数_1),
        integer(_乗数_2),
        X is _乗数_1 * _乗数_2,!.
行基本変形乗算(_分子_1/_分母_1,_分子_2/_分母_2,X) :-
        _分子 is _分子_1 * _分子_2,
        _分母 is _分母_1 * _分母_2,
        約分(_分子 / _分母,X),!.
行基本変形乗算(_分子/_分母,_乗数_2,X) :-
        A is _分子 * _乗数_2,
        0 is A mod _分母,
        X is A // _分母,!.
行基本変形乗算(_乗数_1,_分子/_分母,X) :-
        atomic(_乗数_1),
        行基本変形乗算(_分子/_分母,_乗数_1,X),!.
行基本変形乗算(_乗数_1,_乗数_2,X) :-
        X is _乗数_1 * _乗数_2,!.

行基本変形除算(A,_乗数,_除数,X) :-
        integer(A),
        integer(_乗数),
        integer(_除数),
        A2 is A * _乗数,
        0 is A2 mod _除数,
        X is A * _乗数 // _除数,!.
行基本変形除算(A,_乗数,_除数,X) :-
        integer(A),
        integer(_乗数),
        integer(_除数),
        A2 is A * _乗数,
        \+(0 is A2 mod _除数),
        約分(A2 / _除数,X),!.
行基本変形除算(A,_乗数,_除数,X) :-
        X is A * _乗数 / _除数.

行基本変形減算(A,B,C) :-
        atomic(A),
        atomic(B),
        C is A - B,!.
行基本変形減算(A1/A2,B1/B2,X) :-
        _分子 is A1 * B1,
        _分母 is A2 * B2,
        約分(_分子 / _分母,X),!.
行基本変形減算(A1/A2,B1/B2,X) :-
        _分子 is A1 * B2 - B1 * A2,
        _分母 is A2 * B2,
        約分(_分子 / _分母,X),!.
行基本変形減算(A1/A2,B,X) :-
        atomic(B),
        _分子 is A1 - A2 * B,
        _分母 is A2,
        約分(_分子 / _分母,X),!.
行基本変形減算(B,A1/A2,X) :-
        行基本変形減算(A1/A2,B,X),!.
行基本変形減算(A,B,X) :-
        X is A - B.

約分(B / A,X) :-
        最大公約数(B,A,C),
        _分子 is B // C,
        _分母 is A // C,
        約分の二(_分子,_分母,X),!.

約分の二(_分子,1,_分子) :- !.
約分の二(_分子,1.0,_分子) :- !.
約分の二(_分子,_分母,_分子 / _分母).

最大公約数(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).