From 8476b0ce1d296e591068452812ed78e62c7f70f2 Mon Sep 17 00:00:00 2001 From: Sven Verdoolaege Date: Wed, 12 May 2010 11:35:54 +0200 Subject: [PATCH] add isl_mat_normalize --- include/isl_mat.h | 2 ++ isl_mat.c | 45 +++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 47 insertions(+) diff --git a/include/isl_mat.h b/include/isl_mat.h index 3191bbc..013eb54 100644 --- a/include/isl_mat.h +++ b/include/isl_mat.h @@ -79,6 +79,8 @@ struct isl_mat *isl_mat_transpose(struct isl_mat *mat); struct isl_mat *isl_mat_right_inverse(struct isl_mat *mat); struct isl_mat *isl_mat_right_kernel(struct isl_mat *mat); +__isl_give isl_mat *isl_mat_normalize(__isl_take isl_mat *mat); + struct isl_mat *isl_mat_drop_cols(struct isl_mat *mat, unsigned col, unsigned n); struct isl_mat *isl_mat_drop_rows(struct isl_mat *mat, diff --git a/isl_mat.c b/isl_mat.c index fb09d23..df0ac2f 100644 --- a/isl_mat.c +++ b/isl_mat.c @@ -1298,3 +1298,48 @@ error: isl_mat_free(mat); return NULL; } + +void isl_mat_gcd(__isl_keep isl_mat *mat, isl_int *gcd) +{ + int i; + isl_int g; + + isl_int_set_si(*gcd, 0); + if (!mat) + return; + + isl_int_init(g); + for (i = 0; i < mat->n_row; ++i) { + isl_seq_gcd(mat->row[i], mat->n_col, &g); + isl_int_gcd(*gcd, *gcd, g); + } + isl_int_clear(g); +} + +__isl_give isl_mat *isl_mat_scale_down(__isl_take isl_mat *mat, isl_int m) +{ + int i; + + if (!mat) + return NULL; + + for (i = 0; i < mat->n_row; ++i) + isl_seq_scale_down(mat->row[i], mat->row[i], m, mat->n_col); + + return mat; +} + +__isl_give isl_mat *isl_mat_normalize(__isl_take isl_mat *mat) +{ + isl_int gcd; + + if (!mat) + return NULL; + + isl_int_init(gcd); + isl_mat_gcd(mat, &gcd); + mat = isl_mat_scale_down(mat, gcd); + isl_int_clear(gcd); + + return mat; +} -- 2.7.4