Elliptic curves on binary fields work.
[u/mdw/catacomb] / calc / gfx.cal
index 8d8fd00..5b19cb3 100644 (file)
@@ -1,6 +1,6 @@
 /* -*-apcalc-*-
  *
- * $Id: gfx.cal,v 1.1 2000/10/08 16:01:37 mdw Exp $
+ * $Id: gfx.cal,v 1.1.4.1 2004/03/21 22:39:46 mdw Exp $
  *
  * Testbed for %$\gf{2}$% poltnomial arithmetic
  *
@@ -30,6 +30,9 @@
 /*----- Revision history --------------------------------------------------* 
  *
  * $Log: gfx.cal,v $
+ * Revision 1.1.4.1  2004/03/21 22:39:46  mdw
+ * Elliptic curves on binary fields work.
+ *
  * Revision 1.1  2000/10/08 16:01:37  mdw
  * Prototypes of various bits of code.
  *
@@ -79,7 +82,9 @@ define gf_mul(x, y)
 define gfx_div(rx, dx)
 {
   local r = gfint(rx), d = gfint(dx), i;
-  local q = 0, dbits = highbit(d), rbits = highbit(r);
+  local q = 0, dbits, rbits;
+  dbits = highbit(d);
+  rbits = highbit(r);
   for (i = rbits - dbits; i >= 0; i--) {
     if (bit(r, i + dbits)) {
       r = xor(r, d << i);
@@ -91,14 +96,36 @@ define gfx_div(rx, dx)
 
 define gf_div(x, y)
 {
-  local l = gfx_div(x, y);
+  local l;
+  l = gfx_div(x, y);
   return gf(l[[0]]);
 }
 
 define gf_mod(x, y)
 {
-  local l = gfx_div(x, y);
+  local l;
+  l = gfx_div(x, y);
   return gf(l[[1]]);
 }
 
+define gf_inv(a, b)
+{
+  local g, x, y, X, Y, u, v, t, q, r;
+  x = gf(1); X = gf(0);
+  y = gf(0); Y = gf(1);
+
+  if (b == gf(0)) { g = a; } else if (a == gf(0)) { g = b; }
+  else {
+    while (b != gf(0)) {
+      q = gf_div(b, a); r = gf_mod(b, a);
+      t = X * q + x; x = X; X = t;
+      t = Y * q + y; y = Y; Y = t;
+      b = a; a = r;
+    }
+    g = a;
+  }
+  if (g != gf(1)) quit "not coprime in gf_inv";
+  return Y;
+}
+
 /*----- That's all, folks -------------------------------------------------*/