116 {
117 if (q == 1) {
118 return mi.ac(0, 0);
119 } else if (q == 2) {
120 return mi.ac(0, 0) * mi.ac(1, 1) - mi.ac(0, 1) * mi.ac(1, 0);
121 } else if (q == 3) {
122 return mi.ac(0, 0) * mi.ac(1, 1) * mi.ac(2, 2) +
123 mi.ac(0, 2) * mi.ac(1, 0) * mi.ac(2, 1) +
124 mi.ac(0, 1) * mi.ac(1, 2) * mi.ac(2, 0) -
125 mi.ac(0, 2) * mi.ac(1, 1) * mi.ac(2, 0) -
126 mi.ac(0, 0) * mi.ac(1, 2) * mi.ac(2, 1) -
127 mi.ac(0, 1) * mi.ac(1, 0) * mi.ac(2, 2);
128 } else {
129 long nr, nr1, nc;
130 X koef = 1;
131 for (nr = 0; nr < q; nr++) {
133 double d = 0;
134 for (nr1 = nr; nr1 < q; nr1++) {
135 if (
fabs(mi.ac(nr1, nr)) > d) {
136 d =
fabs(mi.ac(nr1, nr));
138 }
139 }
140
141
142 if (d == 0) {
143
144 return koef * mi.ac(nmax, nr);
145 }
146 if (nmax > nr) {
147 for (nc = nr; nc < q; nc++) {
148 X t(mi.ac(nr, nc));
149 mi.ac(nr, nc) = mi.ac(nmax, nc);
150 mi.ac(nmax, nc) = t;
151 }
152 koef *= -1;
153 }
154 X t = mi.ac(nr, nr);
155 for (nr1 = nr + 1; nr1 < q; nr1++) {
156 X k(mi.ac(nr1, nr) / t);
157
158
159 for (nc = nr; nc < q; nc++) {
160 mi.ac(nr1, nc) -= k * mi.ac(nr, nc);
161 }
162
163
164 }
165 for (nc = nr; nc < q; nc++) {
166 mi.ac(nr, nc) /= t;
167 }
168 koef *= t;
169 }
170 return koef;
171 }
172}
DoubleAc fabs(const DoubleAc &f)