58 int __i = (_i), __j=(_j); \
63 for (
int i=0;
i< nm;
i++)
64 for (
int j=
i+1;
j< nm;
j++)
69 for (
int i=nm;
i<
m;
i++)
70 for(
int j=0;
j<n;
j++)
75 for (
int i=nm;
i<n;
i++)
76 for(
int j=0;
j<
m;
j++)
151 for (
int i=0;
i <
l;
i++)
161 if (&lhr == &rhr) {
return true; }
162 if (lhr.
cols() != rhr.
cols()) {
return false; }
163 if (lhr.
rows() != rhr.
rows()) {
return false; }
168 for (
int i=0;
i <
l;
i++)
205 number bb=
n_Init(
b,basecoeffs);
211 for (
i=1;
i<=mn;
i++)
241 number bb=
n_Init(
b,basecoeffs);
247 for (
i=1;
i<=mn;
i++)
257 const int ca = a->
cols();
258 const int cb =
b->cols();
260 const int ra = a->
rows();
261 const int rb =
b->rows();
266 Werror(
"wrong bigintmat sizes at multiplication a * b: acols: %d != brows: %d\n", ca, rb);
283 for (
i=1;
i<=ra;
i++)
284 for (
j=1;
j<=cb;
j++)
286 sum =
n_Init(0, basecoeffs);
288 for (
k=1;
k<=ca;
k++)
307 number bb=
n_Init(
b,basecoeffs);
344 for (
int i=0;
i<(
b->rows())*(
b->cols());
i++)
345 (*iv)[
i] =
n_Int((*
b)[
i],
b->basecoeffs());
351 const int l = (
b->rows())*(
b->cols());
354 for (
int i=0;
i <
l;
i++)
368 WerrorS(
"wrong bigintmat comparison: different basecoeffs!\n");
371 if ((
col!=1) ||(op->
cols()!=1))
418 for(
int i=1;
i<=
m;
i++)
421 for(
int j=1;
j< n;
j++)
457 int * colwid =
getwid(80);
460 WerrorS(
"not enough space to print bigintmat");
461 WerrorS(
"try string(...) for a unformatted output");
467 slength += colwid[
j]*
row;
469 ps = (
char*)
omAlloc0(
sizeof(
char)*(slength));
476 const int _nl = strlen(ts);
478 if (_nl > colwid[cj])
484 int phl = strlen(ph);
485 if (phl > colwid[cj])
487 for (
int j=0;
j<colwid[cj]-1;
j++)
489 ps[pos+colwid[cj]-1] =
'*';
493 for (
int j=0;
j<colwid[cj]-phl;
j++)
495 for (
int j=0;
j<phl;
j++)
496 ps[pos+colwid[cj]-phl+
j] = ph[
j];
502 for (
int j=0;
j<(colwid[cj]-_nl);
j++)
504 for (
int j=0;
j<_nl;
j++)
505 ps[pos+colwid[cj]-_nl+
j] = ts[
j];
512 ps[pos+colwid[cj]] =
',';
513 ps[pos+colwid[cj]+1] =
'\n';
519 ps[pos+colwid[cj]] =
',';
556 for (
int i=0;
i<rows;
i++)
582 int const c = (
col-1)+1;
593 const int _nl = strlen(tmp);
617 int * colwid =
getwid(maxwid);
621 slength += colwid[
j]*
row;
623 ps = (
char*)
omAlloc0(
sizeof(
char)*(slength));
630 const int _nl = strlen(ts);
632 if (_nl > colwid[cj])
638 int phl = strlen(ph);
639 if (phl > colwid[cj])
641 for (
int j=0;
j<colwid[cj]-1;
j++)
643 ps[pos+colwid[cj]-1] =
'*';
647 for (
int j=0;
j<colwid[cj]-phl;
j++)
649 for (
int j=0;
j<phl;
j++)
650 ps[pos+colwid[cj]-phl+
j] = ph[
j];
656 for (
int j=0;
j<colwid[cj]-_nl;
j++)
658 for (
int j=0;
j<_nl;
j++)
659 ps[pos+colwid[cj]-_nl+
j] = ts[
j];
666 ps[pos+colwid[cj]] =
',';
667 ps[pos+colwid[cj]+1] =
'\n';
673 ps[pos+colwid[cj]] =
',';
688 if ((
i <=
col) && (
j <=
col) && (
i>0) && (
j>0))
692 for (
int k=1;
k<=
row;
k++)
707 if ((
i <=
row) && (
j <=
row) && (
i>0) && (
j>0))
711 for (
int k=1;
k<=
col;
k++)
726 for (
int j=1;
j<=
col;
j++)
738 for (
int i=
row;
i>=1;
i--)
754 WerrorS(
"Error in getcol. Dimensions must agree!");
782 for(
int ii=0; ii< no; ii++)
794 if ((
i>
row) || (
i<1))
796 WerrorS(
"Error in getrow: Index out of range!");
801 WerrorS(
"Error in getrow. Dimensions must agree!");
829 if ((
j>
col) || (
j<1))
831 WerrorS(
"Error in setcol: Index out of range!");
834 if (((
m->rows() !=
row) || (
m->cols() != 1)) && ((
m->rows() != 1) || (
m->cols() !=
row)))
836 WerrorS(
"Error in setcol. Dimensions must agree!");
843 for (
int i=1;
i<=
row;
i++)
854 for (
int i=1;
i<=
row;
i++)
863 if ((
j>
row) || (
j<1))
865 WerrorS(
"Error in setrow: Index out of range!");
868 if (((
m->rows() != 1) || (
m->cols() !=
col)) && ((
m->rows() !=
col) || (
m->cols() != 1)))
870 WerrorS(
"Error in setrow. Dimensions must agree!");
877 for (
int i=1;
i<=
col;
i++)
888 for (
int i=1;
i<=
col;
i++)
897 if ((
b->rows() !=
row) || (
b->cols() !=
col))
899 WerrorS(
"Error in bigintmat::add. Dimensions do not agree!");
904 WerrorS(
"Error in bigintmat::add. coeffs do not agree!");
907 for (
int i=1;
i<=
row;
i++)
909 for (
int j=1;
j<=
col;
j++)
919 if ((
b->rows() !=
row) || (
b->cols() !=
col))
921 WerrorS(
"Error in bigintmat::sub. Dimensions do not agree!");
926 WerrorS(
"Error in bigintmat::sub. coeffs do not agree!");
929 for (
int i=1;
i<=
row;
i++)
931 for (
int j=1;
j<=
col;
j++)
948 for (
int i=1;
i<=
row;
i++)
950 for (
int j=1;
j<=
col;
j++)
964 WerrorS(
"Error in addcol: Index out of range!");
969 WerrorS(
"Error in addcol: coeffs do not agree!");
973 for (
int k=1;
k<=
row;
k++)
988 WerrorS(
"Error in addrow: Index out of range!");
993 WerrorS(
"Error in addrow: coeffs do not agree!");
997 for (
int k=1;
k<=
col;
k++)
1013 for (
int j=1;
j<=
row;
j++)
1021 WerrorS(
"Error in colskalmult");
1029 for (
int j=1;
j<=
col;
j++)
1037 WerrorS(
"Error in rowskalmult");
1047 if (!((
col == ay) && (
col == by) && (ax+bx ==
row)))
1049 WerrorS(
"Error in concatrow. Dimensions must agree!");
1054 WerrorS(
"Error in concatrow. coeffs do not agree!");
1057 for (
int i=1;
i<=ax;
i++)
1059 for (
int j=1;
j<=ay;
j++)
1066 for (
int i=1;
i<=bx;
i++)
1068 for (
int j=1;
j<=by;
j++)
1110 for (
int i=1;
i<=ax;
i++)
1112 for (
int j=1;
j<=ay;
j++)
1118 for (
int i=1;
i<=bx;
i++)
1120 for (
int j=1;
j<=by;
j++)
1135 if (!(ax + bx ==
row))
1137 WerrorS(
"Error in splitrow. Dimensions must agree!");
1139 else if (!((
col == ay) && (
col == by)))
1141 WerrorS(
"Error in splitrow. Dimensions must agree!");
1145 WerrorS(
"Error in splitrow. coeffs do not agree!");
1149 for(
int i = 1;
i<=ax;
i++)
1151 for(
int j = 1;
j<=ay;
j++)
1158 for (
int i =1;
i<=bx;
i++)
1177 if (!((
row == ax) && (
row == bx)))
1179 WerrorS(
"Error in splitcol. Dimensions must agree!");
1181 else if (!(ay+by ==
col))
1183 WerrorS(
"Error in splitcol. Dimensions must agree!");
1187 WerrorS(
"Error in splitcol. coeffs do not agree!");
1191 for (
int i=1;
i<=ax;
i++)
1193 for (
int j=1;
j<=ay;
j++)
1199 for (
int i=1;
i<=bx;
i++)
1201 for (
int j=1;
j<=by;
j++)
1215 WerrorS(
"Error in splitcol. Dimensions must agree!");
1220 WerrorS(
"Error in splitcol. coeffs do not agree!");
1223 int width = a->
cols();
1224 for (
int j=1;
j<=width;
j++)
1226 for (
int k=1;
k<=
row;
k++)
1240 WerrorS(
"Error in Marco-splitrow");
1246 WerrorS(
"Error in splitrow. coeffs do not agree!");
1249 int height = a->
rows();
1250 for (
int j=1;
j<=height;
j++)
1252 for (
int k=1;
k<=
col;
k++)
1262 if ((
b->rows() !=
row) || (
b->cols() !=
col))
1264 WerrorS(
"Error in bigintmat::copy. Dimensions do not agree!");
1269 WerrorS(
"Error in bigintmat::copy. coeffs do not agree!");
1273 for (
int i=1;
i<=
row;
i++)
1275 for (
int j=1;
j<=
col;
j++)
1291 for (
int i=1;
i<=n;
i++)
1293 for (
int j=1;
j<=
m;
j++)
1295 t1 =
B->view(a+
i-1,
b+
j-1);
1296 set(c+
i-1, d+
j-1, t1);
1306 for (
int i=1;
i<=
row;
i++)
1308 for (
int j=1;
j<=
col;
j++)
1332 for (
int i=1;
i<=
row;
i++)
1334 for (
int j=1;
j<=
col;
j++)
1354 for (
int i=1;
i<=
row;
i++)
1356 for (
int j=1;
j<=
col;
j++)
1366 for (
int i=1;
i<=
row;
i++) {
1367 for (
int j=1;
j<=
col;
j++) {
1391 for (
int k=1;
k<=
row;
k++) {
1395 for (
int l=1;
l<=
col;
l++)
1421 number
det = this->
det();
1428 m->concatrow(a,
this);
1434 for (
int i=1;
i<=
col;
i++) {
1436 for (
int j=
i+1;
j<=
col;
j++) {
1449 for (
int j=1;
j<=
col;
j++) {
1451 for (
int i=1;
i<=2*
row;
i++) {
1460 m->colskaldiv(
j,
g);
1468 for (
int i=1;
i<=
col;
i++) {
1482 for (
int j=1;
j<=
col;
j++) {
1492 number divisor =
m->get(
row+1, 1);
1502 number t =
get(1,1),
1505 for(
int i=2;
i<=
col;
i++) {
1525 number t1, t2, t3, t4;
1527 for (
int i=1;
i<=
row;
i++) {
1534 if ((
i+1)>>1<<1==(
i+1))
1556 for (
int i=1;
i<=
col;
i++) {
1557 temp =
m->get(
i,
i);
1611 int last_zero_col =
i-1;
1612 for (
int c =
cols(); c>0; c--) {
1618 addcol(last_zero_col, c, a,
R);
1620 for(
j = c-1;
j>last_zero_col;
j--) {
1627 number
gcd, co1, co2, co3, co4;
1635 swap(last_zero_col,
k);
1653 if (
k) last_zero_col--;
1684 number co1, co2, co3, co4;
1687 while ((
i>0) && (
j>0))
1697 for (
int l=1;
l<=
j-1;
l++)
1814 for (
int i=1;
i<=a->
rows();
i++)
1816 for (
int j=1;
j<=a->
cols();
j++)
1819 t2 =
f(t1, cold, cnew);
1846 C->
set(piv, piv,
p,
R);
1865 for (
int i=1;
i<=
row;
i++)
1867 for (
int j=1;
j<=
col;
j++)
1880 for (
int i=1;
i<=
row;
i++)
1893 for (
int i=1;
i<=
row;
i++)
1921 for (
int i=1;
i<=
row;
i++)
1923 for (
int j=1;
j<=
col;
j++)
1937 WerrorS(
"Error in bimMult. Coeffs do not agree!");
1940 if ((a->
rows() != c->
rows()) || (
b->cols() != c->
cols()) || (a->
cols() !=
b->rows()))
1942 WerrorS(
"Error in bimMult. Dimensions do not agree!");
1958 PrintS(
"reduce_mod_howell: A:\n");
1978 PrintS(
"\n****************************************\n");
1984 for(
int i=1;
i<=
b->cols();
i++)
1986 int A_col =
A->cols();
1988 for(
int j =
B->rows();
j>0;
j--)
1990 number Ai =
A->view(
A->rows() -
B->rows() +
j, A_col);
2008 number Bj =
B->view(
j, 1);
2009 number q =
n_Div(Bj, Ai,
R);
2010 x->rawset(
x->rows() -
B->rows() +
j,
i, q);
2011 for(
int k=
j;
k>
B->rows() -
A->rows();
k--)
2014 number
s =
n_Mult(q,
A->view(
A->rows() -
B->rows() +
k, A_col),
R);
2033 PrintS(
"\n****************************************\n");
2041 m->copySubmatInto(
A, 1, 1,
A->rows(),
A->cols(),
A->cols()+1, 1);
2043 for(
int i=1;
i<=
A->cols();
i++)
2056 for(
int i=1;
i<=
A->rows();
i++)
2058 for(
int j=1;
j<=
A->cols();
j++)
2077 number dz =
f(d,
Q, Z),
2087 PrintS(
"den increasing to ");
2098 PrintS(
"bimFarey worked\n");
2123 Hp->copySubmatInto(
m,
A->cols()+1, 1,
A->rows(),
A->cols(), 1, 1);
2125 Tp->copySubmatInto(
m, 1, 1,
A->cols(),
A->cols(), 1, 1);
2129 for(
i=1;
i<=
A->cols();
i++)
2131 for(
j=
m->rows();
j>
A->cols();
j--)
2135 if (
j>
A->cols())
break;
2155 x->skalmult(zero,
R);
2169 PrintS(
"no solution, since no modular solution\n");
2212 fps_p->extendCols(kp->
cols());
2327 for(
int i=1;
i<=
b->cols();
i++)
2329 int A_col =
A->cols();
2331 B->skalmult(
den,
R);
2332 for(
int j =
B->rows();
j>0;
j--)
2334 number Ai =
m->view(
m->rows()-
B->rows() +
j, A_col);
2356 number Bj =
B->view(
j, 1);
2365 number inc_d =
n_Div(Ai,
g,
R);
2367 x->skalmult(inc_d,
R);
2368 B->skalmult(inc_d,
R);
2372 x->rawset(
x->rows() -
B->rows() +
j,
i, xi);
2373 for(
int k=
j;
k>0;
k--)
2376 number
s =
n_Mult(xi,
m->view(
m->rows()-
B->rows() +
k, A_col),
R);
2398 T->copySubmatInto(
m, 1, 1,
A->cols(),
A->cols(), 1, 1);
2402 for(
i=1;
i<=
A->cols();
i++)
2404 for(
j=
m->rows();
j>
A->cols();
j--)
2408 if (
j>
A->cols())
break;
2410 Print(
"Found nullity (kern dim) of %d\n",
i-1);
2420 x->simplifyContentDen(&
den);
2434 PrintS(
"Solve Ax=b for A=\n");
2446 assume ((
x->cols() ==
b->cols()) && (
x->rows() ==
A->cols()) && (
A->rows() ==
b->rows()));
2463 WarnS(
"have field, should use Gauss or better");
2466 if (
R->cfXExtGcd &&
R->cfAnn)
2470 WerrorS(
"have no solve algorithm");
2522 for(
int i=0;
i<a->
cols();
i++)
2527 for (
int i=0;
i<a->
rows();
i++)
2533 for(
int i=0;
i<a->
cols();
i++)
2538 for(
int i=0;
i<a->
rows();
i++)
2547 Print(
"X: %ld\n", X);
2554 Print(
"\n2:X: %ld %ld %ld\n", X, *S, *
T);
2556 Print(
"\n2:x: %ld\n",
x);
2567 for(
int i=a->
rows(); diag &&
i>0;
i--)
2569 for(
int j=a->
cols();
j>0;
j--)
2579 PrintS(
"Diag ? %d\n", diag);
2626#define MIN(a,b) (a < b ? a : b)
2627 for(rg=0; rg<
MIN(
m->rows(),
m->cols()) && !
n_IsZero(
m->view(
m->rows()-rg,
m->cols()-rg), coe); rg++);
2630 for(
int i=0;
i<rg;
i++)
2632 number
A =
n_Ann(
m->view(
m->rows()-
i,
m->cols()-
i), coe);
2633 k->set(
m->cols()-
i,
i+1,
A);
2636 for(
int i=rg;
i<
m->cols();
i++)
2679 number
g =
get(1,1),
h;
static int si_min(const int a, const int b)
static void reduce_mod_howell(bigintmat *A, bigintmat *b, bigintmat *eps, bigintmat *x)
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.
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...
static number solveAx_dixon(bigintmat *A, bigintmat *B, bigintmat *x, bigintmat *kern)
bigintmat * bimChangeCoeff(bigintmat *a, coeffs cnew)
Liefert Kopier von Matrix a zurück, mit coeffs cnew statt den ursprünglichen.
bigintmat * bimCopy(const bigintmat *b)
same as copy constructor - apart from it being able to accept NULL as input
static bigintmat * prependIdentity(bigintmat *A)
bool nCoeffs_are_equal(coeffs r, coeffs s)
intvec * bim2iv(bigintmat *b)
bigintmat * bimMult(bigintmat *a, bigintmat *b)
static int intArrSum(int *a, int length)
bigintmat * bimSub(bigintmat *a, bigintmat *b)
static number solveAx_howell(bigintmat *A, bigintmat *b, bigintmat *x, bigintmat *kern)
void diagonalForm(bigintmat *A, bigintmat **S, bigintmat **T)
bigintmat * iv2bim(intvec *b, const coeffs C)
static int findLongest(int *a, int length)
static int getShorter(int *a, int l, int j, int cols, int rows)
static number bimFarey(bigintmat *A, number N, bigintmat *L)
bool operator!=(const bigintmat &lhr, const bigintmat &rhr)
static coeffs numbercoeffs(number n, coeffs c)
create Z/nA of type n_Zn
bigintmat * bimAdd(bigintmat *a, bigintmat *b)
Matrix-Add/-Sub/-Mult so oder mit operator+/-/* ? @Note: NULL as a result means an error (non-compati...
bool operator==(const bigintmat &lhr, const bigintmat &rhr)
#define BIMATELEM(M, I, J)
const CanonicalForm CFMap CFMap & N
void Print()
IO: simply prints the matrix to the current output (screen?)
void colskaldiv(int j, number b)
Macht Ganzzahldivision aller j-ten Spalteneinträge mit b.
number det()
det (via LaPlace in general, hnf for euc. rings)
void splitrow(bigintmat *a, bigintmat *b)
Speichert in Matrix a den oberen, in b den unteren Teil der Matrix, vorausgesetzt die Dimensionen sti...
int isOne()
is matrix is identity
void zero()
Setzt alle Einträge auf 0.
void appendCol(bigintmat *a)
horizontally join the matrices, m <- m|a
number trace()
the trace ....
bool addrow(int i, int j, number a, coeffs c)
... Zeile ...
void swap(int i, int j)
swap columns i and j
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)
bool addcol(int i, int j, number a, coeffs c)
addiert a-faches der j-ten Spalte zur i-ten dazu
void hnf()
transforms INPLACE to HNF
char * StringAsPrinted()
Returns a string as it would have been printed in the interpreter.
void swapMatrix(bigintmat *a)
number hnfdet()
det via HNF Primzahlen als long long int, müssen noch in number umgewandelt werden?
int findnonzero(int i)
find index of 1st non-zero entry in row i
bigintmat * modhnf(number p, coeffs c)
computes HNF(this | p*I)
void setcol(int j, bigintmat *m)
Setzt j-te Spalte gleich übergebenem Vektor (Matrix) m.
bool add(bigintmat *b)
Addiert zur Matrix die Matrix b dazu. Return false => an error occurred.
void inpMult(number bintop, const coeffs C=NULL)
inplace version of skalar mult. CHANGES input.
void setrow(int i, bigintmat *m)
Setzt i-te Zeile gleich übergebenem Vektor (Matrix) m.
void Write()
IO: writes the matrix into the current internal string buffer which must be started/ allocated before...
void rowskalmult(int i, number a, coeffs c)
... Zeile ...
bool skalmult(number b, coeffs c)
Multipliziert zur Matrix den Skalar b hinzu.
void simplifyContentDen(number *den)
ensures that Gcd(den, content)=1 enden hier wieder
void extendCols(int i)
append i zero-columns to the matrix
void splitcol(bigintmat *a, bigintmat *b)
... linken ... rechten ...
number content()
the content, the gcd of all entries. Only makes sense for Euclidean rings (or possibly constructive P...
void skaldiv(number b)
Macht Ganzzahldivision aller Matrixeinträge mit b.
void colskalmult(int i, number a, coeffs c)
Multipliziert zur i-ten Spalte den Skalar a hinzu.
bool copy(bigintmat *b)
Kopiert Einträge von b auf Bigintmat.
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
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.
number pseudoinv(bigintmat *a)
Speichert in Matrix a die Pseudoinverse, liefert den Nenner zurück.
number get(int i, int j) const
get a copy of an entry. NOTE: starts at [1,1]
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 concatcol(bigintmat *a, bigintmat *b)
int findcolnonzero(int j)
find index of 1st non-zero entry in column j
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....
number view(int i, int j) const
view an entry an entry. NOTE: starts at [1,1]
void inpTranspose()
transpose in place
void one()
Macht Matrix (Falls quadratisch) zu Einheitsmatrix.
void howell()
dito, but Howell form (only different for zero-divsors)
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_...
void operator*=(int intop)
UEberladener *=-Operator (fuer int und bigint) Frage hier: *= verwenden oder lieber = und * einzeln?...
coeffs basecoeffs() const
void getrow(int i, bigintmat *a)
Schreibt i-te Zeile in Vektor (Matrix) a.
void concatrow(bigintmat *a, bigintmat *b)
Fügt zwei Matrixen untereinander/nebeneinander in gegebene Matrix ein, bzw spaltet gegebenen Matrix a...
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]
bigintmat * elim(int i, int j)
Liefert Streichungsmatrix (i-te Zeile und j-te Spalte gestrichen) zurück.
int compare(const bigintmat *op) const
bool sub(bigintmat *b)
Subtrahiert ...
char * String()
IO: String returns a singular string containing the matrix, needs freeing afterwards.
void swaprow(int i, int j)
swap rows i and j
void mod(number p)
Reduziert komplette Matrix modulo p.
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 FORCE_INLINE void number2mpz(number n, coeffs c, mpz_t m)
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 ....
static FORCE_INLINE number n_Copy(number n, const coeffs r)
return a copy of 'n'
static FORCE_INLINE number n_Add(number a, number b, const coeffs r)
return the sum of 'a' and 'b', i.e., a+b
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)
@ n_Q
rational (GMP) numbers
@ n_Znm
only used if HAVE_RINGS is defined
@ n_algExt
used for all algebraic extensions, i.e., the top-most extension in an extension tower is algebraic
@ n_Zn
only used if HAVE_RINGS is defined
@ n_Z2m
only used if HAVE_RINGS is defined
@ n_transExt
used for all transcendental extensions, i.e., the top-most extension in an extension tower is transce...
@ n_Z
only used if HAVE_RINGS is defined
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,...
static FORCE_INLINE number n_QuotRem(number a, number b, number *q, const coeffs r)
static FORCE_INLINE char * nCoeffString(const coeffs cf)
TODO: make it a virtual method of coeffs, together with: Decompose & Compose, rParameter & rPar.
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),...
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 n_Print(number &a, const coeffs r)
print a number (BEWARE of string buffers!) mostly for debugging
static FORCE_INLINE nMapFunc n_SetMap(const coeffs src, const coeffs dst)
set the mapping function pointers for translating numbers from src to dst
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)
static FORCE_INLINE number n_Farey(number a, number b, const coeffs r)
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 nInitChar(n_coeffType t, void *parameter)
one-time initialisations for new coeffs in case of an error return NULL
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 FORCE_INLINE BOOLEAN n_IsZero(number n, const coeffs r)
TRUE iff 'n' represents the zero element.
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_Sub(number a, number b, const coeffs r)
return the difference of 'a' and 'b', i.e., a-b
static FORCE_INLINE n_coeffType getCoeffType(const coeffs r)
Returns the type of coeffs domain.
static FORCE_INLINE void n_Delete(number *p, const coeffs r)
delete 'p'
static FORCE_INLINE void n_Write(number n, const coeffs r, const BOOLEAN bShortOut=TRUE)
static FORCE_INLINE number n_Init(long i, const coeffs r)
a number representing i in the given coeff field/ring r
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,...
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_Equal(number a, number b, const coeffs r)
TRUE iff 'a' and 'b' represent the same number; they may have different representations.
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)
number(* nMapFunc)(number a, const coeffs src, const coeffs dst)
maps "a", which lives in src, into dst
void nKillChar(coeffs r)
undo all initialisations
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 BOOLEAN n_IsOne(number n, const coeffs r)
TRUE iff 'n' represents the one element.
static FORCE_INLINE number n_XExtGcd(number a, number b, number *s, number *t, number *u, number *v, const coeffs r)
const CanonicalForm int s
const CanonicalForm int const CFList const Variable & y
static int min(int a, int b)
void WerrorS(const char *s)
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)
static BOOLEAN length(leftv result, leftv arg)
int lcm(unsigned long *l, unsigned long *a, unsigned long *b, unsigned long p, int dega, int degb)
The main handler for Singular numbers which are suitable for Singular polynomials.
const signed long floor(const ampf< Precision > &x)
const ampf< Precision > log10(const ampf< Precision > &x)
static int index(p_Length length, p_Ord ord)
void StringSetS(const char *st)
void StringAppendS(const char *st)
void PrintS(const char *s)
void Werror(const char *fmt,...)