56 int __i = (_i), __j=(_j); \
61 for (
int i=0;
i< nm;
i++)
62 for (
int j=
i+1;
j< nm;
j++)
67 for (
int i=nm;
i<
m;
i++)
68 for(
int j=0;
j<n;
j++)
73 for (
int i=nm;
i<n;
i++)
74 for(
int j=0;
j<
m;
j++)
149 for (
int i=0;
i <
l;
i++)
159 if (&lhr == &rhr) {
return true; }
160 if (lhr.
cols() != rhr.
cols()) {
return false; }
161 if (lhr.
rows() != rhr.
rows()) {
return false; }
166 for (
int i=0;
i <
l;
i++)
203 number bb=
n_Init(
b,basecoeffs);
209 for (
i=1;
i<=mn;
i++)
239 number bb=
n_Init(
b,basecoeffs);
245 for (
i=1;
i<=mn;
i++)
255 const int ca = a->
cols();
256 const int cb =
b->cols();
258 const int ra = a->
rows();
259 const int rb =
b->rows();
264 Werror(
"wrong bigintmat sizes at multiplication a * b: acols: %d != brows: %d\n", ca, rb);
281 for (
i=1;
i<=ra;
i++)
282 for (
j=1;
j<=cb;
j++)
284 sum =
n_Init(0, basecoeffs);
286 for (
k=1;
k<=ca;
k++)
305 number bb=
n_Init(
b,basecoeffs);
342 for (
int i=0;
i<(
b->rows())*(
b->cols());
i++)
343 (*iv)[
i] =
n_Int((*
b)[
i],
b->basecoeffs());
349 const int l = (
b->rows())*(
b->cols());
352 for (
int i=0;
i <
l;
i++)
366 WerrorS(
"wrong bigintmat comparison: different basecoeffs!\n");
369 if ((
col!=1) ||(op->
cols()!=1))
415 for(
int i=1;
i<=
m;
i++)
417 for(
int j=1;
j< n;
j++)
451 int * colwid =
getwid(80);
454 WerrorS(
"not enough space to print bigintmat");
455 WerrorS(
"try string(...) for a unformatted output");
461 slength += colwid[
j]*
row;
463 ps = (
char*)
omAlloc0(
sizeof(
char)*(slength));
470 const int _nl = strlen(ts);
472 if (_nl > colwid[cj])
478 int phl = strlen(ph);
479 if (phl > colwid[cj])
481 for (
int j=0;
j<colwid[cj]-1;
j++)
483 ps[pos+colwid[cj]-1] =
'*';
487 for (
int j=0;
j<colwid[cj]-phl;
j++)
489 for (
int j=0;
j<phl;
j++)
490 ps[pos+colwid[cj]-phl+
j] = ph[
j];
496 for (
int j=0;
j<(colwid[cj]-_nl);
j++)
498 for (
int j=0;
j<_nl;
j++)
499 ps[pos+colwid[cj]-_nl+
j] = ts[
j];
506 ps[pos+colwid[cj]] =
',';
507 ps[pos+colwid[cj]+1] =
'\n';
513 ps[pos+colwid[cj]] =
',';
550 for (
int i=0;
i<rows;
i++)
555 min = floor(log10((
double)cols))+floor(log10((
double)rows))+5;
564 min = floor(log10((
double)cols))+floor(log10((
double)rows))+5;
576 int const c = (
col-1)+1;
587 const int _nl = strlen(tmp);
589 if (_nl > cwv[
j]) cwv[
j]=_nl;
610 int * colwid =
getwid(maxwid);
614 slength += colwid[
j]*
row;
616 ps = (
char*)
omAlloc0(
sizeof(
char)*(slength));
623 const int _nl = strlen(ts);
625 if (_nl > colwid[cj])
631 int phl = strlen(ph);
632 if (phl > colwid[cj])
634 for (
int j=0;
j<colwid[cj]-1;
j++)
636 ps[pos+colwid[cj]-1] =
'*';
640 for (
int j=0;
j<colwid[cj]-phl;
j++)
642 for (
int j=0;
j<phl;
j++)
643 ps[pos+colwid[cj]-phl+
j] = ph[
j];
649 for (
int j=0;
j<colwid[cj]-_nl;
j++)
651 for (
int j=0;
j<_nl;
j++)
652 ps[pos+colwid[cj]-_nl+
j] = ts[
j];
659 ps[pos+colwid[cj]] =
',';
660 ps[pos+colwid[cj]+1] =
'\n';
666 ps[pos+colwid[cj]] =
',';
682 if ((
i <=
col) && (
j <=
col) && (
i>0) && (
j>0))
686 for (
int k=1;
k<=
row;
k++)
701 if ((
i <=
row) && (
j <=
row) && (
i>0) && (
j>0))
705 for (
int k=1;
k<=
col;
k++)
720 for (
int j=1;
j<=
col;
j++)
732 for (
int i=
row;
i>=1;
i--)
748 WerrorS(
"Error in getcol. Dimensions must agree!");
776 for(
int ii=0; ii< no; ii++)
788 if ((
i>
row) || (
i<1))
790 WerrorS(
"Error in getrow: Index out of range!");
795 WerrorS(
"Error in getrow. Dimensions must agree!");
823 if ((
j>
col) || (
j<1))
825 WerrorS(
"Error in setcol: Index out of range!");
828 if (((
m->rows() !=
row) || (
m->cols() != 1)) && ((
m->rows() != 1) || (
m->cols() !=
row)))
830 WerrorS(
"Error in setcol. Dimensions must agree!");
837 for (
int i=1;
i<=
row;
i++)
848 for (
int i=1;
i<=
row;
i++)
857 if ((
j>
row) || (
j<1))
859 WerrorS(
"Error in setrow: Index out of range!");
862 if (((
m->rows() != 1) || (
m->cols() !=
col)) && ((
m->rows() !=
col) || (
m->cols() != 1)))
864 WerrorS(
"Error in setrow. Dimensions must agree!");
871 for (
int i=1;
i<=
col;
i++)
882 for (
int i=1;
i<=
col;
i++)
891 if ((
b->rows() !=
row) || (
b->cols() !=
col))
893 WerrorS(
"Error in bigintmat::add. Dimensions do not agree!");
898 WerrorS(
"Error in bigintmat::add. coeffs do not agree!");
901 for (
int i=1;
i<=
row;
i++)
903 for (
int j=1;
j<=
col;
j++)
913 if ((
b->rows() !=
row) || (
b->cols() !=
col))
915 WerrorS(
"Error in bigintmat::sub. Dimensions do not agree!");
920 WerrorS(
"Error in bigintmat::sub. coeffs do not agree!");
923 for (
int i=1;
i<=
row;
i++)
925 for (
int j=1;
j<=
col;
j++)
942 for (
int i=1;
i<=
row;
i++)
944 for (
int j=1;
j<=
col;
j++)
958 WerrorS(
"Error in addcol: Index out of range!");
963 WerrorS(
"Error in addcol: coeffs do not agree!");
967 for (
int k=1;
k<=
row;
k++)
982 WerrorS(
"Error in addrow: Index out of range!");
987 WerrorS(
"Error in addrow: coeffs do not agree!");
991 for (
int k=1;
k<=
col;
k++)
1007 for (
int j=1;
j<=
row;
j++)
1015 WerrorS(
"Error in colskalmult");
1023 for (
int j=1;
j<=
col;
j++)
1031 WerrorS(
"Error in rowskalmult");
1041 if (!((
col == ay) && (
col == by) && (ax+bx ==
row)))
1043 WerrorS(
"Error in concatrow. Dimensions must agree!");
1048 WerrorS(
"Error in concatrow. coeffs do not agree!");
1051 for (
int i=1;
i<=ax;
i++)
1053 for (
int j=1;
j<=ay;
j++)
1060 for (
int i=1;
i<=bx;
i++)
1062 for (
int j=1;
j<=by;
j++)
1104 for (
int i=1;
i<=ax;
i++)
1106 for (
int j=1;
j<=ay;
j++)
1112 for (
int i=1;
i<=bx;
i++)
1114 for (
int j=1;
j<=by;
j++)
1129 if (!(ax + bx ==
row))
1131 WerrorS(
"Error in splitrow. Dimensions must agree!");
1133 else if (!((
col == ay) && (
col == by)))
1135 WerrorS(
"Error in splitrow. Dimensions must agree!");
1139 WerrorS(
"Error in splitrow. coeffs do not agree!");
1143 for(
int i = 1;
i<=ax;
i++)
1145 for(
int j = 1;
j<=ay;
j++)
1152 for (
int i =1;
i<=bx;
i++)
1171 if (!((
row == ax) && (
row == bx)))
1173 WerrorS(
"Error in splitcol. Dimensions must agree!");
1175 else if (!(ay+by ==
col))
1177 WerrorS(
"Error in splitcol. Dimensions must agree!");
1181 WerrorS(
"Error in splitcol. coeffs do not agree!");
1185 for (
int i=1;
i<=ax;
i++)
1187 for (
int j=1;
j<=ay;
j++)
1193 for (
int i=1;
i<=bx;
i++)
1195 for (
int j=1;
j<=by;
j++)
1209 WerrorS(
"Error in splitcol. Dimensions must agree!");
1214 WerrorS(
"Error in splitcol. coeffs do not agree!");
1217 int width = a->
cols();
1218 for (
int j=1;
j<=width;
j++)
1220 for (
int k=1;
k<=
row;
k++)
1234 WerrorS(
"Error in Marco-splitrow");
1240 WerrorS(
"Error in splitrow. coeffs do not agree!");
1243 int height = a->
rows();
1244 for (
int j=1;
j<=height;
j++)
1246 for (
int k=1;
k<=
col;
k++)
1256 if ((
b->rows() !=
row) || (
b->cols() !=
col))
1258 WerrorS(
"Error in bigintmat::copy. Dimensions do not agree!");
1263 WerrorS(
"Error in bigintmat::copy. coeffs do not agree!");
1267 for (
int i=1;
i<=
row;
i++)
1269 for (
int j=1;
j<=
col;
j++)
1285 for (
int i=1;
i<=n;
i++)
1287 for (
int j=1;
j<=
m;
j++)
1289 t1 =
B->view(a+
i-1,
b+
j-1);
1290 set(c+
i-1, d+
j-1, t1);
1300 for (
int i=1;
i<=
row;
i++)
1302 for (
int j=1;
j<=
col;
j++)
1326 for (
int i=1;
i<=
row;
i++)
1328 for (
int j=1;
j<=
col;
j++)
1348 for (
int i=1;
i<=
row;
i++)
1350 for (
int j=1;
j<=
col;
j++)
1360 for (
int i=1;
i<=
row;
i++) {
1361 for (
int j=1;
j<=
col;
j++) {
1385 for (
int k=1;
k<=
row;
k++) {
1389 for (
int l=1;
l<=
col;
l++)
1415 number
det = this->
det();
1422 m->concatrow(a,
this);
1428 for (
int i=1;
i<=
col;
i++) {
1430 for (
int j=
i+1;
j<=
col;
j++) {
1443 for (
int j=1;
j<=
col;
j++) {
1445 for (
int i=1;
i<=2*
row;
i++) {
1454 m->colskaldiv(
j,
g);
1462 for (
int i=1;
i<=
col;
i++) {
1476 for (
int j=1;
j<=
col;
j++) {
1486 number divisor =
m->get(
row+1, 1);
1496 number t =
get(1,1),
1499 for(
int i=2;
i<=
col;
i++) {
1519 number t1, t2, t3, t4;
1521 for (
int i=1;
i<=
row;
i++) {
1528 if ((
i+1)>>1<<1==(
i+1))
1550 for (
int i=1;
i<=
col;
i++) {
1551 temp =
m->get(
i,
i);
1605 int last_zero_col =
i-1;
1606 for (
int c =
cols(); c>0; c--) {
1612 addcol(last_zero_col, c, a,
R);
1614 for(
j = c-1;
j>last_zero_col;
j--) {
1621 number
gcd, co1, co2, co3, co4;
1629 swap(last_zero_col,
k);
1647 if (
k) last_zero_col--;
1678 number co1, co2, co3, co4;
1681 while ((
i>0) && (
j>0))
1691 for (
int l=1;
l<=
j-1;
l++)
1806 for (
int i=1;
i<=a->
rows();
i++)
1808 for (
int j=1;
j<=a->
cols();
j++)
1811 t2 =
f(t1, cold, cnew);
1837 C->
set(piv, piv,
p,
R);
1854 for (
int i=1;
i<=
row;
i++)
1856 for (
int j=1;
j<=
col;
j++)
1869 for (
int i=1;
i<=
row;
i++)
1882 for (
int i=1;
i<=
row;
i++)
1910 for (
int i=1;
i<=
row;
i++)
1912 for (
int j=1;
j<=
col;
j++)
1926 WerrorS(
"Error in bimMult. Coeffs do not agree!");
1929 if ((a->
rows() != c->
rows()) || (
b->cols() != c->
cols()) || (a->
cols() !=
b->rows()))
1931 WerrorS(
"Error in bimMult. Dimensions do not agree!");
1947 PrintS(
"reduce_mod_howell: A:\n");
1967 PrintS(
"\n****************************************\n");
1973 for(
int i=1;
i<=
b->cols();
i++)
1975 int A_col =
A->cols();
1977 for(
int j =
B->rows();
j>0;
j--)
1979 number Ai =
A->view(
A->rows() -
B->rows() +
j, A_col);
1997 number Bj =
B->view(
j, 1);
1998 number q =
n_Div(Bj, Ai,
R);
1999 x->rawset(
x->rows() -
B->rows() +
j,
i, q);
2000 for(
int k=
j;
k>
B->rows() -
A->rows();
k--)
2003 number
s =
n_Mult(q,
A->view(
A->rows() -
B->rows() +
k, A_col),
R);
2022 PrintS(
"\n****************************************\n");
2030 m->copySubmatInto(
A, 1, 1,
A->rows(),
A->cols(),
A->cols()+1, 1);
2032 for(
int i=1;
i<=
A->cols();
i++)
2045 for(
int i=1;
i<=
A->rows();
i++)
2047 for(
int j=1;
j<=
A->cols();
j++)
2066 number dz =
f(d,
Q, Z),
2076 PrintS(
"den increasing to ");
2087 PrintS(
"bimFarey worked\n");
2111 Hp->copySubmatInto(
m,
A->cols()+1, 1,
A->rows(),
A->cols(), 1, 1);
2113 Tp->copySubmatInto(
m, 1, 1,
A->cols(),
A->cols(), 1, 1);
2117 for(
i=1;
i<=
A->cols();
i++)
2119 for(
j=
m->rows();
j>
A->cols();
j--)
2123 if (
j>
A->cols())
break;
2143 x->skalmult(zero,
R);
2157 PrintS(
"no solution, since no modular solution\n");
2200 fps_p->extendCols(kp->
cols());
2314 for(
int i=1;
i<=
b->cols();
i++)
2316 int A_col =
A->cols();
2318 B->skalmult(
den,
R);
2319 for(
int j =
B->rows();
j>0;
j--)
2321 number Ai =
m->view(
m->rows()-
B->rows() +
j, A_col);
2343 number Bj =
B->view(
j, 1);
2352 number inc_d =
n_Div(Ai,
g,
R);
2354 x->skalmult(inc_d,
R);
2355 B->skalmult(inc_d,
R);
2359 x->rawset(
x->rows() -
B->rows() +
j,
i, xi);
2360 for(
int k=
j;
k>0;
k--)
2363 number
s =
n_Mult(xi,
m->view(
m->rows()-
B->rows() +
k, A_col),
R);
2372 if (
B->isZero())
break;
2385 T->copySubmatInto(
m, 1, 1,
A->cols(),
A->cols(), 1, 1);
2389 for(
i=1;
i<=
A->cols();
i++)
2391 for(
j=
m->rows();
j>
A->cols();
j--)
2395 if (
j>
A->cols())
break;
2397 Print(
"Found nullity (kern dim) of %d\n",
i-1);
2407 x->simplifyContentDen(&
den);
2421 PrintS(
"Solve Ax=b for A=\n");
2433 assume ((
x->cols() ==
b->cols()) && (
x->rows() ==
A->cols()) && (
A->rows() ==
b->rows()));
2448 WarnS(
"have field, should use Gauss or better");
2451 if (
R->cfXExtGcd &&
R->cfAnn)
2455 WerrorS(
"have no solve algorithm");
2507 for(
int i=0;
i<a->
cols();
i++)
2512 for (
int i=0;
i<a->
rows();
i++)
2518 for(
int i=0;
i<a->
cols();
i++)
2523 for(
int i=0;
i<a->
rows();
i++)
2532 Print(
"X: %ld\n", X);
2539 Print(
"\n2:X: %ld %ld %ld\n", X, *S, *
T);
2541 Print(
"\n2:x: %ld\n",
x);
2552 for(
int i=a->
rows(); diag &&
i>0;
i--)
2554 for(
int j=a->
cols();
j>0;
j--)
2564 PrintS(
"Diag ? %d\n", diag);
2610#define MIN(a,b) (a < b ? a : b)
2611 for(rg=0; rg<
MIN(
m->rows(),
m->cols()) && !
n_IsZero(
m->view(
m->rows()-rg,
m->cols()-rg), coe); rg++);
2614 for(
int i=0;
i<rg;
i++)
2616 number
A =
n_Ann(
m->view(
m->rows()-
i,
m->cols()-
i), coe);
2617 k->set(
m->cols()-
i,
i+1,
A);
2620 for(
int i=rg;
i<
m->cols();
i++)
2662 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,...)