20 for (temp = Head; temp != NULL; temp = temp->
next)
79 for(
int i=0; i<A->
NbRows; i++) {
90 for(
int i = A->
NbRows-1; i > 0; i--) {
115 for (
int i = 0; i < A->
NbRows; i++) {
117 for (
int j = 0; j < A->
NbColumns-1; j++) {
124 for (
int i = 0; i < A->
NbRows-1; i++) {
159 int previous_nnl = -1;
166 for (
int j = 0; j < A->
NbColumns - 1; j++) {
171 for(nnl = 0; nnl<A->
NbRows; nnl++) {
180 if(nnl <= previous_nnl) {
193 for(
int i = 0; i < j; i++) {
315 for (
int j = M->
NbColumns-2; j >= 0; j--) {
317 for(i = 0; i < M->
NbRows; i++) {
361 for(
int i = 0; i < A->
NbRows; i++) {
399 for(
int i = 0; i < A->
NbRows; i++) {
442 for(
int c = 0; c < A->
NbColumns - 1; c++) {
443 for(
int l = 0; l < A->
NbRows; l++) {
452 for(
int l = 0; l < A->
NbRows; l++)
487 errormsg1(
"LatticeDifference",
"dimincomp",
488 "input lattices A and B have incompatible dimensions (rows)");
506 fprintf(stderr,
"--- Entering LatDiff ---\n"
507 "A (normalized) = X = ");
509 fprintf(stderr,
"B = ");
517 fprintf(stderr,
"Empty intersection, returning A\n");
525 fprintf(stderr,
"Inter = ");
544 for(
int column = 0; column < Inter->
NbColumns - 1; column++) {
546 for (row = 0; row < Inter->
NbRows - 1; row++) {
550 if(row == Inter->
NbRows - 1) {
561 fprintf(stderr,
"+++ Enter main loop (%d, %d)\n", row, column);
562 fprintf(stderr,
"+++ rest =\n");
569 fprintf(stderr,
"+++ Intermediate result =\n");
577 fprintf(stderr,
"Empty Result\n");
578 fprintf(stderr,
"--- Exit LatDiff ---\n\n");
623 #ifdef LATINTER_DEBUG
624 fprintf(stderr,
"---Entering LatInter---\nMatrix A = ");
626 fprintf(stderr,
"Matrix B = ");
630 errormsg1(
"LatticeIntersection",
"dimincomp",
"incompatible dimensions!");
640 for(
int i = 1; i < A->
NbRows; i++) {
645 for(
int i = 1 ; i < A->
NbRows; i++) {
655 for (
int i = 1; i < B->
NbRows; i++) {
659 for (
int i = 1; i < B->
NbRows; i++){
664 #ifdef LATINTER_DEBUG
665 fprintf(stderr,
"H init = ");
670 #ifdef LATINTER_DEBUG
671 fprintf(stderr,
"\nH = ");
679 for(
int col_num = H->
NbColumns-1 ; col_num >= 0; col_num--) {
681 for(i = 0; i < A->
NbRows; i++) {
692 #ifdef LATINTER_DEBUG
693 fprintf(stderr,
"\nEmpty intersection\n");
700 for (
int i = 0; i < Res->
NbRows; i++) {
701 for (
int j = 0; j < Res->
NbColumns; j++) {
708 #ifdef LATINTER_DEBUG
709 fprintf(stderr,
"\nLatticeIntersection result = ");
711 fprintf(stderr,
"---Exiting LatInter---\n\n");
735 Value div, rest, two, tmp;
753 if((*result)->Size == tabsize) {
773 if((*result)->Size == tabsize){
812 Value step, multiply, modulo, ratio, tmp;
828 for(
int i = 0; i < rest->
NbColumns; i++) {
835 value_division(ratio, rest->
p[line_nb][pivot_col], A->
p[line_nb][pivot_col]);
838 fprintf(stderr,
"Considering line %d. Rest pivot = ", line_nb);
840 fprintf(stderr,
" Ratio = ");
842 fprintf(stderr,
"\n");
857 for(
int p = 0; p < num_factors; p++) {
888 fprintf(stderr,
"multiply = ");
890 fprintf(stderr,
", step = ");
892 fprintf(stderr,
"\n");
899 Intersection->
p[line_nb][Intersection->
NbColumns-1], step);
904 fprintf(stderr,
" -> considering line: ");
906 fprintf(stderr,
" * x + ");
916 fprintf(stderr,
" -> part of the intersection, ignoring\n");
923 fprintf(stderr,
" -> add it to result\n");
936 for(
int ll = line_nb + 1; ll < A->
NbRows; ll++) {
940 Intersection->
p[ll][pivot_col]);
944 tmp, A->
p[ll][pivot_col]);
951 newResult->
next = Result;
961 for(
int ll = line_nb+1; ll < A->
NbRows; ll++) {
962 value_assign(rest->
p[ll][pivot_col], Intersection->
p[ll][pivot_col]);
LatticeUnion * LatticeUnion_Alloc(void)
LatticeUnion * LatticeDifference(Matrix *A, Matrix *B)
void Matrix_Move_Homogeneous_Dim_First(Matrix *A)
int LatCountZeroCols(Matrix *M)
static LatticeUnion * generate_lattice_union_row(int row, int column, Matrix *A, Matrix *Intersection, Matrix *L, LatticeUnion *Result)
Bool isSameLatticeSpace(Matrix *A, Matrix *B)
Matrix * LatticeIntersection(Matrix *A, Matrix *B)
Bool isEqualLattice(Matrix *A, Matrix *B)
void AffineHermite(Matrix *A, Matrix **H, Matrix **U)
static int value_prime_factors(Value n, Vector **result)
Bool isNormalLattice(Matrix *A)
void LatticeUnion_Free(LatticeUnion *Head)
Bool isEmptyLattice(Matrix *A)
Bool LatticeIncluded(Matrix *A, Matrix *B)
void PrintLatticeUnion(FILE *fp, char *format, LatticeUnion *Head)
void Matrix_Move_Homogeneous_Dim_Last(Matrix *A)
Matrix * Matrix_Copy(Matrix const *Src)
#define value_notzero_p(val)
#define value_notone_p(val)
#define value_zero_p(val)
#define value_assign(v1, v2)
#define value_set_si(val, i)
#define value_addmul(ref, val1, val2)
#define value_division(ref, val1, val2)
#define value_multiply(ref, val1, val2)
#define value_print(Dst, fmt, val)
#define value_modulus(ref, val1, val2)
#define value_addto(ref, val1, val2)
void errormsg1(const char *f, const char *msgname, const char *msg)
factor prime_factors(int n)
Matrix * Matrix_Alloc(unsigned NbRows, unsigned NbColumns)
void Matrix_Print(FILE *Dst, const char *Format, Matrix *Mat)
void left_hermite(Matrix *A, Matrix **Hp, Matrix **Qp, Matrix **Up)
void Matrix_Free(Matrix *Mat)
struct lattice_union * next
void Vector_Free(Vector *vector)
void Vector_Set(Value *p, int n, unsigned length)
Vector * Vector_Alloc(unsigned length)
Vector * Vector_Realloc(Vector *V, unsigned newlength)