🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Article View: pl.comp.lang.c
Article #517

Re: Obliczanie wyznacznika macierzy kwadratowej

#517
From: Titmus
Date: Sun, 04 Jan 1998 09:18
189 lines
10420 bytes
On Fri, 02 Jan 1998 15:41:11 +0100, Paweł Borowiec
<borowiec@ci-1.ci.pwr.wroc.pl> wrote:

>Poszukuje algorytmu (programu) obliczajacego wyznacznik macierzy
>kwadratowej o wymiarze n.
>(niby latwe, ale nie za bardzo wiem jak sie do tego zabrac...)
>
>Najlepszy bylby kod (C, C++, inne...), ale moze byc rowniez opis.
>
Podsyłam dwa programiki liczące wyznaczniki dowolnie wielkiej macierzy
(zależy od ilości wolnej pamięci). Jeden oblicz wyznacznik metodą
Laplace'a drugi Gaussa. Są trochę pamięciożerne (chodziło mi o
zaimplementowanie samego algorytmu) i chyba niezbyt optymalne, ale
myślę, że sobie z tym poradzisz.

Metoda Laplece'a poleg na tym, że z wyjściowej macierzy wybieramy
sobie dowolną kolumnę. Wyznacznik macierzy jest rowny sumie elementu z
danej kolumny pomnożonego przez (-1)^(numer_kolumny+numer_wiersza) i
to jeszcze razy wysznacznik macierzy powstałej poprzez wykreślenie
danej kolumny i wiersza. Do wyznacznika mniejszej macierzy stosujemy
ponownie tą regułę aż otrzymamy macierz np. 2x2 lub 1x1. Metoda ta
daje bardzo dobre rezultaty jeśli w macierzy jest dużo zer.

Metoda Gaussa jest o ile mnie dobrze poinformowano najszybszą znaną
metodą obliczania wyznacznika. Najpierw należy wprowadzić pojęcie
operacji elementarnych Gaussa:
1. pomnożenie dowolnego wiersza macierzy przez dowloną stałą
niezerową,
2. zamiana dwóch wierszy miejscami,
3. dodanie do danego wiersza innego pomnożonego przez stałą.

Przy pomocy tych trzech przekształceń należy doprowadzić macierz do
postaci:
1...
0...
0...
.
.
0...
Natępnie wykreślamy pierwszą kolumnę oraz wiersz i bawimy się od nowa.
Na końcu otrzymamy coś takiego:
1....
01...
001..
0001.
00001

Aby obliczyć wycznacznik przyjmujemy, że przed rozpoczęciem
przekształceń jest on równy 1 (D=1). Każda zamiana dwóch wierszy
miejscami zmienia znak liczby D. Pomnożenie wiersza przez stałą
powoduje pomnożenie D przez odwrotność tej stałej. Dodanie wiersza
pomnożonego przez stałą nie zmienia D. Jeśli w którymkolwiek momencie
pojawi się wiersz lub koluma zerowa, to wyznacznik jest równy 0.
Wydaje się to skomplikowane, ale jest bardzo proste.

Uff. Dawno się tyle nie napisałem. Mam nadzieję, że uda Ci się coś z
tego zrozumieć. Naprawdę się starałem.

Acha dane do programu: pierwsza liczba do rozmiar boku macierzy, a
dalej kolejne elementy (wszystkie liczby oddzielone spacjami lub nowym
wierszem).

-- 
_/_/_/_/_/ _/ _/_/_/_/_/   _/_/_/
   _/     _/     _/     _/      _/
  _/     _/     _/     _/      _/                     Sebastian Graca
 _/     _/     _/     _/      _/        Silesian Technical Univeristy
_/     _/     _/       _/_/_/     mailto:titmus@zeus.polsl.gliwice.pl

One man's fun is another's hell

