58 #define swap(_i, _j) \ 59 int __i = (_i), __j=(_j); \ 64 for (
int i=0;
i< nm;
i++)
65 for (
int j=
i+1;
j< nm;
j++)
70 for (
int i=nm;
i<
m;
i++)
71 for(
int j=0;
j<n;
j++)
76 for (
int i=nm;
i<n;
i++)
77 for(
int j=0;
j<
m;
j++)
152 for (
int i=0;
i <
l;
i++)
162 if (&lhr == &rhr) {
return true; }
163 if (lhr.
cols() != rhr.
cols()) {
return false; }
164 if (lhr.
rows() != rhr.
rows()) {
return false; }
169 for (
int i=0;
i <
l;
i++)
185 if (
a->cols() !=
b->cols())
return NULL;
186 if (
a->rows() !=
b->rows())
return NULL;
187 if (
a->basecoeffs() !=
b->basecoeffs()) {
return NULL; }
189 const coeffs basecoeffs =
a->basecoeffs();
195 for (
i=
a->rows()*
a->cols()-1;
i>=0;
i--)
203 const int mn =
a->rows()*
a->cols();
205 const coeffs basecoeffs =
a->basecoeffs();
206 number bb=
n_Init(
b,basecoeffs);
221 if (
a->cols() !=
b->cols())
return NULL;
222 if (
a->rows() !=
b->rows())
return NULL;
223 if (
a->basecoeffs() !=
b->basecoeffs()) {
return NULL; }
225 const coeffs basecoeffs =
a->basecoeffs();
231 for (
i=
a->rows()*
a->cols()-1;
i>=0;
i--)
239 const int mn =
a->rows()*
a->cols();
241 const coeffs basecoeffs =
a->basecoeffs();
242 number bb=
n_Init(
b,basecoeffs);
258 const int ca =
a->cols();
259 const int cb =
b->cols();
261 const int ra =
a->rows();
262 const int rb =
b->rows();
267 Werror(
"wrong bigintmat sizes at multiplication a * b: acols: %d != brows: %d\n", ca, rb);
274 if (
a->basecoeffs() !=
b->basecoeffs()) {
return NULL; }
276 const coeffs basecoeffs =
a->basecoeffs();
284 for (
i=1;
i<=ra;
i++)
285 for (
j=1;
j<=cb;
j++)
287 sum =
n_Init(0, basecoeffs);
289 for (
k=1;
k<=ca;
k++)
305 const int mn =
a->rows()*
a->cols();
307 const coeffs basecoeffs =
a->basecoeffs();
308 number bb=
n_Init(
b,basecoeffs);
323 if (
cf!=
a->basecoeffs())
return NULL;
325 const int mn =
a->rows()*
a->cols();
327 const coeffs basecoeffs =
a->basecoeffs();
345 for (
int i=0;
i<(
b->rows())*(
b->cols());
i++)
346 (*iv)[
i] =
n_Int((*
b)[
i],
b->basecoeffs());
352 const int l = (
b->rows())*(
b->cols());
355 for (
int i=0;
i <
l;
i++)
369 WerrorS(
"wrong bigintmat comparison: different basecoeffs!\n");
372 if ((
col!=1) ||(op->
cols()!=1))
419 for(
int i=1;
i<=
m;
i++)
422 for(
int j=1;
j< n;
j++)
458 int * colwid =
getwid(80);
461 WerrorS(
"not enough space to print bigintmat");
462 WerrorS(
"try string(...) for a unformatted output");
468 slength += colwid[
j]*
row;
470 ps = (
char*)
omAlloc0(
sizeof(
char)*(slength));
477 const int _nl = strlen(ts);
479 if (_nl > colwid[cj])
485 int phl = strlen(ph);
486 if (phl > colwid[cj])
488 for (
int j=0;
j<colwid[cj]-1;
j++)
490 ps[pos+colwid[cj]-1] =
'*';
494 for (
int j=0;
j<colwid[cj]-phl;
j++)
496 for (
int j=0;
j<phl;
j++)
497 ps[pos+colwid[cj]-phl+
j] = ph[
j];
503 for (
int j=0;
j<(colwid[cj]-_nl);
j++)
505 for (
int j=0;
j<_nl;
j++)
506 ps[pos+colwid[cj]-_nl+
j] = ts[
j];
513 ps[pos+colwid[cj]] =
',';
514 ps[pos+colwid[cj]+1] =
'\n';
520 ps[pos+colwid[cj]] =
',';
533 for (
int i=0;
i<length;
i++)
542 for (
int i=0;
i<length;
i++)
557 for (
int i=0;
i<rows;
i++)
562 min = floor(log10((
double)cols))+floor(log10((
double)rows))+5;
571 min = floor(log10((
double)cols))+floor(log10((
double)rows))+5;
583 int const c = (
col-1)+1;
584 if (
col + c > maxwid-1)
return NULL;
595 const int _nl = strlen(tmp);
619 int * colwid =
getwid(maxwid);
622 WerrorS(
"not enough space to print bigintmat");
628 slength += colwid[
j]*
row;
630 ps = (
char*)
omAlloc0(
sizeof(
char)*(slength));
637 const int _nl = strlen(ts);
639 if (_nl > colwid[cj])
645 int phl = strlen(ph);
646 if (phl > colwid[cj])
648 for (
int j=0;
j<colwid[cj]-1;
j++)
650 ps[pos+colwid[cj]-1] =
'*';
654 for (
int j=0;
j<colwid[cj]-phl;
j++)
656 for (
int j=0;
j<phl;
j++)
657 ps[pos+colwid[cj]-phl+
j] = ph[
j];
663 for (
int j=0;
j<colwid[cj]-_nl;
j++)
665 for (
int j=0;
j<_nl;
j++)
666 ps[pos+colwid[cj]-_nl+
j] = ts[
j];
673 ps[pos+colwid[cj]] =
',';
674 ps[pos+colwid[cj]+1] =
'\n';
680 ps[pos+colwid[cj]] =
',';
695 if ((
i <=
col) && (
j <=
col) && (
i>0) && (
j>0))
699 for (
int k=1;
k<=
row;
k++)
714 if ((
i <=
row) && (
j <=
row) && (
i>0) && (
j>0))
718 for (
int k=1;
k<=
col;
k++)
733 for (
int j=1;
j<=
col;
j++)
745 for (
int i=
row;
i>=1;
i--)
758 if (((
a->rows() !=
row) || (
a->cols() != 1)) && ((
a->rows() != 1) || (
a->cols() !=
row)))
761 WerrorS(
"Error in getcol. Dimensions must agree!");
789 for(
int ii=0; ii< no; ii++)
801 if ((
i>
row) || (
i<1))
803 WerrorS(
"Error in getrow: Index out of range!");
806 if (((
a->rows() != 1) || (
a->cols() !=
col)) && ((
a->rows() !=
col) || (
a->cols() != 1)))
808 WerrorS(
"Error in getrow. Dimensions must agree!");
836 if ((
j>
col) || (
j<1))
838 WerrorS(
"Error in setcol: Index out of range!");
841 if (((
m->rows() !=
row) || (
m->cols() != 1)) && ((
m->rows() != 1) || (
m->cols() !=
row)))
843 WerrorS(
"Error in setcol. Dimensions must agree!");
850 for (
int i=1;
i<=
row;
i++)
861 for (
int i=1;
i<=
row;
i++)
870 if ((
j>
row) || (
j<1))
872 WerrorS(
"Error in setrow: Index out of range!");
875 if (((
m->rows() != 1) || (
m->cols() !=
col)) && ((
m->rows() !=
col) || (
m->cols() != 1)))
877 WerrorS(
"Error in setrow. Dimensions must agree!");
884 for (
int i=1;
i<=
col;
i++)
895 for (
int i=1;
i<=
col;
i++)
904 if ((
b->rows() !=
row) || (
b->cols() !=
col))
906 WerrorS(
"Error in bigintmat::add. Dimensions do not agree!");
911 WerrorS(
"Error in bigintmat::add. coeffs do not agree!");
914 for (
int i=1;
i<=
row;
i++)
916 for (
int j=1;
j<=
col;
j++)
926 if ((
b->rows() !=
row) || (
b->cols() !=
col))
928 WerrorS(
"Error in bigintmat::sub. Dimensions do not agree!");
933 WerrorS(
"Error in bigintmat::sub. coeffs do not agree!");
936 for (
int i=1;
i<=
row;
i++)
938 for (
int j=1;
j<=
col;
j++)
955 for (
int i=1;
i<=
row;
i++)
957 for (
int j=1;
j<=
col;
j++)
971 WerrorS(
"Error in addcol: Index out of range!");
976 WerrorS(
"Error in addcol: coeffs do not agree!");
980 for (
int k=1;
k<=
row;
k++)
995 WerrorS(
"Error in addrow: Index out of range!");
1000 WerrorS(
"Error in addrow: coeffs do not agree!");
1004 for (
int k=1;
k<=
col;
k++)
1020 for (
int j=1;
j<=
row;
j++)
1028 WerrorS(
"Error in colskalmult");
1036 for (
int j=1;
j<=
col;
j++)
1044 WerrorS(
"Error in rowskalmult");
1054 if (!((
col == ay) && (
col == by) && (ax+bx ==
row)))
1056 WerrorS(
"Error in concatrow. Dimensions must agree!");
1061 WerrorS(
"Error in concatrow. coeffs do not agree!");
1064 for (
int i=1;
i<=ax;
i++)
1066 for (
int j=1;
j<=ay;
j++)
1073 for (
int i=1;
i<=bx;
i++)
1075 for (
int j=1;
j<=by;
j++)
1117 for (
int i=1;
i<=ax;
i++)
1119 for (
int j=1;
j<=ay;
j++)
1125 for (
int i=1;
i<=bx;
i++)
1127 for (
int j=1;
j<=by;
j++)
1142 if (!(ax + bx ==
row))
1144 WerrorS(
"Error in splitrow. Dimensions must agree!");
1146 else if (!((
col == ay) && (
col == by)))
1148 WerrorS(
"Error in splitrow. Dimensions must agree!");
1152 WerrorS(
"Error in splitrow. coeffs do not agree!");
1156 for(
int i = 1;
i<=ax;
i++)
1158 for(
int j = 1;
j<=ay;
j++)
1165 for (
int i =1;
i<=bx;
i++)
1184 if (!((
row == ax) && (
row == bx)))
1186 WerrorS(
"Error in splitcol. Dimensions must agree!");
1188 else if (!(ay+by ==
col))
1190 WerrorS(
"Error in splitcol. Dimensions must agree!");
1194 WerrorS(
"Error in splitcol. coeffs do not agree!");
1198 for (
int i=1;
i<=ax;
i++)
1200 for (
int j=1;
j<=ay;
j++)
1206 for (
int i=1;
i<=bx;
i++)
1208 for (
int j=1;
j<=by;
j++)
1220 if ((
a->rows() !=
row) || (
a->cols()+
i-1 >
col) || (
i<1))
1222 WerrorS(
"Error in splitcol. Dimensions must agree!");
1227 WerrorS(
"Error in splitcol. coeffs do not agree!");
1230 int width =
a->cols();
1231 for (
int j=1;
j<=width;
j++)
1233 for (
int k=1;
k<=
row;
k++)
1235 tmp =
get(
k,
j+
i-1);
1245 if ((
a->cols() !=
col) || (
a->rows()+
i-1 >
row) || (
i<1))
1247 WerrorS(
"Error in Marco-splitrow");
1253 WerrorS(
"Error in splitrow. coeffs do not agree!");
1256 int height =
a->rows();
1257 for (
int j=1;
j<=height;
j++)
1259 for (
int k=1;
k<=
col;
k++)
1269 if ((
b->rows() !=
row) || (
b->cols() !=
col))
1271 WerrorS(
"Error in bigintmat::copy. Dimensions do not agree!");
1276 WerrorS(
"Error in bigintmat::copy. coeffs do not agree!");
1280 for (
int i=1;
i<=
row;
i++)
1282 for (
int j=1;
j<=
col;
j++)
1298 for (
int i=1;
i<=n;
i++)
1300 for (
int j=1;
j<=
m;
j++)
1302 t1 =
B->view(
a+
i-1,
b+
j-1);
1303 set(c+
i-1, d+
j-1, t1);
1313 for (
int i=1;
i<=
row;
i++)
1315 for (
int j=1;
j<=
col;
j++)
1339 for (
int i=1;
i<=
row;
i++)
1341 for (
int j=1;
j<=
col;
j++)
1361 for (
int i=1;
i<=
row;
i++)
1363 for (
int j=1;
j<=
col;
j++)
1373 for (
int i=1;
i<=
row;
i++) {
1374 for (
int j=1;
j<=
col;
j++) {
1398 for (
int k=1;
k<=
row;
k++) {
1402 for (
int l=1;
l<=
col;
l++)
1428 number
det = this->
det();
1435 m->concatrow(
a,
this);
1441 for (
int i=1;
i<=
col;
i++) {
1443 for (
int j=
i+1;
j<=
col;
j++) {
1456 for (
int j=1;
j<=
col;
j++) {
1458 for (
int i=1;
i<=2*
row;
i++) {
1467 m->colskaldiv(
j,
g);
1475 for (
int i=1;
i<=
col;
i++) {
1489 for (
int j=1;
j<=
col;
j++) {
1499 number divisor =
m->get(
row+1, 1);
1509 number t =
get(1,1),
1512 for(
int i=2;
i<=
col;
i++) {
1532 number t1, t2, t3, t4;
1534 for (
int i=1;
i<=
row;
i++) {
1541 if ((
i+1)>>1<<1==(
i+1))
1563 for (
int i=1;
i<=
col;
i++) {
1564 temp =
m->get(
i,
i);
1618 int last_zero_col =
i-1;
1619 for (
int c =
cols(); c>0; c--) {
1627 for(
j = c-1;
j>last_zero_col;
j--) {
1634 number
gcd, co1, co2, co3, co4;
1642 swap(last_zero_col,
k);
1660 if (
k) last_zero_col--;
1691 number co1, co2, co3, co4;
1694 while ((
i>0) && (
j>0))
1704 for (
int l=1;
l<=
j-1;
l++)
1814 coeffs cold =
a->basecoeffs();
1821 for (
int i=1;
i<=
a->rows();
i++)
1823 for (
int j=1;
j<=
a->cols();
j++)
1826 t2 =
f(t1, cold, cnew);
1848 int piv =
rows(),
i =
a->cols();
1853 C->
set(piv, piv,
p,
R);
1872 for (
int i=1;
i<=
row;
i++)
1874 for (
int j=1;
j<=
col;
j++)
1887 for (
int i=1;
i<=
row;
i++)
1900 for (
int i=1;
i<=
row;
i++)
1928 for (
int i=1;
i<=
row;
i++)
1930 for (
int j=1;
j<=
col;
j++)
1944 WerrorS(
"Error in bimMult. Coeffs do not agree!");
1947 if ((
a->rows() != c->
rows()) || (
b->cols() != c->
cols()) || (
a->cols() !=
b->rows()))
1949 WerrorS(
"Error in bimMult. Dimensions do not agree!");
1965 PrintS(
"reduce_mod_howell: A:\n");
1985 PrintS(
"\n****************************************\n");
1991 for(
int i=1;
i<=
b->cols();
i++)
1993 int A_col =
A->cols();
1995 for(
int j =
B->rows();
j>0;
j--)
1997 number Ai =
A->view(
A->rows() -
B->rows() +
j, A_col);
2015 number Bj =
B->view(
j, 1);
2016 number q =
n_Div(Bj, Ai,
R);
2017 x->rawset(
x->rows() -
B->rows() +
j,
i, q);
2018 for(
int k=
j;
k>
B->rows() -
A->rows();
k--)
2021 number
s =
n_Mult(q,
A->view(
A->rows() -
B->rows() +
k, A_col),
R);
2040 PrintS(
"\n****************************************\n");
2048 m->copySubmatInto(
A, 1, 1,
A->rows(),
A->cols(),
A->cols()+1, 1);
2050 for(
int i=1;
i<=
A->cols();
i++)
2063 for(
int i=1;
i<=
A->rows();
i++)
2065 for(
int j=1;
j<=
A->cols();
j++)
2084 number dz =
f(d,
Q, Z),
2094 PrintS(
"den increasing to ");
2105 PrintS(
"bimFarey worked\n");
2136 for(
i=1;
i<=
A->cols();
i++)
2138 for(
j=
m->rows();
j>
A->cols();
j--)
2142 if (
j>
A->cols())
break;
2162 x->skalmult(zero,
R);
2176 PrintS(
"no solution, since no modular solution\n");
2219 fps_p->extendCols(kp->
cols());
2334 for(
int i=1;
i<=
b->cols();
i++)
2336 int A_col =
A->cols();
2338 B->skalmult(
den,
R);
2339 for(
int j =
B->rows();
j>0;
j--)
2341 number Ai =
m->view(
m->rows()-
B->rows() +
j, A_col);
2363 number Bj =
B->view(
j, 1);
2372 number inc_d =
n_Div(Ai,
g,
R);
2374 x->skalmult(inc_d,
R);
2375 B->skalmult(inc_d,
R);
2379 x->rawset(
x->rows() -
B->rows() +
j,
i, xi);
2380 for(
int k=
j;
k>0;
k--)
2383 number
s =
n_Mult(xi,
m->view(
m->rows()-
B->rows() +
k, A_col),
R);
2405 T->copySubmatInto(
m, 1, 1,
A->cols(),
A->cols(), 1, 1);
2409 for(
i=1;
i<=
A->cols();
i++)
2411 for(
j=
m->rows();
j>
A->cols();
j--)
2415 if (
j>
A->cols())
break;
2417 Print(
"Found nullity (kern dim) of %d\n",
i-1);
2427 x->simplifyContentDen(&
den);
2441 PrintS(
"Solve Ax=b for A=\n");
2453 assume ((
x->cols() ==
b->cols()) && (
x->rows() ==
A->cols()) && (
A->rows() ==
b->rows()));
2470 WarnS(
"have field, should use Gauss or better");
2473 if (
R->cfXExtGcd &&
R->cfAnn)
2477 WerrorS(
"have no solve algorithm");
2529 for(
int i=0;
i<
a->cols();
i++)
2534 for (
int i=0;
i<
a->rows();
i++)
2537 r->setrow(
i+
a->cols()+1, rw);
2540 for(
int i=0;
i<
a->cols();
i++)
2545 for(
int i=0;
i<
a->rows();
i++)
2547 r->getrow(
i+
a->cols()+1, rw);
2554 Print(
"X: %ld\n", X);
2561 Print(
"\n2:X: %ld %ld %ld\n", X, *S, *
T);
2563 Print(
"\n2:x: %ld\n",
x);
2574 for(
int i=
a->rows(); diag &&
i>0;
i--)
2576 for(
int j=
a->cols();
j>0;
j--)
2586 PrintS(
"Diag ? %d\n", diag);
2633 #define MIN(a,b) (a < b ? a : b) 2634 for(rg=0; rg<
MIN(
m->rows(),
m->cols()) && !
n_IsZero(
m->view(
m->rows()-rg,
m->cols()-rg), coe); rg++);
2637 for(
int i=0;
i<rg;
i++)
2639 number
A =
n_Ann(
m->view(
m->rows()-
i,
m->cols()-
i), coe);
2640 k->set(
m->cols()-
i,
i+1,
A);
2643 for(
int i=rg;
i<
m->cols();
i++)
2686 number
g =
get(1,1),
h;
void operator*=(int intop)
UEberladener *=-Operator (fuer int und bigint) Frage hier: *= verwenden oder lieber = und * einzeln...
static FORCE_INLINE number n_Sub(number a, number b, const coeffs r)
return the difference of 'a' and 'b', i.e., a-b
void concatcol(bigintmat *a, bigintmat *b)
void skaldiv(number b)
Macht Ganzzahldivision aller Matrixeinträge mit b.
static number solveAx_dixon(bigintmat *A, bigintmat *B, bigintmat *x, bigintmat *kern)
static FORCE_INLINE BOOLEAN n_Greater(number a, number b, const coeffs r)
ordered fields: TRUE iff 'a' is larger than 'b'; in Z/pZ: TRUE iff la > lb, where la and lb are the l...
static int findLongest(int *a, int length)
static FORCE_INLINE number n_IntMod(number a, number b, const coeffs r)
for r a field, return n_Init(0,r) always: n_Div(a,b,r)*b+n_IntMod(a,b,r)==a n_IntMod(a,b,r) >=0
static FORCE_INLINE number n_GetNumerator(number &n, const coeffs r)
return the numerator of n (if elements of r are by nature not fractional, result is n) ...
static FORCE_INLINE number n_GetUnit(number n, const coeffs r)
in Z: 1 in Z/kZ (where k is not a prime): largest divisor of n (taken in Z) that is co-prime with k i...
static FORCE_INLINE number n_Gcd(number a, number b, const coeffs r)
in Z: return the gcd of 'a' and 'b' in Z/nZ, Z/2^kZ: computed as in the case Z in Z/pZ...
void splitcol(bigintmat *a, bigintmat *b)
... linken ... rechten ...
const CanonicalForm int s
void concatrow(bigintmat *a, bigintmat *b)
Fügt zwei Matrixen untereinander/nebeneinander in gegebene Matrix ein, bzw spaltet gegebenen Matrix a...
const CanonicalForm int const CFList const Variable & y
int lcm(unsigned long *l, unsigned long *a, unsigned long *b, unsigned long p, int dega, int degb)
only used if HAVE_RINGS is defined
void swaprow(int i, int j)
swap rows i and j
bigintmat * bimSub(bigintmat *a, bigintmat *b)
static FORCE_INLINE number n_XExtGcd(number a, number b, number *s, number *t, number *u, number *v, const coeffs r)
number det()
det (via LaPlace in general, hnf for euc. rings)
static bigintmat * prependIdentity(bigintmat *A)
bool addcol(int i, int j, number a, coeffs c)
addiert a-faches der j-ten Spalte zur i-ten dazu
void colskaldiv(int j, number b)
Macht Ganzzahldivision aller j-ten Spalteneinträge mit b.
void getrow(int i, bigintmat *a)
Schreibt i-te Zeile in Vektor (Matrix) a.
only used if HAVE_RINGS is defined
used for all transcendental extensions, i.e., the top-most extension in an extension tower is transce...
static int min(int a, int b)
static int si_min(const int a, const int b)
void simplifyContentDen(number *den)
ensures that Gcd(den, content)=1 enden hier wieder
static FORCE_INLINE void n_InpMult(number &a, number b, const coeffs r)
multiplication of 'a' and 'b'; replacement of 'a' by the product a*b
static FORCE_INLINE BOOLEAN n_IsOne(number n, const coeffs r)
TRUE iff 'n' represents the one element.
void inpTranspose()
transpose in place
void setcol(int j, bigintmat *m)
Setzt j-te Spalte gleich übergebenem Vektor (Matrix) m.
bigintmat * iv2bim(intvec *b, const coeffs C)
void appendCol(bigintmat *a)
horizontally join the matrices, m <- m|a
bool sub(bigintmat *b)
Subtrahiert ...
int isOne()
is matrix is identity
void rowskalmult(int i, number a, coeffs c)
... Zeile ...
static FORCE_INLINE number n_Init(long i, const coeffs r)
a number representing i in the given coeff field/ring r
bigintmat * bimAdd(bigintmat *a, bigintmat *b)
Matrix-Add/-Sub/-Mult so oder mit operator+/-/* ? : NULL as a result means an error (non-compatible m...
void zero()
Setzt alle Einträge auf 0.
int findnonzero(int i)
find index of 1st non-zero entry in row i
char * StringAsPrinted()
Returns a string as it would have been printed in the interpreter.
number solveAx(bigintmat *A, bigintmat *b, bigintmat *x)
solve Ax=b*d. x needs to be pre-allocated to the same number of columns as b. the minimal denominator...
void getColRange(int j, int no, bigintmat *a)
copies the no-columns staring by j (so j...j+no-1) into the pre-allocated a
void setrow(int i, bigintmat *m)
Setzt i-te Zeile gleich übergebenem Vektor (Matrix) m.
void WerrorS(const char *s)
static int intArrSum(int *a, int length)
int findcolnonzero(int j)
find index of 1st non-zero entry in column j
static FORCE_INLINE void n_InpAdd(number &a, number b, const coeffs r)
addition of 'a' and 'b'; replacement of 'a' by the sum a+b
static FORCE_INLINE void number2mpz(number n, coeffs c, mpz_t m)
static FORCE_INLINE number n_Ann(number a, const coeffs r)
if r is a ring with zero divisors, return an annihilator!=0 of b otherwise return NULL ...
void set(int i, int j, number n, const coeffs C=NULL)
replace an entry with a copy (delete old + copy new!). NOTE: starts at [1,1]
void Write()
IO: writes the matrix into the current internal string buffer which must be started/ allocated before...
int kernbase(bigintmat *a, bigintmat *c, number p, coeffs q)
a basis for the nullspace of a mod p: only used internally in Round2. Don't use it.
void rawset(int i, number n, const coeffs C=NULL)
replace an entry with the given number n (only delete old). NOTE: starts at [0]. Should be named set_...
static FORCE_INLINE number n_Mult(number a, number b, const coeffs r)
return the product of 'a' and 'b', i.e., a*b
static coeffs numbercoeffs(number n, coeffs c)
create Z/nA of type n_Zn
intvec * bim2iv(bigintmat *b)
static int getShorter(int *a, int l, int j, int cols, int rows)
static FORCE_INLINE long n_Int(number &n, const coeffs r)
conversion of n to an int; 0 if not possible in Z/pZ: the representing int lying in (-p/2 ...
const CanonicalForm CFMap CFMap & N
void copySubmatInto(bigintmat *, int sr, int sc, int nr, int nc, int tr, int tc)
copy the submatrix of b, staring at (a,b) having n rows, m cols into the given matrix at pos...
bool addrow(int i, int j, number a, coeffs c)
... Zeile ...
only used if HAVE_RINGS is defined
bigintmat * bimCopy(const bigintmat *b)
same as copy constructor - apart from it being able to accept NULL as input
bigintmat * bimMult(bigintmat *a, bigintmat *b)
static number bimFarey(bigintmat *A, number N, bigintmat *L)
static void reduce_mod_howell(bigintmat *A, bigintmat *b, bigintmat *eps, bigintmat *x)
void extendCols(int i)
append i zero-columns to the matrix
void swapMatrix(bigintmat *a)
The main handler for Singular numbers which are suitable for Singular polynomials.
static FORCE_INLINE number n_Add(number a, number b, const coeffs r)
return the sum of 'a' and 'b', i.e., a+b
void StringSetS(const char *st)
void StringAppendS(const char *st)
number(* nMapFunc)(number a, const coeffs src, const coeffs dst)
maps "a", which lives in src, into dst
bool skalmult(number b, coeffs c)
Multipliziert zur Matrix den Skalar b hinzu.
void swap(int i, int j)
swap columns i and j
static FORCE_INLINE void n_Write(number n, const coeffs r, const BOOLEAN bShortOut=TRUE)
int index(int r, int c) const
helper function to map from 2-dim coordinates, starting by 1 to 1-dim coordinate, starting by 0 ...
bool operator==(const bigintmat &lhr, const bigintmat &rhr)
number view(int i, int j) const
view an entry an entry. NOTE: starts at [1,1]
static FORCE_INLINE number n_QuotRem(number a, number b, number *q, const coeffs r)
static FORCE_INLINE number n_InpNeg(number n, const coeffs r)
in-place negation of n MUST BE USED: n = n_InpNeg(n) (no copy is returned)
void hnf()
transforms INPLACE to HNF
only used if HAVE_RINGS is defined
void PrintS(const char *s)
static number solveAx_howell(bigintmat *A, bigintmat *b, bigintmat *x, bigintmat *kern)
static FORCE_INLINE BOOLEAN n_IsZero(number n, const coeffs r)
TRUE iff 'n' represents the zero element.
static FORCE_INLINE nMapFunc n_SetMap(const coeffs src, const coeffs dst)
set the mapping function pointers for translating numbers from src to dst
bigintmat * bimChangeCoeff(bigintmat *a, coeffs cnew)
Liefert Kopier von Matrix a zurück, mit coeffs cnew statt den ursprünglichen.
void diagonalForm(bigintmat *A, bigintmat **S, bigintmat **T)
static FORCE_INLINE n_coeffType getCoeffType(const coeffs r)
Returns the type of coeffs domain.
void Print()
IO: simply prints the matrix to the current output (screen?)
static int index(p_Length length, p_Ord ord)
#define BIMATELEM(M, I, J)
static FORCE_INLINE number n_Farey(number a, number b, const coeffs r)
number content()
the content, the gcd of all entries. Only makes sense for Euclidean rings (or possibly constructive P...
std::pair< ideal, ring > flip(const ideal I, const ring r, const gfan::ZVector interiorPoint, const gfan::ZVector facetNormal, const gfan::ZVector adjustedInteriorPoint, const gfan::ZVector adjustedFacetNormal)
bool operator!=(const bigintmat &lhr, const bigintmat &rhr)
void getcol(int j, bigintmat *a)
copies the j-th column into the matrix a - which needs to be pre-allocated with the correct size...
bigintmat * modhnf(number p, coeffs c)
computes HNF(this | p*I)
number trace()
the trace ....
void colskalmult(int i, number a, coeffs c)
Multipliziert zur i-ten Spalte den Skalar a hinzu.
static FORCE_INLINE number n_Copy(number n, const coeffs r)
return a copy of 'n'
used for all algebraic extensions, i.e., the top-most extension in an extension tower is algebraic ...
static FORCE_INLINE number n_Div(number a, number b, const coeffs r)
return the quotient of 'a' and 'b', i.e., a/b; raises an error if 'b' is not invertible in r exceptio...
coeffs basecoeffs() const
char * String()
IO: String returns a singular string containing the matrix, needs freeing afterwards.
bool copy(bigintmat *b)
Kopiert Einträge von b auf Bigintmat.
void inpMult(number bintop, const coeffs C=NULL)
inplace version of skalar mult. CHANGES input.
static FORCE_INLINE number n_GetDenom(number &n, const coeffs r)
return the denominator of n (if elements of r are by nature not fractional, result is 1) ...
static FORCE_INLINE BOOLEAN n_Equal(number a, number b, const coeffs r)
TRUE iff 'a' and 'b' represent the same number; they may have different representations.
number hnfdet()
det via HNF Primzahlen als long long int, müssen noch in number umgewandelt werden?
bigintmat * elim(int i, int j)
Liefert Streichungsmatrix (i-te Zeile und j-te Spalte gestrichen) zurück.
void coltransform(int i, int j, number a, number b, number c, number d)
transforms cols (i,j) using the 2x2 matrix ((a,b)(c,d)) (hopefully)
void splitrow(bigintmat *a, bigintmat *b)
Speichert in Matrix a den oberen, in b den unteren Teil der Matrix, vorausgesetzt die Dimensionen sti...
static FORCE_INLINE void n_Delete(number *p, const coeffs r)
delete 'p'
static FORCE_INLINE BOOLEAN n_GreaterZero(number n, const coeffs r)
ordered fields: TRUE iff 'n' is positive; in Z/pZ: TRUE iff 0 < m <= roundedBelow(p/2), where m is the long representing n in C: TRUE iff (Im(n) != 0 and Im(n) >= 0) or (Im(n) == 0 and Re(n) >= 0) in K(a)/<p(a)>: TRUE iff (n != 0 and (LC(n) > 0 or deg(n) > 0)) in K(t_1, ..., t_n): TRUE iff (LC(numerator(n) is a constant and > 0) or (LC(numerator(n) is not a constant) in Z/2^kZ: TRUE iff 0 < n <= 2^(k-1) in Z/mZ: TRUE iff the internal mpz is greater than zero in Z: TRUE iff n > 0
number pseudoinv(bigintmat *a)
Speichert in Matrix a die Pseudoinverse, liefert den Nenner zurück.
static FORCE_INLINE char * nCoeffString(const coeffs cf)
TODO: make it a virtual method of coeffs, together with: Decompose & Compose, rParameter & rPar...
number get(int i, int j) const
get a copy of an entry. NOTE: starts at [1,1]
int compare(const bigintmat *op) const
void howell()
dito, but Howell form (only different for zero-divsors)
void nKillChar(coeffs r)
undo all initialisations
bool add(bigintmat *b)
Addiert zur Matrix die Matrix b dazu. Return false => an error occurred.
void Werror(const char *fmt,...)
void one()
Macht Matrix (Falls quadratisch) zu Einheitsmatrix.
void mod(number p)
Reduziert komplette Matrix modulo p.
void n_Print(number &a, const coeffs r)
print a number (BEWARE of string buffers!) mostly for debugging
coeffs nInitChar(n_coeffType t, void *parameter)
one-time initialisations for new coeffs in case of an error return NULL
bool nCoeffs_are_equal(coeffs r, coeffs s)