このディレクトリの索引

行列式の値(1,[[_]],1) :- !.
行列式の値(2,_正方行列,_行列式の値) :-
        二つの対角要素の積の差を得る(_n,_正方行列,_行列式の値),!.
行列式の値(_n,_正方行列,_行列式の値) :-
        '余因子行列で行列値|a|を求める'(_正方行列,_行列式の値).

'余因子行列で行列値|a|を求める'(_a,_行列式_aの値) :-
        余因子行列(_a,_余因子行列),
        _a = [_aの第一行|_],
        _余因子行列 = [_余因子行列の第一行|_],
        '二つのならびの積の和'(_aの第一行,_余因子行列の第一行,_行列式_aの値).

'二つのならびの積の和'([],[],0).
'二つのならびの積の和'([A|R1],[B|R2],S) :-
        '二つのならびの積の和'(R1,R2,S_1),
        S is S_1 + A * B.

余因子行列(_正方行列,_余因子行列) :-
        length(_正方行列,_n),
        余因子行列(_n,_正方行列,_余因子行列).

余因子行列(_n,_正方行列,_余因子行列) :-
        length(_余因子行列,_n),
        findall(L,(
                    nth1(_i,_余因子行列,L),
                    余因子行列の要素が余因子である(_n,_正方行列,_i,L)), 
                _余因子行列).

余因子行列の要素が余因子である(_n,_正方行列,_i,L) :-
        length(L,_n),
        findall(_余因子,(
                    nth1(_j,L,_余因子),
                    余因子(_n,_正方行列,_i,_j,_余因子)),
                L).

余因子(_n,_正方行列,_i,_j,_余因子) :-
        'n次正方行列から、第i行と第j列を取り除いた正方行列(n-1次正方行列の行列式に、(-1)のi+j乗をかけたものを、Aの(i,j)余因子といい、Cijで表します。'(_n,_正方行列,_i,_j,_余因子).

'n次正方行列から、第i行と第j列を取り除いた正方行列(n-1次正方行列の行列式に、(-1)のi+j乗をかけたものを、Aの(i,j)余因子といい、Cijで表します。'(_n,_正方行列,_i,_j,_余因子) :-
        '正方行列からi行j列を取り除いた行列式の値'(_n,_正方行列,_i,_j,_n_1次正方行列の行列式の値),
        'i,jから乗数を得る'(_i,_j,_乗数),
        _余因子 is _乗数 * _n_1次正方行列の行列式の値.

'正方行列からi行j列を取り除いた行列式の値'(_n,_正方行列,_i,_j,_n_1次正方行列の行列式の値) :-
        '正方行列から第i行と第j列を取り除く'(_正方行列,_i,_j,_n_1次正方行列),
        _n_1 is _n - 1,
        行列式の値(_n_1,_n_1次正方行列,_n_1次正方行列の行列式の値).

'正方行列から第i行と第j列を取り除く'(_正方行列,_i,_j,_n_1次正方行列) :-
        '第何行を取り除く'(_正方行列,_i,_第i行が取り除かれた行列),
        転置(_第i行が取り除かれた行列,_転置された第i行が取り除かれた行列),
        '第何行を取り除く'(_転置された第i行が取り除かれた行列,_j,_転置された第i行第j列が取り除かれた行列),
        転置(_転置された第i行第j列が取り除かれた行列,_n_1次正方行列).

'第何行を取り除く'(_正方行列,_第何行,_第i行が取り除かれた行列) :-
        append(L0,[L|R],_正方行列),
        length([_|L0],_第何行),
        append(L0,R,_第i行が取り除かれた行列).

二つの対角要素の積の差を得る(0,[],1) :- !.
二つの対角要素の積の差を得る(1,[[N]],N) :- !.
二つの対角要素の積の差を得る(_n,_正方行列,_二つの対角要素の積の差) :-
        二つの対角要素の積を得る(_正方行列,_右下がり対角要素の積,_右上がり対角要素の積),
        _二つの対角要素の積の差 is _右下がり対角要素の積 - _右上がり対角要素の積.

二つの対角要素の積を得る(_正方行列,_右下がり対角要素の積,_右上がり対角要素の積) :-
        二つの対角要素を得る(_正方行列,_右下がり対角要素ならび,_右上がり対角要素ならび),
        対角要素の掛算(_右下がり対角要素ならび,_右下がり対角要素の積),
        対角要素の掛算(_右上がり対角要素ならび,_右上がり対角要素の積).

二つの対角要素を得る(_正方行列,_右下がり対角要素ならび,_右上がり対角要素ならび) :-
        右下がり対角要素ならび(_正方行列,_右下がり対角要素ならび),
        右上がり対角要素ならび(_正方行列,_右上がり対角要素ならび).        

右下がり対角要素ならび(_正方行列,_右下がり対角要素ならび) :-
        findall(V,(
                    nth1(_nth1,_正方行列,L),
                    nth1(_nth1,L,V)),
                _右下がり対角要素ならび).

左下がり対角要素ならび(_正方行列,_左下がり対角要素ならび) :-
        findall(V,(
                    nth1(_nth1,_正方行列,L),
                    length([_|R],_nth1),
                    append(_,[V|R],L)),
                _左下がり対角要素ならび),!.

'i,jから乗数を得る'(_i,_j,(-1)) :-
        1 is (_i + _j) mod 2,!.
'i,jから乗数を得る'(_i,_j,1) :-
        0 is (_i + _j) mod 2,!.

対角要素の掛算([],1).
対角要素の掛算([A|R],X) :-
        対角要素の掛算(R,Y),
        X is A * Y.