summaryrefslogtreecommitdiff
path: root/isl_mat.c
diff options
context:
space:
mode:
authorSven Verdoolaege <skimo@kotnet.org>2010-05-12 11:35:54 +0200
committerSven Verdoolaege <skimo@kotnet.org>2010-05-13 18:53:54 +0200
commit8476b0ce1d296e591068452812ed78e62c7f70f2 (patch)
tree38832d06b3210394c86074ecbe1f6d5a12b02698 /isl_mat.c
parentb4b6def475768cd6f364246473b7125b8b4afd8a (diff)
downloadisl-8476b0ce1d296e591068452812ed78e62c7f70f2.tar.gz
isl-8476b0ce1d296e591068452812ed78e62c7f70f2.tar.bz2
isl-8476b0ce1d296e591068452812ed78e62c7f70f2.zip
add isl_mat_normalize
Diffstat (limited to 'isl_mat.c')
-rw-r--r--isl_mat.c45
1 files changed, 45 insertions, 0 deletions
diff --git a/isl_mat.c b/isl_mat.c
index fb09d230..df0ac2fd 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;
+}