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++)
561 min = floor(log10((
double)cols))+floor(log10((
double)rows))+5;
570 min = floor(log10((
double)cols))+floor(log10((
double)rows))+5;
582 int const c = (
col-1)+1;
593 const int _nl = strlen(tmp);
595 if (_nl > cwv[
j]) cwv[
j]=_nl;
616 int * colwid =
getwid(maxwid);
620 slength += colwid[
j]*
row;
622 ps = (
char*)
omAlloc0(
sizeof(
char)*(slength));
629 const int _nl = strlen(ts);
631 if (_nl > colwid[cj])
637 int phl = strlen(ph);
638 if (phl > colwid[cj])
640 for (
int j=0;
j<colwid[cj]-1;
j++)
642 ps[pos+colwid[cj]-1] =
'*';
646 for (
int j=0;
j<colwid[cj]-phl;
j++)
648 for (
int j=0;
j<phl;
j++)
649 ps[pos+colwid[cj]-phl+
j] = ph[
j];
655 for (
int j=0;
j<colwid[cj]-_nl;
j++)
657 for (
int j=0;
j<_nl;
j++)
658 ps[pos+colwid[cj]-_nl+
j] = ts[
j];
665 ps[pos+colwid[cj]] =
',';
666 ps[pos+colwid[cj]+1] =
'\n';
672 ps[pos+colwid[cj]] =
',';
687 if ((
i <=
col) && (
j <=
col) && (
i>0) && (
j>0))
691 for (
int k=1;
k<=
row;
k++)
706 if ((
i <=
row) && (
j <=
row) && (
i>0) && (
j>0))
710 for (
int k=1;
k<=
col;
k++)
725 for (
int j=1;
j<=
col;
j++)
737 for (
int i=
row;
i>=1;
i--)
753 WerrorS(
"Error in getcol. Dimensions must agree!");
781 for(
int ii=0; ii< no; ii++)
793 if ((
i>
row) || (
i<1))
795 WerrorS(
"Error in getrow: Index out of range!");
800 WerrorS(
"Error in getrow. Dimensions must agree!");
828 if ((
j>
col) || (
j<1))
830 WerrorS(
"Error in setcol: Index out of range!");
833 if (((
m->rows() !=
row) || (
m->cols() != 1)) && ((
m->rows() != 1) || (
m->cols() !=
row)))
835 WerrorS(
"Error in setcol. Dimensions must agree!");
842 for (
int i=1;
i<=
row;
i++)
853 for (
int i=1;
i<=
row;
i++)
862 if ((
j>
row) || (
j<1))
864 WerrorS(
"Error in setrow: Index out of range!");
867 if (((
m->rows() != 1) || (
m->cols() !=
col)) && ((
m->rows() !=
col) || (
m->cols() != 1)))
869 WerrorS(
"Error in setrow. Dimensions must agree!");
876 for (
int i=1;
i<=
col;
i++)
887 for (
int i=1;
i<=
col;
i++)
896 if ((
b->rows() !=
row) || (
b->cols() !=
col))
898 WerrorS(
"Error in bigintmat::add. Dimensions do not agree!");
903 WerrorS(
"Error in bigintmat::add. coeffs do not agree!");
906 for (
int i=1;
i<=
row;
i++)
908 for (
int j=1;
j<=
col;
j++)
918 if ((
b->rows() !=
row) || (
b->cols() !=
col))
920 WerrorS(
"Error in bigintmat::sub. Dimensions do not agree!");
925 WerrorS(
"Error in bigintmat::sub. coeffs do not agree!");
928 for (
int i=1;
i<=
row;
i++)
930 for (
int j=1;
j<=
col;
j++)
947 for (
int i=1;
i<=
row;
i++)
949 for (
int j=1;
j<=
col;
j++)
963 WerrorS(
"Error in addcol: Index out of range!");
968 WerrorS(
"Error in addcol: coeffs do not agree!");
972 for (
int k=1;
k<=
row;
k++)
987 WerrorS(
"Error in addrow: Index out of range!");
992 WerrorS(
"Error in addrow: coeffs do not agree!");
996 for (
int k=1;
k<=
col;
k++)
1012 for (
int j=1;
j<=
row;
j++)
1020 WerrorS(
"Error in colskalmult");
1028 for (
int j=1;
j<=
col;
j++)
1036 WerrorS(
"Error in rowskalmult");
1046 if (!((
col == ay) && (
col == by) && (ax+bx ==
row)))
1048 WerrorS(
"Error in concatrow. Dimensions must agree!");
1053 WerrorS(
"Error in concatrow. coeffs do not agree!");
1056 for (
int i=1;
i<=ax;
i++)
1058 for (
int j=1;
j<=ay;
j++)
1065 for (
int i=1;
i<=bx;
i++)
1067 for (
int j=1;
j<=by;
j++)
1109 for (
int i=1;
i<=ax;
i++)
1111 for (
int j=1;
j<=ay;
j++)
1117 for (
int i=1;
i<=bx;
i++)
1119 for (
int j=1;
j<=by;
j++)
1134 if (!(ax + bx ==
row))
1136 WerrorS(
"Error in splitrow. Dimensions must agree!");
1138 else if (!((
col == ay) && (
col == by)))
1140 WerrorS(
"Error in splitrow. Dimensions must agree!");
1144 WerrorS(
"Error in splitrow. coeffs do not agree!");
1148 for(
int i = 1;
i<=ax;
i++)
1150 for(
int j = 1;
j<=ay;
j++)
1157 for (
int i =1;
i<=bx;
i++)
1176 if (!((
row == ax) && (
row == bx)))
1178 WerrorS(
"Error in splitcol. Dimensions must agree!");
1180 else if (!(ay+by ==
col))
1182 WerrorS(
"Error in splitcol. Dimensions must agree!");
1186 WerrorS(
"Error in splitcol. coeffs do not agree!");
1190 for (
int i=1;
i<=ax;
i++)
1192 for (
int j=1;
j<=ay;
j++)
1198 for (
int i=1;
i<=bx;
i++)
1200 for (
int j=1;
j<=by;
j++)
1214 WerrorS(
"Error in splitcol. Dimensions must agree!");
1219 WerrorS(
"Error in splitcol. coeffs do not agree!");
1222 int width = a->
cols();
1223 for (
int j=1;
j<=width;
j++)
1225 for (
int k=1;
k<=
row;
k++)
1239 WerrorS(
"Error in Marco-splitrow");
1245 WerrorS(
"Error in splitrow. coeffs do not agree!");
1248 int height = a->
rows();
1249 for (
int j=1;
j<=height;
j++)
1251 for (
int k=1;
k<=
col;
k++)
1261 if ((
b->rows() !=
row) || (
b->cols() !=
col))
1263 WerrorS(
"Error in bigintmat::copy. Dimensions do not agree!");
1268 WerrorS(
"Error in bigintmat::copy. coeffs do not agree!");
1272 for (
int i=1;
i<=
row;
i++)
1274 for (
int j=1;
j<=
col;
j++)
1290 for (
int i=1;
i<=n;
i++)
1292 for (
int j=1;
j<=
m;
j++)
1294 t1 =
B->view(a+
i-1,
b+
j-1);
1295 set(c+
i-1, d+
j-1, t1);
1305 for (
int i=1;
i<=
row;
i++)
1307 for (
int j=1;
j<=
col;
j++)
1331 for (
int i=1;
i<=
row;
i++)
1333 for (
int j=1;
j<=
col;
j++)
1353 for (
int i=1;
i<=
row;
i++)
1355 for (
int j=1;
j<=
col;
j++)
1365 for (
int i=1;
i<=
row;
i++) {
1366 for (
int j=1;
j<=
col;
j++) {
1390 for (
int k=1;
k<=
row;
k++) {
1394 for (
int l=1;
l<=
col;
l++)
1420 number
det = this->
det();
1427 m->concatrow(a,
this);
1433 for (
int i=1;
i<=
col;
i++) {
1435 for (
int j=
i+1;
j<=
col;
j++) {
1448 for (
int j=1;
j<=
col;
j++) {
1450 for (
int i=1;
i<=2*
row;
i++) {
1459 m->colskaldiv(
j,
g);
1467 for (
int i=1;
i<=
col;
i++) {
1481 for (
int j=1;
j<=
col;
j++) {
1491 number divisor =
m->get(
row+1, 1);
1501 number t =
get(1,1),
1504 for(
int i=2;
i<=
col;
i++) {
1524 number t1, t2, t3, t4;
1526 for (
int i=1;
i<=
row;
i++) {
1533 if ((
i+1)>>1<<1==(
i+1))
1555 for (
int i=1;
i<=
col;
i++) {
1556 temp =
m->get(
i,
i);
1610 int last_zero_col =
i-1;
1611 for (
int c =
cols(); c>0; c--) {
1617 addcol(last_zero_col, c, a,
R);
1619 for(
j = c-1;
j>last_zero_col;
j--) {
1626 number
gcd, co1, co2, co3, co4;
1634 swap(last_zero_col,
k);
1652 if (
k) last_zero_col--;
1683 number co1, co2, co3, co4;
1686 while ((
i>0) && (
j>0))
1696 for (
int l=1;
l<=
j-1;
l++)
1813 for (
int i=1;
i<=a->
rows();
i++)
1815 for (
int j=1;
j<=a->
cols();
j++)
1818 t2 =
f(t1, cold, cnew);
1845 C->
set(piv, piv,
p,
R);
1864 for (
int i=1;
i<=
row;
i++)
1866 for (
int j=1;
j<=
col;
j++)
1879 for (
int i=1;
i<=
row;
i++)
1892 for (
int i=1;
i<=
row;
i++)
1920 for (
int i=1;
i<=
row;
i++)
1922 for (
int j=1;
j<=
col;
j++)
1936 WerrorS(
"Error in bimMult. Coeffs do not agree!");
1939 if ((a->
rows() != c->
rows()) || (
b->cols() != c->
cols()) || (a->
cols() !=
b->rows()))
1941 WerrorS(
"Error in bimMult. Dimensions do not agree!");
1957 PrintS(
"reduce_mod_howell: A:\n");
1977 PrintS(
"\n****************************************\n");
1983 for(
int i=1;
i<=
b->cols();
i++)
1985 int A_col =
A->cols();
1987 for(
int j =
B->rows();
j>0;
j--)
1989 number Ai =
A->view(
A->rows() -
B->rows() +
j, A_col);
2007 number Bj =
B->view(
j, 1);
2008 number q =
n_Div(Bj, Ai,
R);
2009 x->rawset(
x->rows() -
B->rows() +
j,
i, q);
2010 for(
int k=
j;
k>
B->rows() -
A->rows();
k--)
2013 number
s =
n_Mult(q,
A->view(
A->rows() -
B->rows() +
k, A_col),
R);
2032 PrintS(
"\n****************************************\n");
2040 m->copySubmatInto(
A, 1, 1,
A->rows(),
A->cols(),
A->cols()+1, 1);
2042 for(
int i=1;
i<=
A->cols();
i++)
2055 for(
int i=1;
i<=
A->rows();
i++)
2057 for(
int j=1;
j<=
A->cols();
j++)
2076 number dz =
f(d,
Q, Z),
2086 PrintS(
"den increasing to ");
2097 PrintS(
"bimFarey worked\n");
2122 Hp->copySubmatInto(
m,
A->cols()+1, 1,
A->rows(),
A->cols(), 1, 1);
2124 Tp->copySubmatInto(
m, 1, 1,
A->cols(),
A->cols(), 1, 1);
2128 for(
i=1;
i<=
A->cols();
i++)
2130 for(
j=
m->rows();
j>
A->cols();
j--)
2134 if (
j>
A->cols())
break;
2154 x->skalmult(zero,
R);
2168 PrintS(
"no solution, since no modular solution\n");
2211 fps_p->extendCols(kp->
cols());
2326 for(
int i=1;
i<=
b->cols();
i++)
2328 int A_col =
A->cols();
2330 B->skalmult(
den,
R);
2331 for(
int j =
B->rows();
j>0;
j--)
2333 number Ai =
m->view(
m->rows()-
B->rows() +
j, A_col);
2355 number Bj =
B->view(
j, 1);
2364 number inc_d =
n_Div(Ai,
g,
R);
2366 x->skalmult(inc_d,
R);
2367 B->skalmult(inc_d,
R);
2371 x->rawset(
x->rows() -
B->rows() +
j,
i, xi);
2372 for(
int k=
j;
k>0;
k--)
2375 number
s =
n_Mult(xi,
m->view(
m->rows()-
B->rows() +
k, A_col),
R);
2397 T->copySubmatInto(
m, 1, 1,
A->cols(),
A->cols(), 1, 1);
2401 for(
i=1;
i<=
A->cols();
i++)
2403 for(
j=
m->rows();
j>
A->cols();
j--)
2407 if (
j>
A->cols())
break;
2409 Print(
"Found nullity (kern dim) of %d\n",
i-1);
2419 x->simplifyContentDen(&
den);
2433 PrintS(
"Solve Ax=b for A=\n");
2445 assume ((
x->cols() ==
b->cols()) && (
x->rows() ==
A->cols()) && (
A->rows() ==
b->rows()));
2462 WarnS(
"have field, should use Gauss or better");
2465 if (
R->cfXExtGcd &&
R->cfAnn)
2469 WerrorS(
"have no solve algorithm");
2521 for(
int i=0;
i<a->
cols();
i++)
2526 for (
int i=0;
i<a->
rows();
i++)
2532 for(
int i=0;
i<a->
cols();
i++)
2537 for(
int i=0;
i<a->
rows();
i++)
2546 Print(
"X: %ld\n", X);
2553 Print(
"\n2:X: %ld %ld %ld\n", X, *S, *
T);
2555 Print(
"\n2:x: %ld\n",
x);
2566 for(
int i=a->
rows(); diag &&
i>0;
i--)
2568 for(
int j=a->
cols();
j>0;
j--)
2578 PrintS(
"Diag ? %d\n", diag);
2625#define MIN(a,b) (a < b ? a : b)
2626 for(rg=0; rg<
MIN(
m->rows(),
m->cols()) && !
n_IsZero(
m->view(
m->rows()-rg,
m->cols()-rg), coe); rg++);
2629 for(
int i=0;
i<rg;
i++)
2631 number
A =
n_Ann(
m->view(
m->rows()-
i,
m->cols()-
i), coe);
2632 k->set(
m->cols()-
i,
i+1,
A);
2635 for(
int i=rg;
i<
m->cols();
i++)
2678 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)
bigintmat * bimChangeCoeff(bigintmat *a, coeffs cnew)
Liefert Kopier von Matrix a zurück, mit coeffs cnew statt den ursprünglichen.
bool nCoeffs_are_equal(coeffs r, coeffs s)
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.
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,...)