 |
My Project
UNKNOWN_GIT_VERSION
|
Go to the documentation of this file.
57 #define swap(_i, _j) \
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);
241 number bb=
n_Init(
b,basecoeffs);
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 FORCE_INLINE n_coeffType getCoeffType(const coeffs r)
Returns the type of coeffs domain.
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,...
void appendCol(bigintmat *a)
horizontally join the matrices, m <- m|a
static int si_min(const int a, const int b)
static int findLongest(int *a, int length)
void swaprow(int i, int j)
swap rows i and j
@ n_Zn
only used if HAVE_RINGS is defined
void setrow(int i, bigintmat *m)
Setzt i-te Zeile gleich übergebenem Vektor (Matrix) m.
bigintmat * elim(int i, int j)
Liefert Streichungsmatrix (i-te Zeile und j-te Spalte gestrichen) zurück.
void mod(number p)
Reduziert komplette Matrix modulo p.
void StringAppendS(const char *st)
bool addcol(int i, int j, number a, coeffs c)
addiert a-faches der j-ten Spalte zur i-ten dazu
static FORCE_INLINE number n_XExtGcd(number a, number b, number *s, number *t, number *u, number *v, const coeffs r)
static bigintmat * prependIdentity(bigintmat *A)
char * String()
IO: String returns a singular string containing the matrix, needs freeing afterwards.
void splitrow(bigintmat *a, bigintmat *b)
Speichert in Matrix a den oberen, in b den unteren Teil der Matrix, vorausgesetzt die Dimensionen sti...
void concatcol(bigintmat *a, bigintmat *b)
const CanonicalForm int const CFList const Variable & y
void concatrow(bigintmat *a, bigintmat *b)
Fügt zwei Matrixen untereinander/nebeneinander in gegebene Matrix ein, bzw spaltet gegebenen Matrix a...
void extendCols(int i)
append i zero-columns to the matrix
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
void Write()
IO: writes the matrix into the current internal string buffer which must be started/ allocated before...
static int intArrSum(int *a, int length)
void zero()
Setzt alle Einträge auf 0.
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...
char * StringAsPrinted()
Returns a string as it would have been printed in the interpreter.
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)
void inpMult(number bintop, const coeffs C=NULL)
inplace version of skalar mult. CHANGES input.
static FORCE_INLINE char * nCoeffString(const coeffs cf)
TODO: make it a virtual method of coeffs, together with: Decompose & Compose, rParameter & rPar.
void getrow(int i, bigintmat *a)
Schreibt i-te Zeile in Vektor (Matrix) a.
number view(int i, int j) const
view an entry an entry. NOTE: starts at [1,1]
@ n_Z2m
only used if HAVE_RINGS is defined
static BOOLEAN length(leftv result, leftv arg)
bigintmat * bimCopy(const bigintmat *b)
same as copy constructor - apart from it being able to accept NULL as input
static FORCE_INLINE void n_Delete(number *p, const coeffs r)
delete 'p'
coeffs basecoeffs() const
coeffs nInitChar(n_coeffType t, void *parameter)
one-time initialisations for new coeffs in case of an error return NULL
@ n_Q
rational (GMP) numbers
bool nCoeffs_are_equal(coeffs r, coeffs s)
const signed long floor(const ampf< Precision > &x)
@ n_Znm
only used if HAVE_RINGS is defined
const CanonicalForm CFMap CFMap & N
static FORCE_INLINE BOOLEAN n_IsZero(number n, const coeffs r)
TRUE iff 'n' represents the zero element.
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_IsOne(number n, const coeffs r)
TRUE iff 'n' represents the one element.
int findcolnonzero(int j)
find index of 1st non-zero entry in column j
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...
void one()
Macht Matrix (Falls quadratisch) zu Einheitsmatrix.
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 FORCE_INLINE number n_QuotRem(number a, number b, number *q, const coeffs r)
void colskalmult(int i, number a, coeffs c)
Multipliziert zur i-ten Spalte den Skalar a hinzu.
bigintmat * bimMult(bigintmat *a, bigintmat *b)
number det()
det (via LaPlace in general, hnf for euc. rings)
bigintmat * bimSub(bigintmat *a, bigintmat *b)
void hnf()
transforms INPLACE to HNF
void skaldiv(number b)
Macht Ganzzahldivision aller Matrixeinträge mit b.
static FORCE_INLINE number n_Add(number a, number b, const coeffs r)
return the sum of 'a' and 'b', i.e., a+b
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.
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
void operator*=(int intop)
UEberladener *=-Operator (fuer int und bigint) Frage hier: *= verwenden oder lieber = und * einzeln?...
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
number(* nMapFunc)(number a, const coeffs src, const coeffs dst)
maps "a", which lives in src, into dst
int findnonzero(int i)
find index of 1st non-zero entry in row i
static FORCE_INLINE void n_Write(number n, const coeffs r, const BOOLEAN bShortOut=TRUE)
int compare(const bigintmat *op) const
void PrintS(const char *s)
bool copy(bigintmat *b)
Kopiert Einträge von b auf Bigintmat.
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]
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 getColRange(int j, int no, bigintmat *a)
copies the no-columns staring by j (so j...j+no-1) into the pre-allocated a
static void reduce_mod_howell(bigintmat *A, bigintmat *b, bigintmat *eps, bigintmat *x)
bigintmat * bimAdd(bigintmat *a, bigintmat *b)
Matrix-Add/-Sub/-Mult so oder mit operator+/-/* ? @Note: NULL as a result means an error (non-compati...
bigintmat * modhnf(number p, coeffs c)
computes HNF(this | p*I)
int isOne()
is matrix is identity
@ n_Z
only used if HAVE_RINGS is defined
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 number n_Init(long i, const coeffs r)
a number representing i in the given coeff field/ring r
void Print()
IO: simply prints the matrix to the current output (screen?)
static coeffs numbercoeffs(number n, coeffs c)
create Z/nA of type n_Zn
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.
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)
intvec * bim2iv(bigintmat *b)
bool add(bigintmat *b)
Addiert zur Matrix die Matrix b dazu. Return false => an error occurred.
@ n_transExt
used for all transcendental extensions, i.e., the top-most extension in an extension tower is transce...
static FORCE_INLINE void number2mpz(number n, coeffs c, mpz_t m)
void n_Print(number &a, const coeffs r)
print a number (BEWARE of string buffers!) mostly for debugging
number pseudoinv(bigintmat *a)
Speichert in Matrix a die Pseudoinverse, liefert den Nenner zurück.
static FORCE_INLINE number n_Farey(number a, number b, const coeffs r)
void splitcol(bigintmat *a, bigintmat *b)
... linken ... rechten ...
void setcol(int j, bigintmat *m)
Setzt j-te Spalte gleich übergebenem Vektor (Matrix) m.
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 number bimFarey(bigintmat *A, number N, bigintmat *L)
number get(int i, int j) const
get a copy of an entry. NOTE: starts at [1,1]
void diagonalForm(bigintmat *A, bigintmat **S, bigintmat **T)
static int min(int a, int b)
void StringSetS(const char *st)
static int getShorter(int *a, int l, int j, int cols, int rows)
void colskaldiv(int j, number b)
Macht Ganzzahldivision aller j-ten Spalteneinträge mit b.
void howell()
dito, but Howell form (only different for zero-divsors)
void Werror(const char *fmt,...)
void swap(int i, int j)
swap columns i and j
const ampf< Precision > log10(const ampf< Precision > &x)
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 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 number solveAx_howell(bigintmat *A, bigintmat *b, bigintmat *x, bigintmat *kern)
number hnfdet()
det via HNF Primzahlen als long long int, müssen noch in number umgewandelt werden?
number content()
the content, the gcd of all entries. Only makes sense for Euclidean rings (or possibly constructive P...
static FORCE_INLINE number n_Copy(number n, const coeffs r)
return a copy of 'n'
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 WerrorS(const char *s)
bool operator==(const bigintmat &lhr, const bigintmat &rhr)
#define BIMATELEM(M, I, 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....
int lcm(unsigned long *l, unsigned long *a, unsigned long *b, unsigned long p, int dega, int degb)
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 ....
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 operator!=(const bigintmat &lhr, const bigintmat &rhr)
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 number solveAx_dixon(bigintmat *A, bigintmat *B, bigintmat *x, bigintmat *kern)
const CanonicalForm int s
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...
bigintmat * bimChangeCoeff(bigintmat *a, coeffs cnew)
Liefert Kopier von Matrix a zurück, mit coeffs cnew statt den ursprünglichen.
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 * iv2bim(intvec *b, const coeffs C)
static int index(p_Length length, p_Ord ord)
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)
void simplifyContentDen(number *den)
ensures that Gcd(den, content)=1 enden hier wieder
number trace()
the trace ....
bool addrow(int i, int j, number a, coeffs c)
... Zeile ...
void nKillChar(coeffs r)
undo all initialisations
void inpTranspose()
transpose in place
@ n_algExt
used for all algebraic extensions, i.e., the top-most extension in an extension tower is algebraic
void swapMatrix(bigintmat *a)
bool sub(bigintmat *b)
Subtrahiert ...
void rowskalmult(int i, number a, coeffs c)
... Zeile ...
bool skalmult(number b, coeffs c)
Multipliziert zur Matrix den Skalar b hinzu.