begin 644 Laplace.cpp
M+R\@;V)L:6-Z86YI92!W>7IN86-Z;FEK82!M86-I97)Z>2!M971O9*4@3&%P
M;&%C92=A#0H-"B\O('=E:IAC:64Z#0HO+R!N("T@<F]Z;6EA<B!M86-I97)Z
M>2`H;&EC>F)A(&-AB&MO=VET82D-"B\O(&X@=VEE<G-Z>2!P;R!N(&QI8WIB
M#0H-"B\O('=Y:IAC:64@+2!W>7IN86-Z;FEK(&UA8VEE<GIY#0H-"B-I;F-L
M=61E(#QI;W-T<F5A;2YH/@T*(VEN8VQU9&4@/'-T9&QI8BYH/@T*#0IE;G5M
M(%IN86L@>R!M:6YU<RP@<&QU<R!].PT*#0IT>7!E9&5F(&1O=6)L92`J5VEE
M<G-Z36%C:65R>GD[#0IT>7!E9&5F(%=I97)S>DUA8VEE<GIY("I-86-I97)Z
M.PT*#0H-"G9O:60@='=O<GI?;6%C:65R>BA-86-I97)Z('=E:G-C:6]W82P@
M36%C:65R>B`F=WEJ<V-I;W=A+`T*("`@("`@("`@("`@("`@("`@(&EN="!R
M;WIM:6%R+"!I;G0@=VEE<G-Z*0T*+RH@='=O<GIY('H@;6%C:65R>GD@=V5J
M<V-I;W=A(&\@<F]Z;6EA<GIE(')O>FUI87(@;6%C:65R>B!W>6IS8VEO=V$-
M"B`@(&\@<F]Z;6EA<GIE(')O>FUI87(M,2!P;W!R>F5Z('5S;FFI8VEE('=I
M97)S>F$@;R!N=6UE<GIE('=I97)S>B`J+PT*>PT*("!F;W(H:6YT(&D@/2`P
M+"!J(#T@,#L@:2`\(')O>FUI87([(&DK*RP@:BLK*0T*("`@(&EF*"!I("$]
M('=I97)S>B`I#0H@("`@("!W>6IS8VEO=V%;:ET@/2!W96IS8VEO=V%;:5T[
M#0H@("`@96QS90T*("`@("`@:BTM.PT*?2`O+R!T=V]R>E]M86-I97)Z#0H-
M"@T*9&]U8FQE('=Y>FYA8WIN:6LH36%C:65R>B!M86-I97)Z+"!I;G0@<F]Z
M;6EA<BD-"GL-"B`@36%C:65R>B!N;W=A7VUA8VEE<GH[("\J(&UA8VEE<GHL
M(&MTHG)A('!O=W-T88AA('!R>F5Z('=Y:W)EF&QE;FEE#0H@("`@("`@("`@
M("`@("`@("`@("`@("`@("!O9'!O=VEE9&YI96=O('=I97)S>F$@:2!K;VQU
M;6YY("HO#0H@(%IN86L@>FYA:SL@("`@("`@("`@("`O+R!Z;F%K('H@:F%K
M:6T@>F]S=&%N:64@=WIIJ71Y(&MO;&5J;GD@96QE;65N=`T*#0H@(&1O=6)L
M92!?=WEZ;F%C>FYI:R`](#`[#0H-"B`@:68H(')O>FUI87(M+2`]/2`Q("D-
M"B`@("!R971U<FX@;6%C:65R>ELP75LP73L-"@T*("!I9B@@*&YO=V%?;6%C
M:65R>B`](&YE=R!7:65R<WI-86-I97)Z>5MR;WIM:6%R72D@/3T@,"`I('L-
M"B`@("!C97)R(#P\("):82!M88AO('!A;6FI8VDB(#P\(&5N9&P[#0H@("`@
M97AI="@Q*3L-"B`@?0T*#0H@("\O(&QI8WH@=WEZ;F%C>FYI:PT*("!F;W(H
M:6YT('=I97)S>B`](#`[('=I97)S>B`\/2!R;WIM:6%R.R!W:65R<WHK*RD@
M>PT*("`@('IN86L@/2`H=VEE<G-Z("4@,BD@/R!M:6YU<R`Z('!L=7,[#0H@
M("`@='=O<GI?;6%C:65R>BAM86-I97)Z+"!N;W=A7VUA8VEE<GHL(')O>FUI
M87(K,2P@=VEE<G-Z*3L-"B`@("!I9B`H('IN86L@/3T@<&QU<R`I#0H@("`@
M("!?=WEZ;F%C>FYI:R`K/2!M86-I97)Z6W=I97)S>EU;<F]Z;6EA<ETJ=WEZ
M;F%C>FYI:RAN;W=A7VUA8VEE<GHL(')O>FUI87(I.PT*("`@(&5L<V4-"B`@
M("`@(%]W>7IN86-Z;FEK("T](&UA8VEE<GI;=VEE<G-Z75MR;WIM:6%R72IW
M>7IN86-Z;FEK*&YO=V%?;6%C:65R>BP@<F]Z;6EA<BD[#0H@('T-"B`@9&5L
M971E6UT@;F]W85]M86-I97)Z.PT*("!R971U<FX@7W=Y>FYA8WIN:6L[#0I]
M("\O('=Y>FYA8WIN:6L-"@T*#0H-"FEN="!M86EN*'9O:60I#0I[#0H@(&EN
M="!R;WIM:6%R.R`@("`@("\O(')O>FUI87(@;6%C:65R>GD-"B`@36%C:65R
M>B!M86-I97)Z.R`@+R\@;F%S>F$@;6%C:65R>@T*#0H@("\O('=C>GET86YI
M92!D86YY8V@-"B`@8VEN(#X^(')O>FUI87([#0H@(&EF("AR;WIM:6%R(#P@
M,2D@>PT*("`@(&-E<G(@/#P@(DYI97!O<')A=VYY(')O>FUI87(@;6%C:65R
M>GDB(#P\(&5N9&P[#0H@("`@<F5T=7)N(#$[#0H@('T-"@T*("!I9B@@*&UA
M8VEE<GH@/2!N97<@5VEE<G-Z36%C:65R>GE;<F]Z;6EA<ETI(#T](#`@*2![
M#0H@("`@8V5R<B`\/"`B6F$@;6&(;R!P86UIJ6-I(B`\/"!E;F1L.PT*("`@
M(')E='5R;B`Q.PT*("!]#0H@(&9O<BAI;G0@=VEE<G-Z(#T@,#L@=VEE<G-Z
M(#P@<F]Z;6EA<CL@=VEE<G-Z*RLI#0H@("`@:68H("AM86-I97)Z6W=I97)S
M>ET@/2!N97<@9&]U8FQE6W)O>FUI87)=*2`]/2`P("D@>PT*("`@("`@8V5R
M<B`\/"`B6F$@;6&(;R!P86UIJ6-I(B`\/"!E;F1L.PT*("`@("`@<F5T=7)N
M(#$[#0H@("`@?0T*#0H@(&9O<BAW:65R<WH@/2`P.R!W:65R<WH@/"!R;WIM
M:6%R.R!W:65R<WHK*RD-"B`@("!F;W(H:6YT(&MO;'5M;F$@/2!R;WIM:6%R
M+3$[(&MO;'5M;F$@/CT@,#L@:V]L=6UN82TM*0T*("`@("`@8VEN(#X^(&UA
M8VEE<GI;=VEE<G-Z75MK;VQU;6YA73L@+R\@=R!W:65R<WIU(&5L96UE;G1Y
M('IA<&ES>7=A;F4@;V0@:V_D8V$-"@T*("!C;W5T(#P\(&5N9&P@/#P@=WEZ
M;F%C>FYI:RAM86-I97)Z+"!R;WIM:6%R*2`\/"!E;F1L.PT*#0H@(&9O<BAW
M:65R<WH@/2`P.R!W:65R<WH@/"!R;WIM:6%R.R!W:65R<WHK*RD-"B`@("!D
M96QE=&5;72!M86-I97)Z6W=I97)S>ET[#0H@(&1E;&5T95M=(&UA8VEE<GH[
0#0H@(')E='5R;B`P.PT*?7=I
`
end

begin 644 Gauss.cpp
M+R\@;V)L:6-Z86YI92!W>7IN86-Z;FEK82!M86-I97)Z>2!M971O9*4@1V%U
M<W,G80T*#0HO+R!W96J88VEE.@T*+R\@;B`M(')O>FUI87(@;6%C:65R>GD@
M*&QI8WIB82!C88AK;W=I=&$I#0HO+R!N('=I97)S>GD@<&\@;B!L:6-Z8@T*
M#0HO+R!W>6J88VEE("T@=WEZ;F%C>FYI:R!M86-I97)Z>0T*#0HC:6YC;'5D
M92`\:6]S=')E86TN:#X-"B-I;F-L=61E(#QS=&1L:6(N:#X-"@T*='EP961E
M9B!D;W5B;&4@*E=I97)S>DUA8VEE<GIY.PT*='EP961E9B!7:65R<WI-86-I
M97)Z>2`J36%C:65R>CL-"@T*#0II;FQI;F4@=F]I9"!Z86UI96Y?=VEE<G-Z
M92A7:65R<WI-86-I97)Z>2`F=VEE<G-Z,2P@5VEE<G-Z36%C:65R>GD@)G=I
M97)S>C(I#0I[#0H@(%=I97)S>DUA8VEE<GIY('1E;7`@/2!W:65R<WHQ.PT*
M("!W:65R<WHQ(#T@=VEE<G-Z,CL-"B`@=VEE<G-Z,2`]('1E;7`[#0I]("\O
M('IA;6EE;E]W:65R<WIE#0H-"@T*9&]U8FQE('=Y>FYA8WIN:6LH36%C:65R
M>B!M86-I97)Z+"!I;G0@<F]Z;6EA<BD-"GL-"B`@:68H(')O>FUI87(M+2`]
M/2`Q("D-"B`@("!R971U<FX@;6%C:65R>ELP75LP73L-"@T*("!I;G0@=VEE
M<G-Z.PT*("!D;W5B;&4@7W=Y>FYA8WIN:6L@/2`Q.PT*("!D;W5B;&4@)G!I
M97)W<WIY(#T@;6%C:65R>ELP75MR;WIM:6%R73L-"@T*("`O+R!S>G5K86YI
M92!N:65Z97)O=V5G;R!E;&5M96YT=0T*("!I9B@@(7!I97)W<WIY("D-"B`@
M("!F;W(@*'=I97)S>B`](#$[('=I97)S>B`\/2!R;WIM:6%R.R!W:65R<WHK
M*RD-"B`@("`@(&EF*"!M86-I97)Z6W=I97)S>EU;<F]Z;6EA<ET@*2![#0H@
M("`@("`@('IA;6EE;E]W:65R<WIE*&UA8VEE<GI;,%TL(&UA8VEE<GI;=VEE
M<G-Z72D[#0H@("`@("`@(%]W>7IN86-Z;FEK("H]("TQ.PT*("`@("`@("!B
M<F5A:SL-"B`@("`@('T-"@T*("!I9B@@(7!I97)W<WIY("D@+R\@:V]L=6UN
M82!Z97)O=V$-"B`@("!R971U<FX@,#L-"@T*("`O+R!P:65R=W-Z>6T@96QE
M;65N=&5M(&UA(&)YAB`Q#0H@(%]W>7IN86-Z;FEK("H]('!I97)W<WIY.PT*
M("!F;W(H:6YT(&MO;'5M;F$@/2`P.R!K;VQU;6YA(#P@<F]Z;6EA<CL@:V]L
M=6UN82LK*0T*("`@(&UA8VEE<GI;,%U;:V]L=6UN85T@+ST@<&EE<G=S>GD[
M#0H@('!I97)W<WIY(#T@,3L-"@T*("`O+R!Z97)U:B!P;WIO<W1AB&4@96QE
M;65N='D@=R!K;VQU;6YI90T*("!F;W(H=VEE<G-Z(#T@,3L@=VEE<G-Z(#P]
M(')O>FUI87([('=I97)S>BLK*2![#0H@("`@9&]U8FQE(&EL;W)A>B`](&UA
M8VEE<GI;=VEE<G-Z75MR;WIM:6%R73L-"B`@("!F;W(H:V]L=6UN82`](#`[
M(&MO;'5M;F$@/"!R;WIM:6%R.R!K;VQU;6YA*RLI#0H@("`@("!M86-I97)Z
M6W=I97)S>EU;:V]L=6UN85T@+3T@;6%C:65R>ELP75MK;VQU;6YA72II;&]R
M87H[#0H@("`@;6%C:65R>EMW:65R<WI=6W)O>FUI87)=(#T@,#L-"B`@?0T*
M#0H@(')E='5R;B!?=WEZ;F%C>FYI:RIW>7IN86-Z;FEK*"9M86-I97)Z6S%=
M+"!R;WIM:6%R*3L-"GT@+R\@=WEZ;F%C>FYI:PT*#0H-"FEN="!M86EN*'9O
M:60I#0I[#0H@(&EN="!R;WIM:6%R.R`@("`@("\O(')O>FUI87(@;6%C:65R
M>GD-"B`@36%C:65R>B!M86-I97)Z.R`@+R\@;F%S>F$@;6%C:65R>@T*#0H@
M("\O('=C>GET86YI92!D86YY8V@-"B`@8VEN(#X^(')O>FUI87([#0H@(&EF
M("AR;WIM:6%R(#P@,2D@>PT*("`@(&-E<G(@/#P@(DYI97!O<')A=VYY(')O
M>FUI87(@;6%C:65R>GDB(#P\(&5N9&P[#0H@("`@<F5T=7)N(#$[#0H@('T-
M"@T*("!I9B@@*&UA8VEE<GH@/2!N97<@5VEE<G-Z36%C:65R>GE;<F]Z;6EA
M<ETI(#T](#`@*2![#0H@("`@8V5R<B`\/"`B6F$@;6&(;R!P86UIJ6-I(B`\
M/"!E;F1L.PT*("`@(')E='5R;B`Q.PT*("!]#0H@(&9O<BAI;G0@=VEE<G-Z
M(#T@,#L@=VEE<G-Z(#P@<F]Z;6EA<CL@=VEE<G-Z*RLI#0H@("`@:68H("AM
M86-I97)Z6W=I97)S>ET@/2!N97<@9&]U8FQE6W)O>FUI87)=*2`]/2`P("D@
M>PT*("`@("`@8V5R<B`\/"`B6F$@;6&(;R!P86UIJ6-I(B`\/"!E;F1L.PT*
M("`@("`@<F5T=7)N(#$[#0H@("`@?0T*#0H@(&9O<BAW:65R<WH@/2`P.R!W
M:65R<WH@/"!R;WIM:6%R.R!W:65R<WHK*RD-"B`@("!F;W(H:6YT(&MO;'5M
M;F$@/2!R;WIM:6%R+3$[(&MO;'5M;F$@/CT@,#L@:V]L=6UN82TM*0T*("`@
M("`@8VEN(#X^(&UA8VEE<GI;=VEE<G-Z75MK;VQU;6YA73L@+R\@=R!W:65R
M<WIU(&5L96UE;G1Y('IA<&ES>7=A;F4@;V0@:V_D8V$-"@T*("!C;W5T(#P\
M(&5N9&P@/#P@=WEZ;F%C>FYI:RAM86-I97)Z+"!R;WIM:6%R*2`\/"!E;F1L
M.PT*#0H@(&9O<BAW:65R<WH@/2`P.R!W:65R<WH@/"!R;WIM:6%R.R!W:65R
M<WHK*RD-"B`@("!D96QE=&5;72!M86-I97)Z6W=I97)S>ET[#0H@(&1E;&5T
<95M=(&UA8VEE<GH[#0H@(')E='5R;B`P.PT*?7=I
`
end
Technical Details
Message-ID: <34ae9f79.1216540@news.icm.edu.pl>
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!pingwin.icm.edu.pl!news.icm.edu.pl!not-for-mail
References: <34ACFC87.4701@ci-1.ci.pwr.wroc.pl>

Show Full Headers
Complete Article Headers
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!pingwin.icm.edu.pl!news.icm.edu.pl!not-for-mail
From: titmus@zeus.polsl.gliwice.pl (Titmus)
Newsgroups: pl.comp.lang.c
Subject: Re: Obliczanie wyznacznika macierzy kwadratowej
Date: Sun, 04 Jan 1998 09:18:37 GMT
Organization: Silesian Technical University
Lines: 189
Message-ID: <34ae9f79.1216540@news.icm.edu.pl>
References: <34ACFC87.4701@ci-1.ci.pwr.wroc.pl>
NNTP-Posting-Host: rap-wct419.katowice.tpnet.pl
X-Newsreader: Forte Agent 1.5/32.451
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit