Niech będzie dana macierz kwadratowa A stopnia n.
Wyznacznikiem nazywamy, takie odwzorowanie, które danej macierzy An×n przyporządkowuje dokładnie jedną liczbę rzeczywistą det(A).
Dla macierzy A stopnia 1 wyznacznikiem jest jego jedyna wartość. Dla macierzy stopnia 2 i 3 istnieją wzory, ale najwygodniejszym sposobem jest Rozwinięcie Laplace’a, które upraszcza macierz dowolnego stopnia do macierzy dowolnego stopnia.
W uproszczeniu mówi o tym, że wyznacznik można policzyć w sposób rekurencyjny. Rozwijając wyznacznikiem względem wiersza należy dla każdego wiersza należy wykonać to samo. Dla i-tego wiersza: pobrać pierwszy element, pomnożyć go przez -1 podniesione do potęgi będącą sumą współrzędnych pobranego elementu, a następnie pomnożyć przez dopełnienie algebraiczne pobranego elementu. W tym przypadku jest to pomnożenie przez wyznacznik macierzy z wykreśloną pierwszą kolumną i bez i-tego wiersza.
Weźmy macierz stopnia 3:
(1)(6·1 - 4·6) + (-5)(2·1 - 3·4) + (3)(2·6 - 3·6) = (-18) + 50 + (-18) = 14
Kod zamieszczony poniżej został oparty o rozwijaną bibliotekę matrix.h, która posiada już odpowiednie funkcje do między innymi wczytywania / usuwania macierzy co powinno ułatwić skupienie się tylko na rozwiązywanym problemie.
Jak pewnie można zauważyć algorytm można zaimplementować przy pomocy dwóch funkcji: jedna z nich będzie służyć do wyliczania wyznacznika, a druga będzie funkcją pomocniczą, która będzie przygotowywać kolejne dopełnienia algebraiczne.
Funkcja, która będzie tworzyć dopełnienie będzie przyjmować trzy argumenty: mat - wskaźnik na macierz typu Matrix oraz pozycję elementu w zmiennych remx i remx. Funkcja ta nie sprawdza poprawności wprowadzonych danych.
(2.) Utwórz nową macierz i (3. - 4.) wskaż, że ma o jeden wiersz i kolumnę mniej niż macierz pierwotna. (5.) Zadeklaruj nową tablicę danych. (6.) Rozpocznij przepisywanie wierszy. Potrzebne są tutaj dwa liczniki: i oraz ipos. Pierwszy z nich przechodzi po kolejnych elementach tablicy wiersza pierwotnego, a druga po wierszach nowej macierzy. W ten sposób istnieje możliwość pominięcia przepisywania jednego wybranego wiersza. (7.) Jeśli wybrany wiersz ma nie być przepisywany to go pomiń. Wtedy zwiększony zostanie indeks i, ale nie ipos. (8. - 13.) Analogiczne rozumowanie dla przepisywanych wartości do wiersza.
Funkcja wyznacznik() będzie przyjmować tylko jeden argument mat, którym jest wskaźnik na macierz typu Matrix. (2.) Na początek funkcja upewnia się, że macierz jest kwadratowa i jeśli nie to (3.) zwraca wyjątek.
Rekurencja wymaga warunku stopu bez, którego rekurencja jest nieskończona. (3.) W tym przypadku jest to sprawdzenie czy macierz jest stopnia 1 i jeśli tak to (4.) zwrócenia wartości jej wyznacznika. Jeśli jednak macierz jest większa to przygotowujemy się do jej dzielenia. (5.) Deklarujemy zmienną, która będzie sumować kolejne wartości z każdej iteracji: (6. - 10.) Dla każdego wiersza; (7.) utwórz dopełnienie algebraiczne względem elementu ai + 1, 1, (8.) wylicz wartość dodawaną do aktualnej wartości wyznacznika i (9.) usuń tymczasową macierz. Na koniec (11.) zwróć wartość zmiennej w.
Poniżej znajduje się funkcja main(), która wczytuje od użytkownika macierz, a następnie wypisuje jej wyznacznik. W przypadku błędu zostaje on wypisany na konsolę.
Napisz funkcję pokazObliczenia(), która wypisze postać równania po ostatnim uproszczeniu, ale bez jeszcze nie wyliczonego żadnego jej fragmentu. Przykładowo dla macierzy:
poprawnym wynikiem jest: