//Autor: Artur Czekalski (Sator) www.epokaY.net/artur artur@epokaY.net //Liczenie wyznacznika macierzy #include //printf #include //GetTickCount() //--------------------------------------------------------------------------- const int gWymiar = 11; //liczba wierszy i kolumn w macierzy double Mat[gWymiar*gWymiar]; //macierz //--------------------------------------------------------------------------- inline bool PermLexSuccSelf(int N, int *P) { //Ustala następnika permutacji w kolejności leksykogrficznej tzn. t[i]= 0 && P[i+1] < P[i]) --i; //znajdź pierwszy od prawej, który psuje porządek rosnący if (i == -1) return false; //ostatnia permutacja while (j > i && P[j] <= P[i]) --j; //znajdź element pierwszy od prawej > P[i] if (j == i) return false; //to nie jest permutacja w = P[i]; P[i] = P[j]; P[j] = w; //zamień P[i] z P[j] k = i + (N-i-1) / 2; for (j=i+1; j<=k; ++j) //zapisz w odwrotnej kolejności: od i+1 do n {w = P[j]; P[j] = P[N+i-j]; P[N+i-j] = w; } return true; //Jest następnik } //--------------------------------------------------------------------------- inline int LInwersji(int N, int *P) { //Podaje liczbę inwersji w permutacji P; np. 3,1,4,2 ma 3 inw.: (3,1),(3,2),(4,2) int i, j, LInw = 0; for (i=0; i P[j]) ++LInw; return LInw; } //-------------------------------------------------------------- inline double DetMacierz(int Wymiar, double *M) {//Liczy wyznacznik macierzy M ze wzoru if (Wymiar <= 1) return 0.0; double Suma = 0.0, Iloczyn; int i; int *P = new int[Wymiar]; //permutacja for (i=0; i