346{
347
348 int sign = 1;
349 size_t pivot_col;
350
351 ring_elem pivot =
R->from_long(0);
352 ring_elem lastpivot =
R->from_long(0);
353
354 for (
size_t r =
p - 1; r >= 1; --r)
355 {
356 R->remove(lastpivot);
357 lastpivot = pivot;
359 {
360
361 for (size_t i = 0; i <= r; i++)
362 for (
size_t j = 0; j <= r; j++)
R->remove(
D[i][j]);
363 R->remove(lastpivot);
364 return R->from_long(0);
365 }
366 for (
size_t i = 0; i < r; i++)
gauss(
D, i, r, pivot_col, lastpivot);
367
368 if (((r + pivot_col) % 2) == 1)
369 sign = -sign;
370
371 for (size_t c = 0; c <= r; c++)
372 if (c != pivot_col)
374 else
376 }
377
379 R->remove(lastpivot);
380 ring_elem r =
D[0][0];
382
383 if (sign < 0)
R->negate_to(r);
384
385 return r;
386}
void gauss(ring_elem **D, size_t i, size_t r, size_t pivot_col, ring_elem lastpivot)
bool get_pivot(ring_elem **D, size_t p, ring_elem &pivot, size_t &pivot_col)