aboutsummaryrefslogtreecommitdiff
path: root/rat2int.c
diff options
context:
space:
mode:
authorbremner <bremner@09fa754a-f411-0410-976a-da6bfa213b30>2006-07-11 11:15:40 +0000
committerbremner <bremner@09fa754a-f411-0410-976a-da6bfa213b30>2006-07-11 11:15:40 +0000
commitfc9b18afa66eca90d15302af3161a09e942c3a37 (patch)
tree88fca046e389959214bc20bf1b81139dcaca4d8d /rat2int.c
parentf2f3ec70cd3c86583c1eb03b0da63f74b6aefe05 (diff)
git-svn-id: file:///export/data/bremner/svn/trunk/inetools@5465 09fa754a-f411-0410-976a-da6bfa213b30
Diffstat (limited to 'rat2int.c')
-rw-r--r--rat2int.c139
1 files changed, 139 insertions, 0 deletions
diff --git a/rat2int.c b/rat2int.c
new file mode 100644
index 0000000..24c7ade
--- /dev/null
+++ b/rat2int.c
@@ -0,0 +1,139 @@
+/*
+ * Reads a polyhedron file on stdin with rationals and outputs an equivalent
+ * system with integer coefficents.
+ *
+ * David Bremner. bremner@unb.ca
+ *
+ */
+static char rcsid[]="$Id: rat2int.c 2055 2006-04-03 19:41:14Z bremner $";
+#include <stdlib.h>
+#include <stdio.h>
+
+#ifndef LRSMP
+#error This file only compiles with LRSMP
+#endif
+
+#include "lrsmp.h"
+#include "rat2int.h"
+
+static long int m,n,type;
+#define MP_DIGITS 1000L
+
+static void lcm3(lrs_mp a,lrs_mp b,lrs_mp c);
+
+
+main(int argc, char **argv)
+{
+
+
+ int i,j;
+ lrs_mp l,g,scratch;
+ char *type;
+ lrs_mp *D, *N;
+ char *ok[]={ "integer", "rational"};
+ process_args(argc,argv,DOCSTRING);
+ lrs_mp_init (MP_DIGITS,stdin,stdout);
+ scan_for_begin(&m,&n,&type);
+
+ check_type(type, ok , 2);
+
+ printf("%d %d integer\n",m,n);
+ D=calloc(n,sizeof(lrs_mp));
+ N=calloc(n,sizeof(lrs_mp));
+
+ for (i=0;i<m;i++) {
+
+ for (j=0; j<n; j++){
+ readrat(N[j],D[j]);
+ }
+
+ lcm3(D[0],D[1],l);
+
+ for(j=2;j<n;j++){
+ lcm3(l,D[j],l);
+ }
+
+ mul_row(N,D,l,0);
+
+ /* reinitialize gcd */
+ copy(g,N[0]);
+ copy(scratch,N[1]);
+ gcd(g,scratch);
+
+ for (j=2; j<n ; j++){
+ copy(scratch,N[j]);
+ gcd(g,scratch);
+ }
+
+ if (negative(g))
+ storesign(g,POS);
+
+ div_row(N,D,g,0);
+
+ for (j=0; j< n; j++){
+ pmp("",N[j]);
+ }
+ fputs("\n",stdout);
+ }
+
+ printf("end\n");
+
+}
+
+/* c<- lcm(a,b) */
+
+static void lcm3(lrs_mp a,lrs_mp b,lrs_mp c)
+{
+ lrs_mp gc,ab,scratch;
+
+ copy(gc,a);
+ copy(scratch,b);
+ gcd(gc,scratch);
+
+
+ mulint(a,b,ab);
+
+ divint(ab,gc,c);
+
+}
+
+
+mul_row(N,D,l,offset)
+ lrs_mp *N,*D;
+ lrs_mp l;
+ int offset;
+{
+ lrs_mp factor,scratch;
+ int j;
+
+ for (j=offset;j<n; j++) {
+
+ /*
+ * Now multiply each numerator n_i by lcm/d_i.
+ * Implicitly, each denominator is now lcm
+ */
+
+ copy(scratch,l);
+ divint(scratch,D[j],factor);
+ mulint(N[j],factor,N[j]);
+ }
+
+}
+
+div_row(N,D,g,offset)
+ lrs_mp *N,*D;
+ lrs_mp g;
+ int offset;
+{
+ lrs_mp scratch;
+ int j;
+
+ for (j=0;j<n; j++)
+ {
+ copy(scratch,N[j]);
+
+ divint(scratch,g,N[j]);
+ }
+
+}
+