math/: Support EC2OSP and OS2ECP operations, with point compression.
authorMark Wooding <mdw@distorted.org.uk>
Mon, 22 Dec 2014 20:32:58 +0000 (20:32 +0000)
committerMark Wooding <mdw@distorted.org.uk>
Fri, 27 Feb 2015 21:18:15 +0000 (21:18 +0000)
We handle both LSB and (IEEE 1363) SORT compression, and hybrid forms.
The `ec_fromraw' function now accepts compressed forms, but (for
compatibility's sake) `ec_toraw' doesn't generate them.  Lots of tests
included.

math/ec-bin.c
math/ec-prime.c
math/ec-raw.c
math/ec-raw.h
math/ec-test.c
math/ec.h
math/t/ec
utils/.gitignore [new file with mode: 0644]
utils/ec-compr-test.sage [new file with mode: 0644]

index c7fe96d..598b7e3 100644 (file)
@@ -317,6 +317,32 @@ static int ecprojcheck(ec_curve *c, const ec *p)
   return (rc);
 }
 
+static int eccompr(ec_curve *c, const ec *p)
+{
+  /* --- Take the LSB of %$y/x$%, or zero if %$x = 0$% ---
+   *
+   * The negative of a point has %$y' = y + x$%.  Therefore either %$y/x$% or
+   * $%(y + x)/x = y/x + 1$% is odd, and this disambiguates, unless %$x =
+   * 0$%; but in that case we must have %$y^2 = b$% which has exactly one
+   * solution (because squaring is linear in a binary field).
+   */
+
+  int ybit;
+  field *f = c->f;
+  mp *y, *t;
+  if (MP_ZEROP(p->x)) ybit = 0;
+  else {
+    t = F_IN(f, MP_NEW, p->x);
+    y = F_IN(f, MP_NEW, p->y);
+    t = F_INV(f, t, t);
+    t = F_MUL(f, t, y, t);
+    t = F_OUT(f, t, t);
+    ybit = MP_ODDP(t);
+    MP_DROP(y); MP_DROP(t);
+  }
+  return (ybit);
+}
+
 static void ecdestroy(ec_curve *c)
 {
   ecctx_bin *cc = (ecctx_bin *)c;
@@ -380,13 +406,13 @@ ec_curve *ec_binproj(field *f, mp *a, mp *b)
 static const ec_ops ec_binops = {
   "bin",
   ecdestroy, ec_stdsamep, ec_idin, ec_idout, ec_idfix,
-  ecfind, ecneg, ecadd, ec_stdsub, ecdbl, eccheck
+  ecfind, ecneg, ecadd, ec_stdsub, ecdbl, eccheck, eccompr
 };
 
 static const ec_ops ec_binprojops = {
   "binproj",
   ecdestroy, ec_stdsamep, ec_projin, ec_projout, ec_projfix,
-  ecfind, ecprojneg, ecprojadd, ec_stdsub, ecprojdbl, ecprojcheck
+  ecfind, ecprojneg, ecprojadd, ec_stdsub, ecprojdbl, ecprojcheck, eccompr
 };
 
 /*----- Test rig ----------------------------------------------------------*/
index c2ec288..46b9885 100644 (file)
@@ -328,6 +328,17 @@ static int ecprojcheck(ec_curve *c, const ec *p)
   return (rc);
 }
 
+static int eccompr(ec_curve *c, const ec *p)
+{
+  /* --- Just take the LSB of %$y$% ---
+   *
+   * Since @p@ is odd, either %$y$% or %$-y = p - y$% must be odd, so this
+   * disambiguates.
+   */
+
+  return (MP_ODDP(p->y));
+}
+
 static void ecdestroy(ec_curve *c)
 {
   MP_DROP(c->a);
@@ -378,19 +389,19 @@ extern ec_curve *ec_primeproj(field *f, mp *a, mp *b)
 static const ec_ops ec_primeops = {
   "prime",
   ecdestroy, ec_stdsamep, ec_idin, ec_idout, ec_idfix,
-  ecfind, ecneg, ecadd, ec_stdsub, ecdbl, eccheck
+  ecfind, ecneg, ecadd, ec_stdsub, ecdbl, eccheck, eccompr
 };
 
 static const ec_ops ec_primeprojops = {
   "primeproj",
   ecdestroy, ec_stdsamep, ec_projin, ec_projout, ec_projfix,
-  ecfind, ecneg, ecprojadd, ec_stdsub, ecprojdbl, ecprojcheck
+  ecfind, ecneg, ecprojadd, ec_stdsub, ecprojdbl, ecprojcheck, eccompr
 };
 
 static const ec_ops ec_primeprojxops = {
   "primeproj",
   ecdestroy, ec_stdsamep, ec_projin, ec_projout, ec_projfix,
-  ecfind, ecneg, ecprojadd, ec_stdsub, ecprojxdbl, ecprojcheck
+  ecfind, ecneg, ecprojadd, ec_stdsub, ecprojxdbl, ecprojcheck, eccompr
 };
 
 /*----- Test rig ----------------------------------------------------------*/
index 54310c8..acee1b6 100644 (file)
 
 /*----- Main code ---------------------------------------------------------*/
 
-/* --- @ec_putraw@ --- *
+/* --- @ec_ec2osp@ --- *
  *
  * Arguments:  @ec_curve *c@ = elliptic curve
+ *             @unsigned f@ = format flags for output
  *             @buf *b@ = pointer to a buffer
  *             @const ec *p@ = an elliptic curve point
  *
  * Returns:    Zero on success, nonzero on failure.
  *
  * Use:                Puts an elliptic curve point to the given buffer using the
- *             standard uncompressed format described in P1383 and SEC1.
+ *             standard uncompressed format described in P1363 and SEC1.
  *             This requires at most @1 + 2 * c->f->noctets@ space in the
- *             buffer.  We don't do point compression.
+ *             buffer.
+ *
+ *             Point compression features are determined by @f@ as follows.
+ *             If @EC_CMPR@ is set then point compression is performed and a
+ *             compressed form of the %$y$%-coordinate is contained in the
+ *             first output byte; if @EC_SORT@ is set then P1363a `SORT'
+ *             compression is used, otherwise LSB compression.  If
+ *             @EC_EXPLY@ is set, then an explicit %$y$%-coordinate is
+ *             output in full.  Otherwise the %$y$%-coordinate is
+ *             suppressed.
  */
 
-int ec_putraw(ec_curve *c, buf *b, const ec *p)
+int ec_ec2osp(ec_curve *c, unsigned f, buf *b, const ec *p)
 {
   octet *q;
   size_t n;
+  ec t = EC_INIT;
+
+  /* --- Point at infinity --- */
 
   if (EC_ATINF(p)) return (buf_putbyte(b, 0));
-  buf_putbyte(b, 4);
+
+  /* --- Fix up the format byte, compressing the %$y$%-coordinate --- */
+
+  if (!f)
+    f = EC_XONLY;
+  else if (f & EC_CMPR) {
+    if (!(f & EC_SORT))
+      f |= EC_COMPR(c, p) ? EC_YBIT : 0;
+    else {
+      ec_neg(c, &t, p);
+      f |= MP_CMP(p->y, >, t.y);
+      EC_DESTROY(&t);
+    }
+  }
+
+  /* --- Write the format byte --- */
+
+  if (buf_putbyte(b, f)) return (-1);
+
+  /* --- Write the %$x$%-coordinate --- */
+
   n = c->f->noctets;
-  if ((q = buf_get(b, n * 2)) == 0) return (-1);
+  if ((q = buf_get(b, n)) == 0) return (-1);
   mp_storeb(p->x, q, n);
-  mp_storeb(p->y, q + n, n);
+
+  /* --- Write the %$y$%-coordinate if we need one --- */
+
+  if (f & EC_EXPLY) {
+    if ((q = buf_get(b, n)) == 0) return (-1);
+    mp_storeb(p->y, q, n);
+  }
+
+  /* --- All done --- */
+
   return (0);
 }
 
-/* --- @ec_getraw@ --- *
+/* --- @ec_os2ecp@ --- *
  *
- * Arguments:  @ec_curve *c@ = elliptic curve
+ * Arguments:  @ec_curve *c = elliptic curve
+ *             @unsigned f@ = format flags for input
  *             @buf *b@ = pointer to a buffer
  *             @ec *d@ = an elliptic curve point
  *
  * Returns:    Zero on success, nonzero on failure.
  *
  * Use:                Reads an elliptic curve point from the given buffer using the
- *             standard uncompressed format described in P1383 and SEC1.
- *             We don't do point compression.
+ *             standard uncompressed format described in P1363 and SEC1.
+ *
+ *             Point compression features are determined by @f@ as follows.
+ *             If @EC_LSB@ is set, then accept an LSB-compressed %$y$%-
+ *             coordinate; if @EC_SORT@ is set, then accept a SORT-
+ *             compressed %$y$%-coordinate; if @EC_EXPLY@ is set, then
+ *             accept an explicit %$y$%-coordinate; if @EC_XONLY@ is set
+ *             then accept a bare %$x$%-coordinate (a correct
+ *             %$y$%-coordinate is chosen arbitrarily).  Hybrid forms are
+ *             acceptable, and the input is checked to verify that the
+ *             redundant representations are consistent.  If no flags are
+ *             set in @f@, then no input (other than the point at infinity)
+ *             will be acceptable.
  */
 
-int ec_getraw(ec_curve *c, buf *b, ec *d)
+int ec_os2ecp(ec_curve *c, unsigned f, buf *b, ec *d)
 {
   const octet *q;
   size_t n;
-  int u;
+  ec t = EC_INIT, tt = EC_INIT;
+  mp *x = MP_NEW, *y = MP_NEW;
+  int g, gwant;
+  int rc = -1;
+
+  /* --- Read the format byte --- */
+
+  if ((g = buf_getbyte(b)) < 0) goto done;
+
+  /* --- Point at infinity --- */
+
+  if (!g) { EC_SETINF(d); rc = 0; goto done; }
+
+  /* --- Fetch the %$x$%-coordinate --- */
 
-  if ((u = buf_getbyte(b)) < 0) return (-1);
-  if (!u) { EC_SETINF(d); return (0); }
-  if (!(u & 4)) return (-1);
   n = c->f->noctets;
-  if ((q = buf_get(b, n * 2)) == 0) return (-1);
-  EC_DESTROY(d);
-  d->x = mp_loadb(MP_NEW, q, n);
-  d->y = mp_loadb(MP_NEW, q + n, n);
-  d->z = 0;
-  return (0);
+  if ((q = buf_get(b, n)) == 0) goto done;
+  x = mp_loadb(x, q, n);
+
+  /* --- If we're compressing then figure out the right value --- *
+   *
+   * Also check that the format is acceptable to the caller.
+   */
+
+  switch (g & ~EC_EXPLY) {
+    case 0:
+      t.x = x; x = MP_NEW; break;
+    case EC_XONLY:
+      gwant = EC_XONLY; goto decompr;
+    case EC_CMPR: case EC_CMPR | EC_YBIT:
+      gwant = EC_LSB; goto decompr;
+    case EC_CMPR | EC_SORT: case EC_CMPR | EC_SORT | EC_YBIT:
+      gwant = EC_SORT; goto decompr;
+    default: goto done;
+    decompr:
+      if (!(f & gwant)) goto done;
+      if (!ec_find(c, &t, x)) goto done;
+      switch (gwant) {
+       case EC_LSB:
+         if (!EC_COMPR(c, &t) != !(g & EC_YBIT)) ec_neg(c, &t, &t);
+         if (!EC_COMPR(c, &t) != !(g & EC_YBIT)) goto done;
+         break;
+       case EC_SORT:
+         ec_neg(c, &tt, &t);
+         if (!MP_CMP(t.y, >, tt.y) != !(g & EC_YBIT)) {
+           if (MP_EQ(t.y, tt.y)) goto done;
+           MP_DROP(t.y); t.y = MP_COPY(tt.y);
+         }
+         break;
+       case EC_XONLY:
+         break;
+       default:
+         abort();
+      }
+  }
+
+  /* --- If an explicit %$y$%-coordinate is specified, read it in --- */
+
+  if (g & EC_EXPLY) {
+    if (!(f & EC_EXPLY)) goto done;
+    if ((q = buf_get(b, n)) == 0) goto done;
+    y = mp_loadb(y, q, n);
+    if (!t.y) t.y = MP_COPY(y);
+    else if (!MP_EQ(y, t.y)) goto done;
+  }
+
+  /* --- We're ready --- */
+
+  EC_COPY(d, &t);
+  rc = 0;
+
+  /* --- Clean up --- */
+
+done:
+  if (x) MP_DROP(x);
+  if (y) MP_DROP(y);
+  if (t.x) MP_DROP(t.x); if (t.y) MP_DROP(t.y);
+  EC_DESTROY(&tt);
+  return (rc);
 }
 
+/* --- @ec_putraw@ --- *
+ *
+ * Arguments:  @ec_curve *c@ = elliptic curve
+ *             @buf *b@ = pointer to a buffer
+ *             @const ec *p@ = an elliptic curve point
+ *
+ * Returns:    Zero on success, nonzero on failure.
+ *
+ * Use:                Puts an elliptic curve point to the given buffer using the
+ *             standard uncompressed format described in P1363 and SEC1.
+ *             This requires at most @1 + 2 * c->f->noctets@ space in the
+ *             buffer.  We don't do point compression.
+ */
+
+int ec_putraw(ec_curve *c, buf *b, const ec *p)
+  { return (ec_ec2osp(c, EC_EXPLY, b, p)); }
+
+/* --- @ec_getraw@ --- *
+ *
+ * Arguments:  @ec_curve *c@ = elliptic curve
+ *             @buf *b@ = pointer to a buffer
+ *             @ec *d@ = an elliptic curve point
+ *
+ * Returns:    Zero on success, nonzero on failure.
+ *
+ * Use:                Reads an elliptic curve point from the given buffer using the
+ *             standard uncompressed format described in P1363 and SEC1.
+ *             We don't do point compression.
+ */
+
+int ec_getraw(ec_curve *c, buf *b, ec *d)
+  { return (ec_os2ecp(c, EC_LSB | EC_SORT | EC_EXPLY, b, d)); }
+
 /*----- That's all, folks -------------------------------------------------*/
index 4792bd7..0ceadd6 100644 (file)
 
 /*----- Data formatting ---------------------------------------------------*/
 
+/* EC2OSP/OS2ECP bit mask. */
+#define EC_YBIT 1u                     /* The compressed @y@-coordinate */
+#define EC_XONLY 1u                    /* The @y@-coordinate is absent */
+#define EC_CMPR 2u                     /* Compressed @y@-coordinate */
+#define EC_LSB 2u                      /* Use `lsb' compression */
+#define EC_EXPLY 4u                    /* Explicit @y@-coordinate */
+#define EC_SORT 8u                     /* Use `sort' rather than `lsb' */
+
+/* --- @ec_ec2osp@ --- *
+ *
+ * Arguments:  @ec_curve *c@ = elliptic curve
+ *             @unsigned f@ = format flags for output
+ *             @buf *b@ = pointer to a buffer
+ *             @const ec *p@ = an elliptic curve point
+ *
+ * Returns:    Zero on success, nonzero on failure.
+ *
+ * Use:                Puts an elliptic curve point to the given buffer using the
+ *             standard uncompressed format described in P1363 and SEC1.
+ *             This requires at most @1 + 2 * c->f->noctets@ space in the
+ *             buffer.
+ *
+ *             Point compression features are determined by @f@ as follows.
+ *             If @EC_CMPR@ is set then point compression is performed and a
+ *             compressed form of the %$y$%-coordinate is contained in the
+ *             first output byte; if @EC_SORT@ is set then P1363a `SORT'
+ *             compression is used, otherwise LSB compression.  If
+ *             @EC_EXPLY@ is set, then an explicit %$y$%-coordinate is
+ *             output in full.  Otherwise the %$y$%-coordinate is
+ *             suppressed.
+ */
+
+extern int ec_ec2osp(ec_curve */*c*/, unsigned /*f*/,
+                    buf */*b*/, const ec */*p*/);
+
+/* --- @ec_os2ecp@ --- *
+ *
+ * Arguments:  @ec_curve *c = elliptic curve
+ *             @unsigned f@ = format flags for input
+ *             @buf *b@ = pointer to a buffer
+ *             @ec *d@ = an elliptic curve point
+ *
+ * Returns:    Zero on success, nonzero on failure.
+ *
+ * Use:                Reads an elliptic curve point from the given buffer using the
+ *             standard uncompressed format described in P1363 and SEC1.
+ *
+ *             Point compression features are determined by @f@ as follows.
+ *             If @EC_LSB@ is set, then accept an LSB-compressed %$y$%-
+ *             coordinate; if @EC_SORT@ is set, then accept a SORT-
+ *             compressed %$y$%-coordinate; if @EC_EXPLY@ is set, then
+ *             accept an explicit %$y$%-coordinate; if @EC_XONLY@ is set
+ *             then accept a bare %$x$%-coordinate (a correct
+ *             %$y$%-coordinate is chosen arbitrarily).  Hybrid forms are
+ *             acceptable, and the input is checked to verify that the
+ *             redundant representations are consistent.  If no flags are
+ *             set in @f@, then no input (other than the point at infinity)
+ *             will be acceptable.
+ */
+
+extern int ec_os2ecp(ec_curve */*c*/, unsigned /*f*/, buf */*b*/, ec */*d*/);
+
 /* --- @ec_putraw@ --- *
  *
  * Arguments:  @ec_curve *c@ = elliptic curve
index 26daeef..c75de61 100644 (file)
@@ -38,6 +38,8 @@
 #include <mLib/sub.h>
 
 #include "ec.h"
+#include "ectab.h"
+#include "ec-raw.h"
 #include "ec-test.h"
 
 /*----- Cardboard cut-out elliptic curve ----------------------------------*/
@@ -88,6 +90,12 @@ static ec *ecFIND(ec_curve *cc, ec *d, mp *x)
   return (EC_FIND(c->real, d, x));
 }
 
+static int ecCOMPR(ec_curve *cc, const ec *p)
+{
+  ecctx *c = (ecctx *)cc;
+  return (EC_COMPR(c->real, p));
+}
+
 static int ecCHECK(ec_curve *cc, const ec *p)
 {
   ecctx *c = (ecctx *)cc;
@@ -103,7 +111,7 @@ static int ecSAMEP(ec_curve *cc, ec_curve *dd)
 static const ec_ops ecops = {
   "cardboard",
   ecDESTROY, ecSAMEP, ecIN, ecOUT, ecFIX,
-  ecFIND, ecNEG, ecADD, ecSUB, ecDBL, ecCHECK
+  ecFIND, ecNEG, ecADD, ecSUB, ecDBL, ecCHECK, ecCOMPR
 };
 
 static ec_curve *ec_cutout(ec_curve *real, const char *name)
@@ -132,14 +140,26 @@ static void ecvcvt(const char *buf, dstr *d)
 {
   ec_curve *v;
   qd_parse qd;
+  const ecentry *ee;
+  ec_info ei;
 
   qd.p = buf;
   qd.e = 0;
+  for (ee = ectab; ee->name; ee++) {
+    if (qd_enum(&qd, ee->name) >= 0) {
+      ec_infofromdata(&ei, ee->data);
+      v = ei.c;
+      MP_DROP(ei.r); MP_DROP(ei.h);
+      EC_DESTROY(&ei.g);
+      goto found;
+    }
+  }
   if ((v = ec_curveparse(&qd)) == 0) {
     fprintf(stderr, "bad curve `%.*s|%s': %s\n",
            (int)(qd.p - buf), buf, qd.p, qd.e);
     exit(1);
   }
+found:
   dstr_ensure(d, sizeof(v));
   *(ec_curve **)d->buf = ec_cutout(v, buf);
   d->len += sizeof(v);
@@ -323,6 +343,82 @@ static int vfind(dstr v[])
   return (ok);
 }
 
+static int vec2osp(dstr v[])
+{
+  ec_curve *e = *(ec_curve **)v[0].buf;
+  unsigned f = *(int *)v[1].buf;
+  ec *p = (ec *)v[2].buf;
+  size_t n = 1 + 2*e->f->noctets;
+  dstr d = DSTR_INIT, dd = DSTR_INIT;
+  buf b;
+  int ok = 1;
+  int win, wantwin;
+
+  if (strcmp(v[3].buf, "FAIL") == 0) wantwin = 0;
+  else { wantwin = 1; type_hex.cvt(v[3].buf, &d); }
+
+  dstr_ensure(&dd, n); buf_init(&b, dd.buf, n);
+
+  win = !ec_ec2osp(e, f, &b, p);
+  if (!win != !wantwin ||
+      (win && (BLEN(&b) != d.len ||
+              memcmp(BBASE(&b), d.buf, BLEN(&b)) != 0))) {
+    ok = 0;
+    fprintf(stderr, "ec2osp failed");
+    fprintf(stderr, "\ncurve = "); type_ecurve.dump(v, stderr);
+    fprintf(stderr, "\n  fmt = 0x%02x", f);
+    fprintf(stderr, "\n    p = "); ecdodump(p, stderr);
+    fprintf(stderr, "\n want = ");
+    if (wantwin) type_hex.dump(&d, stderr);
+    else fprintf(stderr, "FAIL");
+    fprintf(stderr, "\nfound = ");
+    if (win) { dd.len = BLEN(&b); type_hex.dump(&dd, stderr); }
+    else fprintf(stderr, "FAIL");
+    fprintf(stderr, "\n");
+  }
+
+  dstr_destroy(&d); dstr_destroy(&dd);
+  EC_DESTROY(p); ecdestroy(e);
+  return (ok);
+}
+
+static int vos2ecp(dstr v[])
+{
+  ec_curve *e = *(ec_curve **)v[0].buf;
+  unsigned f = *(int *)v[1].buf;
+  int remain = *(int *)v[4].buf;
+  dstr d = DSTR_INIT;
+  ec *p, q = EC_INIT;
+  buf b;
+  int ok = 1;
+  int win;
+
+  if (strcmp(v[3].buf, "FAIL") == 0) p = 0;
+  else { type_ec.cvt(v[3].buf, &d); p = (ec *)d.buf; }
+
+  buf_init(&b, v[2].buf, v[2].len);
+  win = !ec_os2ecp(e, f, &b, &q);
+
+  if (!win != !p || (win && (!EC_EQ(p, &q) || BLEFT(&b) != remain))) {
+    ok = 0;
+    fprintf(stderr, "os2ecp failed");
+    fprintf(stderr, "\ncurve = "); type_ecurve.dump(v, stderr);
+    fprintf(stderr, "\n  fmt = 0x%02x", f);
+    fprintf(stderr, "\ninput = "); type_hex.dump(&v[2], stderr);
+    fprintf(stderr, "\n want = ");
+    if (p) ecdodump(p, stderr); else fprintf(stderr, "FAIL");
+    fprintf(stderr, "\nfound = ");
+    if (win) ecdodump(&q, stderr); else fprintf(stderr, "FAIL");
+    fprintf(stderr, "\nremain= %d", remain);
+    fprintf(stderr, "\nleft  = %d", (int)BLEFT(&b));
+    fprintf(stderr, "\n");
+  }
+
+  if (p) EC_DESTROY(p); EC_DESTROY(&q); ecdestroy(e);
+  dstr_destroy(&d);
+  return (ok);
+}
+
 static test_chunk tests[] = {
   { "neg", vneg, { &type_ecurve, &type_ec, &type_ec } },
   { "dbl", vdbl, { &type_ecurve, &type_ec, &type_ec } },
@@ -331,6 +427,9 @@ static test_chunk tests[] = {
   { "mul", vmul, { &type_ecurve, &type_ec, &type_mp, &type_ec } },
   { "check", vcheck, { &type_ecurve, &type_ec, &type_int } },
   { "find", vfind, { &type_ecurve, &type_mp, &type_ec } },
+  { "ec2osp", vec2osp, { &type_ecurve, &type_int, &type_ec, &type_string } },
+  { "os2ecp", vos2ecp,
+    { &type_ecurve, &type_int, &type_hex, &type_string, &type_int } },
   { 0, 0, { 0 } }
 };
 
index cc7649d..3de2bb5 100644 (file)
--- a/math/ec.h
+++ b/math/ec.h
@@ -72,8 +72,10 @@ typedef struct ec_mulfactor {
 
 /* --- Elliptic curve operations --- *
  *
- * All operations (apart from @destroy@ and @in@) are guaranteed to be
- * performed on internal representations of points.
+ * All operations apart from @destroy@, @in@, and @compr@ are guaranteed to
+ * be performed on internal representations of points; @in@ and @compr@ will
+ * always be performed on external representations; @destroy@ might be
+ * performed on either.
  *
  * (Historical note.  We used to guarantee that the second to @add@ and @mul@
  * was the output of @in@ or @fix@, but this canonification turned out to
@@ -94,6 +96,7 @@ typedef struct ec_ops {
   ec *(*sub)(ec_curve */*c*/, ec */*d*/, const ec */*p*/, const ec */*q*/);
   ec *(*dbl)(ec_curve */*c*/, ec */*d*/, const ec */*p*/);
   int (*check)(ec_curve */*c*/, const ec */*p*/);
+  int (*compr)(ec_curve */*c*/, const ec */*p*/);
 } ec_ops;
 
 #define EC_NAME(c)             (c)->ops->name
@@ -104,6 +107,7 @@ typedef struct ec_ops {
 #define EC_FIX(c, d, p)                (c)->ops->fix((c), (d), (p))
 
 #define EC_FIND(c, d, x)       (c)->ops->find((c), (d), (x))
+#define EC_COMPR(c, d)         (c)->ops->compr((c), (d))
 #define EC_NEG(c, d, x)                (c)->ops->neg((c), (d), (x))
 #define EC_ADD(c, d, p, q)     (c)->ops->add((c), (d), (p), (q))
 #define EC_SUB(c, d, p, q)     (c)->ops->sub((c), (d), (p), (q))
index 1dc56ab..9b57d6c 100644 (file)
--- a/math/t/ec
+++ b/math/t/ec
@@ -460,3 +460,2526 @@ mul {
     5846006549323611672814741753598448348329118574063
     inf;
 }
+
+ec2osp {
+  ## Some automated tests, from `ec-compr-test.sage'.
+  "prime: 6277101735386680763835789423207666416102355444464034512659; prime: -3, 6"
+    1 "0x4a4edd749b4e809ddf0ecdb0cddd64b64f4558816ef243f5, 0xb3cef6f7f891a23d823aa01e96a74a3890cf71f4032d49d"
+    014a4edd749b4e809ddf0ecdb0cddd64b64f4558816ef243f5;
+  "prime: 6277101735386680763835789423207666416102355444464034512659; prime: -3, 6"
+    2 "0x4a4edd749b4e809ddf0ecdb0cddd64b64f4558816ef243f5, 0xb3cef6f7f891a23d823aa01e96a74a3890cf71f4032d49d"
+    034a4edd749b4e809ddf0ecdb0cddd64b64f4558816ef243f5;
+  "prime: 6277101735386680763835789423207666416102355444464034512659; prime: -3, 6"
+    10 "0x4a4edd749b4e809ddf0ecdb0cddd64b64f4558816ef243f5, 0xb3cef6f7f891a23d823aa01e96a74a3890cf71f4032d49d"
+    0a4a4edd749b4e809ddf0ecdb0cddd64b64f4558816ef243f5;
+  "prime: 6277101735386680763835789423207666416102355444464034512659; prime: -3, 6"
+    4 "0x4a4edd749b4e809ddf0ecdb0cddd64b64f4558816ef243f5, 0xb3cef6f7f891a23d823aa01e96a74a3890cf71f4032d49d"
+    044a4edd749b4e809ddf0ecdb0cddd64b64f4558816ef243f50b3cef6f7f891a23d823aa01e96a74a3890cf71f4032d49d;
+  "prime: 6277101735386680763835789423207666416102355444464034512659; prime: -3, 6"
+    6 "0x4a4edd749b4e809ddf0ecdb0cddd64b64f4558816ef243f5, 0xb3cef6f7f891a23d823aa01e96a74a3890cf71f4032d49d"
+    074a4edd749b4e809ddf0ecdb0cddd64b64f4558816ef243f50b3cef6f7f891a23d823aa01e96a74a3890cf71f4032d49d;
+  "prime: 6277101735386680763835789423207666416102355444464034512659; prime: -3, 6"
+    14 "0x4a4edd749b4e809ddf0ecdb0cddd64b64f4558816ef243f5, 0xb3cef6f7f891a23d823aa01e96a74a3890cf71f4032d49d"
+    0e4a4edd749b4e809ddf0ecdb0cddd64b64f4558816ef243f50b3cef6f7f891a23d823aa01e96a74a3890cf71f4032d49d;
+  "prime: 6277101735386680763835789423207666416102355444464034512659; prime: -3, 6"
+    1 "0x357d51a879fc1f08e116365028b0a74d8f1bc7af73b7505c, 0x7059e89008cb30c7625a5145ced14a07dede72c7624b6b80"
+    01357d51a879fc1f08e116365028b0a74d8f1bc7af73b7505c;
+  "prime: 6277101735386680763835789423207666416102355444464034512659; prime: -3, 6"
+    2 "0x357d51a879fc1f08e116365028b0a74d8f1bc7af73b7505c, 0x7059e89008cb30c7625a5145ced14a07dede72c7624b6b80"
+    02357d51a879fc1f08e116365028b0a74d8f1bc7af73b7505c;
+  "prime: 6277101735386680763835789423207666416102355444464034512659; prime: -3, 6"
+    10 "0x357d51a879fc1f08e116365028b0a74d8f1bc7af73b7505c, 0x7059e89008cb30c7625a5145ced14a07dede72c7624b6b80"
+    0a357d51a879fc1f08e116365028b0a74d8f1bc7af73b7505c;
+  "prime: 6277101735386680763835789423207666416102355444464034512659; prime: -3, 6"
+    4 "0x357d51a879fc1f08e116365028b0a74d8f1bc7af73b7505c, 0x7059e89008cb30c7625a5145ced14a07dede72c7624b6b80"
+    04357d51a879fc1f08e116365028b0a74d8f1bc7af73b7505c7059e89008cb30c7625a5145ced14a07dede72c7624b6b80;
+  "prime: 6277101735386680763835789423207666416102355444464034512659; prime: -3, 6"
+    6 "0x357d51a879fc1f08e116365028b0a74d8f1bc7af73b7505c, 0x7059e89008cb30c7625a5145ced14a07dede72c7624b6b80"
+    06357d51a879fc1f08e116365028b0a74d8f1bc7af73b7505c7059e89008cb30c7625a5145ced14a07dede72c7624b6b80;
+  "prime: 6277101735386680763835789423207666416102355444464034512659; prime: -3, 6"
+    14 "0x357d51a879fc1f08e116365028b0a74d8f1bc7af73b7505c, 0x7059e89008cb30c7625a5145ced14a07dede72c7624b6b80"
+    0e357d51a879fc1f08e116365028b0a74d8f1bc7af73b7505c7059e89008cb30c7625a5145ced14a07dede72c7624b6b80;
+  "prime: 6277101735386680763835789423207666416102355444464034512659; prime: -3, 6"
+    1 "0x255671b281371f7c95167be1aa7ddcf2ebe4442e5b957973, 0xc6818eac29facb3463ca315f319861caa8d6807ddc1d840d"
+    01255671b281371f7c95167be1aa7ddcf2ebe4442e5b957973;
+  "prime: 6277101735386680763835789423207666416102355444464034512659; prime: -3, 6"
+    2 "0x255671b281371f7c95167be1aa7ddcf2ebe4442e5b957973, 0xc6818eac29facb3463ca315f319861caa8d6807ddc1d840d"
+    03255671b281371f7c95167be1aa7ddcf2ebe4442e5b957973;
+  "prime: 6277101735386680763835789423207666416102355444464034512659; prime: -3, 6"
+    10 "0x255671b281371f7c95167be1aa7ddcf2ebe4442e5b957973, 0xc6818eac29facb3463ca315f319861caa8d6807ddc1d840d"
+    0b255671b281371f7c95167be1aa7ddcf2ebe4442e5b957973;
+  "prime: 6277101735386680763835789423207666416102355444464034512659; prime: -3, 6"
+    4 "0x255671b281371f7c95167be1aa7ddcf2ebe4442e5b957973, 0xc6818eac29facb3463ca315f319861caa8d6807ddc1d840d"
+    04255671b281371f7c95167be1aa7ddcf2ebe4442e5b957973c6818eac29facb3463ca315f319861caa8d6807ddc1d840d;
+  "prime: 6277101735386680763835789423207666416102355444464034512659; prime: -3, 6"
+    6 "0x255671b281371f7c95167be1aa7ddcf2ebe4442e5b957973, 0xc6818eac29facb3463ca315f319861caa8d6807ddc1d840d"
+    07255671b281371f7c95167be1aa7ddcf2ebe4442e5b957973c6818eac29facb3463ca315f319861caa8d6807ddc1d840d;
+  "prime: 6277101735386680763835789423207666416102355444464034512659; prime: -3, 6"
+    14 "0x255671b281371f7c95167be1aa7ddcf2ebe4442e5b957973, 0xc6818eac29facb3463ca315f319861caa8d6807ddc1d840d"
+    0f255671b281371f7c95167be1aa7ddcf2ebe4442e5b957973c6818eac29facb3463ca315f319861caa8d6807ddc1d840d;
+  "niceprime: 6277101735386680763835789423207666416102355444464034512659; prime: -3, 6"
+    1 "0x8ca5c0a995ef8e777753058364ee5ec70732c666ad0979d3, 0x31aef4dae5f98cc3cc8ce00e45533cd2abef85a7e7b181fe"
+    018ca5c0a995ef8e777753058364ee5ec70732c666ad0979d3;
+  "niceprime: 6277101735386680763835789423207666416102355444464034512659; prime: -3, 6"
+    2 "0x8ca5c0a995ef8e777753058364ee5ec70732c666ad0979d3, 0x31aef4dae5f98cc3cc8ce00e45533cd2abef85a7e7b181fe"
+    028ca5c0a995ef8e777753058364ee5ec70732c666ad0979d3;
+  "niceprime: 6277101735386680763835789423207666416102355444464034512659; prime: -3, 6"
+    10 "0x8ca5c0a995ef8e777753058364ee5ec70732c666ad0979d3, 0x31aef4dae5f98cc3cc8ce00e45533cd2abef85a7e7b181fe"
+    0a8ca5c0a995ef8e777753058364ee5ec70732c666ad0979d3;
+  "niceprime: 6277101735386680763835789423207666416102355444464034512659; prime: -3, 6"
+    4 "0x8ca5c0a995ef8e777753058364ee5ec70732c666ad0979d3, 0x31aef4dae5f98cc3cc8ce00e45533cd2abef85a7e7b181fe"
+    048ca5c0a995ef8e777753058364ee5ec70732c666ad0979d331aef4dae5f98cc3cc8ce00e45533cd2abef85a7e7b181fe;
+  "niceprime: 6277101735386680763835789423207666416102355444464034512659; prime: -3, 6"
+    6 "0x8ca5c0a995ef8e777753058364ee5ec70732c666ad0979d3, 0x31aef4dae5f98cc3cc8ce00e45533cd2abef85a7e7b181fe"
+    068ca5c0a995ef8e777753058364ee5ec70732c666ad0979d331aef4dae5f98cc3cc8ce00e45533cd2abef85a7e7b181fe;
+  "niceprime: 6277101735386680763835789423207666416102355444464034512659; prime: -3, 6"
+    14 "0x8ca5c0a995ef8e777753058364ee5ec70732c666ad0979d3, 0x31aef4dae5f98cc3cc8ce00e45533cd2abef85a7e7b181fe"
+    0e8ca5c0a995ef8e777753058364ee5ec70732c666ad0979d331aef4dae5f98cc3cc8ce00e45533cd2abef85a7e7b181fe;
+  "niceprime: 6277101735386680763835789423207666416102355444464034512659; prime: -3, 6"
+    1 "0x81e77be6a18437bee5694c10b6d93e37181172afc5ac545d, 0xce90b00553ef336cb59f214b21c9a9adba24ba9926dcec65"
+    0181e77be6a18437bee5694c10b6d93e37181172afc5ac545d;
+  "niceprime: 6277101735386680763835789423207666416102355444464034512659; prime: -3, 6"
+    2 "0x81e77be6a18437bee5694c10b6d93e37181172afc5ac545d, 0xce90b00553ef336cb59f214b21c9a9adba24ba9926dcec65"
+    0381e77be6a18437bee5694c10b6d93e37181172afc5ac545d;
+  "niceprime: 6277101735386680763835789423207666416102355444464034512659; prime: -3, 6"
+    10 "0x81e77be6a18437bee5694c10b6d93e37181172afc5ac545d, 0xce90b00553ef336cb59f214b21c9a9adba24ba9926dcec65"
+    0b81e77be6a18437bee5694c10b6d93e37181172afc5ac545d;
+  "niceprime: 6277101735386680763835789423207666416102355444464034512659; prime: -3, 6"
+    4 "0x81e77be6a18437bee5694c10b6d93e37181172afc5ac545d, 0xce90b00553ef336cb59f214b21c9a9adba24ba9926dcec65"
+    0481e77be6a18437bee5694c10b6d93e37181172afc5ac545dce90b00553ef336cb59f214b21c9a9adba24ba9926dcec65;
+  "niceprime: 6277101735386680763835789423207666416102355444464034512659; prime: -3, 6"
+    6 "0x81e77be6a18437bee5694c10b6d93e37181172afc5ac545d, 0xce90b00553ef336cb59f214b21c9a9adba24ba9926dcec65"
+    0781e77be6a18437bee5694c10b6d93e37181172afc5ac545dce90b00553ef336cb59f214b21c9a9adba24ba9926dcec65;
+  "niceprime: 6277101735386680763835789423207666416102355444464034512659; prime: -3, 6"
+    14 "0x81e77be6a18437bee5694c10b6d93e37181172afc5ac545d, 0xce90b00553ef336cb59f214b21c9a9adba24ba9926dcec65"
+    0f81e77be6a18437bee5694c10b6d93e37181172afc5ac545dce90b00553ef336cb59f214b21c9a9adba24ba9926dcec65;
+  "prime: 6277101735386680763835789423207666416102355444464034512659; primeproj: -3, 6"
+    1 "0x8e3d066daa0462601b2603c220ac97eea1158c91f74028d5, 0x81e00ca4e9c7547e6b9d84417038eb1a81f1f74b730e0e1e"
+    018e3d066daa0462601b2603c220ac97eea1158c91f74028d5;
+  "prime: 6277101735386680763835789423207666416102355444464034512659; primeproj: -3, 6"
+    2 "0x8e3d066daa0462601b2603c220ac97eea1158c91f74028d5, 0x81e00ca4e9c7547e6b9d84417038eb1a81f1f74b730e0e1e"
+    028e3d066daa0462601b2603c220ac97eea1158c91f74028d5;
+  "prime: 6277101735386680763835789423207666416102355444464034512659; primeproj: -3, 6"
+    10 "0x8e3d066daa0462601b2603c220ac97eea1158c91f74028d5, 0x81e00ca4e9c7547e6b9d84417038eb1a81f1f74b730e0e1e"
+    0b8e3d066daa0462601b2603c220ac97eea1158c91f74028d5;
+  "prime: 6277101735386680763835789423207666416102355444464034512659; primeproj: -3, 6"
+    4 "0x8e3d066daa0462601b2603c220ac97eea1158c91f74028d5, 0x81e00ca4e9c7547e6b9d84417038eb1a81f1f74b730e0e1e"
+    048e3d066daa0462601b2603c220ac97eea1158c91f74028d581e00ca4e9c7547e6b9d84417038eb1a81f1f74b730e0e1e;
+  "prime: 6277101735386680763835789423207666416102355444464034512659; primeproj: -3, 6"
+    6 "0x8e3d066daa0462601b2603c220ac97eea1158c91f74028d5, 0x81e00ca4e9c7547e6b9d84417038eb1a81f1f74b730e0e1e"
+    068e3d066daa0462601b2603c220ac97eea1158c91f74028d581e00ca4e9c7547e6b9d84417038eb1a81f1f74b730e0e1e;
+  "prime: 6277101735386680763835789423207666416102355444464034512659; primeproj: -3, 6"
+    14 "0x8e3d066daa0462601b2603c220ac97eea1158c91f74028d5, 0x81e00ca4e9c7547e6b9d84417038eb1a81f1f74b730e0e1e"
+    0f8e3d066daa0462601b2603c220ac97eea1158c91f74028d581e00ca4e9c7547e6b9d84417038eb1a81f1f74b730e0e1e;
+  "niceprime: 6277101735386680763835789423207666416102355444464034512659; prime: -3, 6"
+    1 "0xbb74d14118b4dcf9df267e73c55c60c339cf0a83df1ceb73, 0xf66ca5b4c9b939a6221c5292a4e8a3127382c9dbf2258e57"
+    01bb74d14118b4dcf9df267e73c55c60c339cf0a83df1ceb73;
+  "niceprime: 6277101735386680763835789423207666416102355444464034512659; prime: -3, 6"
+    2 "0xbb74d14118b4dcf9df267e73c55c60c339cf0a83df1ceb73, 0xf66ca5b4c9b939a6221c5292a4e8a3127382c9dbf2258e57"
+    03bb74d14118b4dcf9df267e73c55c60c339cf0a83df1ceb73;
+  "niceprime: 6277101735386680763835789423207666416102355444464034512659; prime: -3, 6"
+    10 "0xbb74d14118b4dcf9df267e73c55c60c339cf0a83df1ceb73, 0xf66ca5b4c9b939a6221c5292a4e8a3127382c9dbf2258e57"
+    0bbb74d14118b4dcf9df267e73c55c60c339cf0a83df1ceb73;
+  "niceprime: 6277101735386680763835789423207666416102355444464034512659; prime: -3, 6"
+    4 "0xbb74d14118b4dcf9df267e73c55c60c339cf0a83df1ceb73, 0xf66ca5b4c9b939a6221c5292a4e8a3127382c9dbf2258e57"
+    04bb74d14118b4dcf9df267e73c55c60c339cf0a83df1ceb73f66ca5b4c9b939a6221c5292a4e8a3127382c9dbf2258e57;
+  "niceprime: 6277101735386680763835789423207666416102355444464034512659; prime: -3, 6"
+    6 "0xbb74d14118b4dcf9df267e73c55c60c339cf0a83df1ceb73, 0xf66ca5b4c9b939a6221c5292a4e8a3127382c9dbf2258e57"
+    07bb74d14118b4dcf9df267e73c55c60c339cf0a83df1ceb73f66ca5b4c9b939a6221c5292a4e8a3127382c9dbf2258e57;
+  "niceprime: 6277101735386680763835789423207666416102355444464034512659; prime: -3, 6"
+    14 "0xbb74d14118b4dcf9df267e73c55c60c339cf0a83df1ceb73, 0xf66ca5b4c9b939a6221c5292a4e8a3127382c9dbf2258e57"
+    0fbb74d14118b4dcf9df267e73c55c60c339cf0a83df1ceb73f66ca5b4c9b939a6221c5292a4e8a3127382c9dbf2258e57;
+  "niceprime: 6277101735386680763835789423207666416102355444464034512659; prime: -3, 6"
+    1 "0x37bfc6ce47a6fbc14fd8cd77cd15284f0e5708b0ba5ec3ab, 0x891e6a87b366fb6046e317f9f7a21f7b65b5519c22af5858"
+    0137bfc6ce47a6fbc14fd8cd77cd15284f0e5708b0ba5ec3ab;
+  "niceprime: 6277101735386680763835789423207666416102355444464034512659; prime: -3, 6"
+    2 "0x37bfc6ce47a6fbc14fd8cd77cd15284f0e5708b0ba5ec3ab, 0x891e6a87b366fb6046e317f9f7a21f7b65b5519c22af5858"
+    0237bfc6ce47a6fbc14fd8cd77cd15284f0e5708b0ba5ec3ab;
+  "niceprime: 6277101735386680763835789423207666416102355444464034512659; prime: -3, 6"
+    10 "0x37bfc6ce47a6fbc14fd8cd77cd15284f0e5708b0ba5ec3ab, 0x891e6a87b366fb6046e317f9f7a21f7b65b5519c22af5858"
+    0b37bfc6ce47a6fbc14fd8cd77cd15284f0e5708b0ba5ec3ab;
+  "niceprime: 6277101735386680763835789423207666416102355444464034512659; prime: -3, 6"
+    4 "0x37bfc6ce47a6fbc14fd8cd77cd15284f0e5708b0ba5ec3ab, 0x891e6a87b366fb6046e317f9f7a21f7b65b5519c22af5858"
+    0437bfc6ce47a6fbc14fd8cd77cd15284f0e5708b0ba5ec3ab891e6a87b366fb6046e317f9f7a21f7b65b5519c22af5858;
+  "niceprime: 6277101735386680763835789423207666416102355444464034512659; prime: -3, 6"
+    6 "0x37bfc6ce47a6fbc14fd8cd77cd15284f0e5708b0ba5ec3ab, 0x891e6a87b366fb6046e317f9f7a21f7b65b5519c22af5858"
+    0637bfc6ce47a6fbc14fd8cd77cd15284f0e5708b0ba5ec3ab891e6a87b366fb6046e317f9f7a21f7b65b5519c22af5858;
+  "niceprime: 6277101735386680763835789423207666416102355444464034512659; prime: -3, 6"
+    14 "0x37bfc6ce47a6fbc14fd8cd77cd15284f0e5708b0ba5ec3ab, 0x891e6a87b366fb6046e317f9f7a21f7b65b5519c22af5858"
+    0f37bfc6ce47a6fbc14fd8cd77cd15284f0e5708b0ba5ec3ab891e6a87b366fb6046e317f9f7a21f7b65b5519c22af5858;
+  "prime: 6277101735386680763835789423207666416102355444464034512659; prime: -3, 6"
+    1 "0xa959703af4d041a6902c197801e88981dc5adc380b576f0, 0xda03f3c8c0f372481cd2a7195f42d7f163e07cd66e149948"
+    010a959703af4d041a6902c197801e88981dc5adc380b576f0;
+  "prime: 6277101735386680763835789423207666416102355444464034512659; prime: -3, 6"
+    2 "0xa959703af4d041a6902c197801e88981dc5adc380b576f0, 0xda03f3c8c0f372481cd2a7195f42d7f163e07cd66e149948"
+    020a959703af4d041a6902c197801e88981dc5adc380b576f0;
+  "prime: 6277101735386680763835789423207666416102355444464034512659; prime: -3, 6"
+    10 "0xa959703af4d041a6902c197801e88981dc5adc380b576f0, 0xda03f3c8c0f372481cd2a7195f42d7f163e07cd66e149948"
+    0b0a959703af4d041a6902c197801e88981dc5adc380b576f0;
+  "prime: 6277101735386680763835789423207666416102355444464034512659; prime: -3, 6"
+    4 "0xa959703af4d041a6902c197801e88981dc5adc380b576f0, 0xda03f3c8c0f372481cd2a7195f42d7f163e07cd66e149948"
+    040a959703af4d041a6902c197801e88981dc5adc380b576f0da03f3c8c0f372481cd2a7195f42d7f163e07cd66e149948;
+  "prime: 6277101735386680763835789423207666416102355444464034512659; prime: -3, 6"
+    6 "0xa959703af4d041a6902c197801e88981dc5adc380b576f0, 0xda03f3c8c0f372481cd2a7195f42d7f163e07cd66e149948"
+    060a959703af4d041a6902c197801e88981dc5adc380b576f0da03f3c8c0f372481cd2a7195f42d7f163e07cd66e149948;
+  "prime: 6277101735386680763835789423207666416102355444464034512659; prime: -3, 6"
+    14 "0xa959703af4d041a6902c197801e88981dc5adc380b576f0, 0xda03f3c8c0f372481cd2a7195f42d7f163e07cd66e149948"
+    0f0a959703af4d041a6902c197801e88981dc5adc380b576f0da03f3c8c0f372481cd2a7195f42d7f163e07cd66e149948;
+  "prime: 6277101735386680763835789423207666416102355444464034512659; prime: -3, 6"
+    1 "0x4623a4d719dc7022c1b605509f32a46f3321003cd62c8816, 0x7ecbf132abae0654c76c46118a7a58da2131d18258eec2d3"
+    014623a4d719dc7022c1b605509f32a46f3321003cd62c8816;
+  "prime: 6277101735386680763835789423207666416102355444464034512659; prime: -3, 6"
+    2 "0x4623a4d719dc7022c1b605509f32a46f3321003cd62c8816, 0x7ecbf132abae0654c76c46118a7a58da2131d18258eec2d3"
+    034623a4d719dc7022c1b605509f32a46f3321003cd62c8816;
+  "prime: 6277101735386680763835789423207666416102355444464034512659; prime: -3, 6"
+    10 "0x4623a4d719dc7022c1b605509f32a46f3321003cd62c8816, 0x7ecbf132abae0654c76c46118a7a58da2131d18258eec2d3"
+    0a4623a4d719dc7022c1b605509f32a46f3321003cd62c8816;
+  "prime: 6277101735386680763835789423207666416102355444464034512659; prime: -3, 6"
+    4 "0x4623a4d719dc7022c1b605509f32a46f3321003cd62c8816, 0x7ecbf132abae0654c76c46118a7a58da2131d18258eec2d3"
+    044623a4d719dc7022c1b605509f32a46f3321003cd62c88167ecbf132abae0654c76c46118a7a58da2131d18258eec2d3;
+  "prime: 6277101735386680763835789423207666416102355444464034512659; prime: -3, 6"
+    6 "0x4623a4d719dc7022c1b605509f32a46f3321003cd62c8816, 0x7ecbf132abae0654c76c46118a7a58da2131d18258eec2d3"
+    074623a4d719dc7022c1b605509f32a46f3321003cd62c88167ecbf132abae0654c76c46118a7a58da2131d18258eec2d3;
+  "prime: 6277101735386680763835789423207666416102355444464034512659; prime: -3, 6"
+    14 "0x4623a4d719dc7022c1b605509f32a46f3321003cd62c8816, 0x7ecbf132abae0654c76c46118a7a58da2131d18258eec2d3"
+    0e4623a4d719dc7022c1b605509f32a46f3321003cd62c88167ecbf132abae0654c76c46118a7a58da2131d18258eec2d3;
+  "niceprime: 6277101735386680763835789423207666416102355444464034512659; prime: -3, 6"
+    1 "0xfedded746826e542ca2b081a82915ceb1b9963182d3d58ad, 0x81213af27a8c1ab7da224f7336547415fb60bc26a5676b37"
+    01fedded746826e542ca2b081a82915ceb1b9963182d3d58ad;
+  "niceprime: 6277101735386680763835789423207666416102355444464034512659; prime: -3, 6"
+    2 "0xfedded746826e542ca2b081a82915ceb1b9963182d3d58ad, 0x81213af27a8c1ab7da224f7336547415fb60bc26a5676b37"
+    03fedded746826e542ca2b081a82915ceb1b9963182d3d58ad;
+  "niceprime: 6277101735386680763835789423207666416102355444464034512659; prime: -3, 6"
+    10 "0xfedded746826e542ca2b081a82915ceb1b9963182d3d58ad, 0x81213af27a8c1ab7da224f7336547415fb60bc26a5676b37"
+    0bfedded746826e542ca2b081a82915ceb1b9963182d3d58ad;
+  "niceprime: 6277101735386680763835789423207666416102355444464034512659; prime: -3, 6"
+    4 "0xfedded746826e542ca2b081a82915ceb1b9963182d3d58ad, 0x81213af27a8c1ab7da224f7336547415fb60bc26a5676b37"
+    04fedded746826e542ca2b081a82915ceb1b9963182d3d58ad81213af27a8c1ab7da224f7336547415fb60bc26a5676b37;
+  "niceprime: 6277101735386680763835789423207666416102355444464034512659; prime: -3, 6"
+    6 "0xfedded746826e542ca2b081a82915ceb1b9963182d3d58ad, 0x81213af27a8c1ab7da224f7336547415fb60bc26a5676b37"
+    07fedded746826e542ca2b081a82915ceb1b9963182d3d58ad81213af27a8c1ab7da224f7336547415fb60bc26a5676b37;
+  "niceprime: 6277101735386680763835789423207666416102355444464034512659; prime: -3, 6"
+    14 "0xfedded746826e542ca2b081a82915ceb1b9963182d3d58ad, 0x81213af27a8c1ab7da224f7336547415fb60bc26a5676b37"
+    0ffedded746826e542ca2b081a82915ceb1b9963182d3d58ad81213af27a8c1ab7da224f7336547415fb60bc26a5676b37;
+  "niceprime: 6277101735386680763835789423207666416102355444464034512659; prime: -3, 6"
+    1 "0x28a0eeb675fe29f76971b45079778d5de3d968f93f47050c, 0xbd10cfb1e2417568dbca10f503f52b3e14a0518022492700"
+    0128a0eeb675fe29f76971b45079778d5de3d968f93f47050c;
+  "niceprime: 6277101735386680763835789423207666416102355444464034512659; prime: -3, 6"
+    2 "0x28a0eeb675fe29f76971b45079778d5de3d968f93f47050c, 0xbd10cfb1e2417568dbca10f503f52b3e14a0518022492700"
+    0228a0eeb675fe29f76971b45079778d5de3d968f93f47050c;
+  "niceprime: 6277101735386680763835789423207666416102355444464034512659; prime: -3, 6"
+    10 "0x28a0eeb675fe29f76971b45079778d5de3d968f93f47050c, 0xbd10cfb1e2417568dbca10f503f52b3e14a0518022492700"
+    0b28a0eeb675fe29f76971b45079778d5de3d968f93f47050c;
+  "niceprime: 6277101735386680763835789423207666416102355444464034512659; prime: -3, 6"
+    4 "0x28a0eeb675fe29f76971b45079778d5de3d968f93f47050c, 0xbd10cfb1e2417568dbca10f503f52b3e14a0518022492700"
+    0428a0eeb675fe29f76971b45079778d5de3d968f93f47050cbd10cfb1e2417568dbca10f503f52b3e14a0518022492700;
+  "niceprime: 6277101735386680763835789423207666416102355444464034512659; prime: -3, 6"
+    6 "0x28a0eeb675fe29f76971b45079778d5de3d968f93f47050c, 0xbd10cfb1e2417568dbca10f503f52b3e14a0518022492700"
+    0628a0eeb675fe29f76971b45079778d5de3d968f93f47050cbd10cfb1e2417568dbca10f503f52b3e14a0518022492700;
+  "niceprime: 6277101735386680763835789423207666416102355444464034512659; prime: -3, 6"
+    14 "0x28a0eeb675fe29f76971b45079778d5de3d968f93f47050c, 0xbd10cfb1e2417568dbca10f503f52b3e14a0518022492700"
+    0f28a0eeb675fe29f76971b45079778d5de3d968f93f47050cbd10cfb1e2417568dbca10f503f52b3e14a0518022492700;
+  "prime: 6277101735386680763835789423207666416102355444464034512659; prime: -3, 6"
+    1 "0xaaf5b987bceace823569ef388313c5e4449c34392e5f64ef, 0xd1fb6ef2c107b0e5df50c1e8e1fbcd1d657270c64df3eb95"
+    01aaf5b987bceace823569ef388313c5e4449c34392e5f64ef;
+  "prime: 6277101735386680763835789423207666416102355444464034512659; prime: -3, 6"
+    2 "0xaaf5b987bceace823569ef388313c5e4449c34392e5f64ef, 0xd1fb6ef2c107b0e5df50c1e8e1fbcd1d657270c64df3eb95"
+    03aaf5b987bceace823569ef388313c5e4449c34392e5f64ef;
+  "prime: 6277101735386680763835789423207666416102355444464034512659; prime: -3, 6"
+    10 "0xaaf5b987bceace823569ef388313c5e4449c34392e5f64ef, 0xd1fb6ef2c107b0e5df50c1e8e1fbcd1d657270c64df3eb95"
+    0baaf5b987bceace823569ef388313c5e4449c34392e5f64ef;
+  "prime: 6277101735386680763835789423207666416102355444464034512659; prime: -3, 6"
+    4 "0xaaf5b987bceace823569ef388313c5e4449c34392e5f64ef, 0xd1fb6ef2c107b0e5df50c1e8e1fbcd1d657270c64df3eb95"
+    04aaf5b987bceace823569ef388313c5e4449c34392e5f64efd1fb6ef2c107b0e5df50c1e8e1fbcd1d657270c64df3eb95;
+  "prime: 6277101735386680763835789423207666416102355444464034512659; prime: -3, 6"
+    6 "0xaaf5b987bceace823569ef388313c5e4449c34392e5f64ef, 0xd1fb6ef2c107b0e5df50c1e8e1fbcd1d657270c64df3eb95"
+    07aaf5b987bceace823569ef388313c5e4449c34392e5f64efd1fb6ef2c107b0e5df50c1e8e1fbcd1d657270c64df3eb95;
+  "prime: 6277101735386680763835789423207666416102355444464034512659; prime: -3, 6"
+    14 "0xaaf5b987bceace823569ef388313c5e4449c34392e5f64ef, 0xd1fb6ef2c107b0e5df50c1e8e1fbcd1d657270c64df3eb95"
+    0faaf5b987bceace823569ef388313c5e4449c34392e5f64efd1fb6ef2c107b0e5df50c1e8e1fbcd1d657270c64df3eb95;
+  "niceprime: 6277101735386680763835789423207666416102355444464034512659; prime: -3, 6"
+    1 "0xc0bc160264bbfa1a8c0287e593de6636abeaa4abea4a3c16, 0xb13d51ea528edf923f5bc2227453fa543605fa269b988cff"
+    01c0bc160264bbfa1a8c0287e593de6636abeaa4abea4a3c16;
+  "niceprime: 6277101735386680763835789423207666416102355444464034512659; prime: -3, 6"
+    2 "0xc0bc160264bbfa1a8c0287e593de6636abeaa4abea4a3c16, 0xb13d51ea528edf923f5bc2227453fa543605fa269b988cff"
+    03c0bc160264bbfa1a8c0287e593de6636abeaa4abea4a3c16;
+  "niceprime: 6277101735386680763835789423207666416102355444464034512659; prime: -3, 6"
+    10 "0xc0bc160264bbfa1a8c0287e593de6636abeaa4abea4a3c16, 0xb13d51ea528edf923f5bc2227453fa543605fa269b988cff"
+    0bc0bc160264bbfa1a8c0287e593de6636abeaa4abea4a3c16;
+  "niceprime: 6277101735386680763835789423207666416102355444464034512659; prime: -3, 6"
+    4 "0xc0bc160264bbfa1a8c0287e593de6636abeaa4abea4a3c16, 0xb13d51ea528edf923f5bc2227453fa543605fa269b988cff"
+    04c0bc160264bbfa1a8c0287e593de6636abeaa4abea4a3c16b13d51ea528edf923f5bc2227453fa543605fa269b988cff;
+  "niceprime: 6277101735386680763835789423207666416102355444464034512659; prime: -3, 6"
+    6 "0xc0bc160264bbfa1a8c0287e593de6636abeaa4abea4a3c16, 0xb13d51ea528edf923f5bc2227453fa543605fa269b988cff"
+    07c0bc160264bbfa1a8c0287e593de6636abeaa4abea4a3c16b13d51ea528edf923f5bc2227453fa543605fa269b988cff;
+  "niceprime: 6277101735386680763835789423207666416102355444464034512659; prime: -3, 6"
+    14 "0xc0bc160264bbfa1a8c0287e593de6636abeaa4abea4a3c16, 0xb13d51ea528edf923f5bc2227453fa543605fa269b988cff"
+    0fc0bc160264bbfa1a8c0287e593de6636abeaa4abea4a3c16b13d51ea528edf923f5bc2227453fa543605fa269b988cff;
+  "prime: 6277101735386680763835789423207666416102355444464034512659; primeproj: -3, 6"
+    1 "0x8d28805d0f539dea575b2f1a7b6713984a9725deadccd4c4, 0x9a3c63546b326fab597a7ba634cc4d81c23e51b9db4caa88"
+    018d28805d0f539dea575b2f1a7b6713984a9725deadccd4c4;
+  "prime: 6277101735386680763835789423207666416102355444464034512659; primeproj: -3, 6"
+    2 "0x8d28805d0f539dea575b2f1a7b6713984a9725deadccd4c4, 0x9a3c63546b326fab597a7ba634cc4d81c23e51b9db4caa88"
+    028d28805d0f539dea575b2f1a7b6713984a9725deadccd4c4;
+  "prime: 6277101735386680763835789423207666416102355444464034512659; primeproj: -3, 6"
+    10 "0x8d28805d0f539dea575b2f1a7b6713984a9725deadccd4c4, 0x9a3c63546b326fab597a7ba634cc4d81c23e51b9db4caa88"
+    0b8d28805d0f539dea575b2f1a7b6713984a9725deadccd4c4;
+  "prime: 6277101735386680763835789423207666416102355444464034512659; primeproj: -3, 6"
+    4 "0x8d28805d0f539dea575b2f1a7b6713984a9725deadccd4c4, 0x9a3c63546b326fab597a7ba634cc4d81c23e51b9db4caa88"
+    048d28805d0f539dea575b2f1a7b6713984a9725deadccd4c49a3c63546b326fab597a7ba634cc4d81c23e51b9db4caa88;
+  "prime: 6277101735386680763835789423207666416102355444464034512659; primeproj: -3, 6"
+    6 "0x8d28805d0f539dea575b2f1a7b6713984a9725deadccd4c4, 0x9a3c63546b326fab597a7ba634cc4d81c23e51b9db4caa88"
+    068d28805d0f539dea575b2f1a7b6713984a9725deadccd4c49a3c63546b326fab597a7ba634cc4d81c23e51b9db4caa88;
+  "prime: 6277101735386680763835789423207666416102355444464034512659; primeproj: -3, 6"
+    14 "0x8d28805d0f539dea575b2f1a7b6713984a9725deadccd4c4, 0x9a3c63546b326fab597a7ba634cc4d81c23e51b9db4caa88"
+    0f8d28805d0f539dea575b2f1a7b6713984a9725deadccd4c49a3c63546b326fab597a7ba634cc4d81c23e51b9db4caa88;
+  "prime: 6277101735386680763835789423207666416102355444464034512659; primeproj: -3, 6"
+    1 "0x30c1009254a80c9e19814c3a8cb949b3a7913d59c8ff38d7, 0xb4fbfc5d1c97fa3c7181998c89121f3bf3272499a4419abc"
+    0130c1009254a80c9e19814c3a8cb949b3a7913d59c8ff38d7;
+  "prime: 6277101735386680763835789423207666416102355444464034512659; primeproj: -3, 6"
+    2 "0x30c1009254a80c9e19814c3a8cb949b3a7913d59c8ff38d7, 0xb4fbfc5d1c97fa3c7181998c89121f3bf3272499a4419abc"
+    0230c1009254a80c9e19814c3a8cb949b3a7913d59c8ff38d7;
+  "prime: 6277101735386680763835789423207666416102355444464034512659; primeproj: -3, 6"
+    10 "0x30c1009254a80c9e19814c3a8cb949b3a7913d59c8ff38d7, 0xb4fbfc5d1c97fa3c7181998c89121f3bf3272499a4419abc"
+    0b30c1009254a80c9e19814c3a8cb949b3a7913d59c8ff38d7;
+  "prime: 6277101735386680763835789423207666416102355444464034512659; primeproj: -3, 6"
+    4 "0x30c1009254a80c9e19814c3a8cb949b3a7913d59c8ff38d7, 0xb4fbfc5d1c97fa3c7181998c89121f3bf3272499a4419abc"
+    0430c1009254a80c9e19814c3a8cb949b3a7913d59c8ff38d7b4fbfc5d1c97fa3c7181998c89121f3bf3272499a4419abc;
+  "prime: 6277101735386680763835789423207666416102355444464034512659; primeproj: -3, 6"
+    6 "0x30c1009254a80c9e19814c3a8cb949b3a7913d59c8ff38d7, 0xb4fbfc5d1c97fa3c7181998c89121f3bf3272499a4419abc"
+    0630c1009254a80c9e19814c3a8cb949b3a7913d59c8ff38d7b4fbfc5d1c97fa3c7181998c89121f3bf3272499a4419abc;
+  "prime: 6277101735386680763835789423207666416102355444464034512659; primeproj: -3, 6"
+    14 "0x30c1009254a80c9e19814c3a8cb949b3a7913d59c8ff38d7, 0xb4fbfc5d1c97fa3c7181998c89121f3bf3272499a4419abc"
+    0f30c1009254a80c9e19814c3a8cb949b3a7913d59c8ff38d7b4fbfc5d1c97fa3c7181998c89121f3bf3272499a4419abc;
+  "prime: 6277101735386680763835789423207666416102355444464034512659; primeproj: -3, 6"
+    1 "0xfed74b21991dfc2b65a0d1ed84ae2735c095274fd35090e6, 0x8663021171c4a6476715bfe479d338dfb5eb631780371c2f"
+    01fed74b21991dfc2b65a0d1ed84ae2735c095274fd35090e6;
+  "prime: 6277101735386680763835789423207666416102355444464034512659; primeproj: -3, 6"
+    2 "0xfed74b21991dfc2b65a0d1ed84ae2735c095274fd35090e6, 0x8663021171c4a6476715bfe479d338dfb5eb631780371c2f"
+    03fed74b21991dfc2b65a0d1ed84ae2735c095274fd35090e6;
+  "prime: 6277101735386680763835789423207666416102355444464034512659; primeproj: -3, 6"
+    10 "0xfed74b21991dfc2b65a0d1ed84ae2735c095274fd35090e6, 0x8663021171c4a6476715bfe479d338dfb5eb631780371c2f"
+    0bfed74b21991dfc2b65a0d1ed84ae2735c095274fd35090e6;
+  "prime: 6277101735386680763835789423207666416102355444464034512659; primeproj: -3, 6"
+    4 "0xfed74b21991dfc2b65a0d1ed84ae2735c095274fd35090e6, 0x8663021171c4a6476715bfe479d338dfb5eb631780371c2f"
+    04fed74b21991dfc2b65a0d1ed84ae2735c095274fd35090e68663021171c4a6476715bfe479d338dfb5eb631780371c2f;
+  "prime: 6277101735386680763835789423207666416102355444464034512659; primeproj: -3, 6"
+    6 "0xfed74b21991dfc2b65a0d1ed84ae2735c095274fd35090e6, 0x8663021171c4a6476715bfe479d338dfb5eb631780371c2f"
+    07fed74b21991dfc2b65a0d1ed84ae2735c095274fd35090e68663021171c4a6476715bfe479d338dfb5eb631780371c2f;
+  "prime: 6277101735386680763835789423207666416102355444464034512659; primeproj: -3, 6"
+    14 "0xfed74b21991dfc2b65a0d1ed84ae2735c095274fd35090e6, 0x8663021171c4a6476715bfe479d338dfb5eb631780371c2f"
+    0ffed74b21991dfc2b65a0d1ed84ae2735c095274fd35090e68663021171c4a6476715bfe479d338dfb5eb631780371c2f;
+  "prime: 6277101735386680763835789423207666416102355444464034512659; primeproj: -3, 6"
+    1 "0xf45a53f35a9f363eb6aa5e44a0e55aae7e88a42d5350d497, 0x7ac2f5d8ef0aa9dd362eaef5f67ff607cadd77f6e0f3726e"
+    01f45a53f35a9f363eb6aa5e44a0e55aae7e88a42d5350d497;
+  "prime: 6277101735386680763835789423207666416102355444464034512659; primeproj: -3, 6"
+    2 "0xf45a53f35a9f363eb6aa5e44a0e55aae7e88a42d5350d497, 0x7ac2f5d8ef0aa9dd362eaef5f67ff607cadd77f6e0f3726e"
+    02f45a53f35a9f363eb6aa5e44a0e55aae7e88a42d5350d497;
+  "prime: 6277101735386680763835789423207666416102355444464034512659; primeproj: -3, 6"
+    10 "0xf45a53f35a9f363eb6aa5e44a0e55aae7e88a42d5350d497, 0x7ac2f5d8ef0aa9dd362eaef5f67ff607cadd77f6e0f3726e"
+    0af45a53f35a9f363eb6aa5e44a0e55aae7e88a42d5350d497;
+  "prime: 6277101735386680763835789423207666416102355444464034512659; primeproj: -3, 6"
+    4 "0xf45a53f35a9f363eb6aa5e44a0e55aae7e88a42d5350d497, 0x7ac2f5d8ef0aa9dd362eaef5f67ff607cadd77f6e0f3726e"
+    04f45a53f35a9f363eb6aa5e44a0e55aae7e88a42d5350d4977ac2f5d8ef0aa9dd362eaef5f67ff607cadd77f6e0f3726e;
+  "prime: 6277101735386680763835789423207666416102355444464034512659; primeproj: -3, 6"
+    6 "0xf45a53f35a9f363eb6aa5e44a0e55aae7e88a42d5350d497, 0x7ac2f5d8ef0aa9dd362eaef5f67ff607cadd77f6e0f3726e"
+    06f45a53f35a9f363eb6aa5e44a0e55aae7e88a42d5350d4977ac2f5d8ef0aa9dd362eaef5f67ff607cadd77f6e0f3726e;
+  "prime: 6277101735386680763835789423207666416102355444464034512659; primeproj: -3, 6"
+    14 "0xf45a53f35a9f363eb6aa5e44a0e55aae7e88a42d5350d497, 0x7ac2f5d8ef0aa9dd362eaef5f67ff607cadd77f6e0f3726e"
+    0ef45a53f35a9f363eb6aa5e44a0e55aae7e88a42d5350d4977ac2f5d8ef0aa9dd362eaef5f67ff607cadd77f6e0f3726e;
+  "niceprime: 6277101735386680763835789423207666416102355444464034512659; primeproj: -3, 6"
+    1 "0xa659b529801dd95fa02b818ce706968df366f006ff46f01b, 0x57bf03e04a71ee66fa32e2ac02464bb190c278adfa6aae16"
+    01a659b529801dd95fa02b818ce706968df366f006ff46f01b;
+  "niceprime: 6277101735386680763835789423207666416102355444464034512659; primeproj: -3, 6"
+    2 "0xa659b529801dd95fa02b818ce706968df366f006ff46f01b, 0x57bf03e04a71ee66fa32e2ac02464bb190c278adfa6aae16"
+    02a659b529801dd95fa02b818ce706968df366f006ff46f01b;
+  "niceprime: 6277101735386680763835789423207666416102355444464034512659; primeproj: -3, 6"
+    10 "0xa659b529801dd95fa02b818ce706968df366f006ff46f01b, 0x57bf03e04a71ee66fa32e2ac02464bb190c278adfa6aae16"
+    0aa659b529801dd95fa02b818ce706968df366f006ff46f01b;
+  "niceprime: 6277101735386680763835789423207666416102355444464034512659; primeproj: -3, 6"
+    4 "0xa659b529801dd95fa02b818ce706968df366f006ff46f01b, 0x57bf03e04a71ee66fa32e2ac02464bb190c278adfa6aae16"
+    04a659b529801dd95fa02b818ce706968df366f006ff46f01b57bf03e04a71ee66fa32e2ac02464bb190c278adfa6aae16;
+  "niceprime: 6277101735386680763835789423207666416102355444464034512659; primeproj: -3, 6"
+    6 "0xa659b529801dd95fa02b818ce706968df366f006ff46f01b, 0x57bf03e04a71ee66fa32e2ac02464bb190c278adfa6aae16"
+    06a659b529801dd95fa02b818ce706968df366f006ff46f01b57bf03e04a71ee66fa32e2ac02464bb190c278adfa6aae16;
+  "niceprime: 6277101735386680763835789423207666416102355444464034512659; primeproj: -3, 6"
+    14 "0xa659b529801dd95fa02b818ce706968df366f006ff46f01b, 0x57bf03e04a71ee66fa32e2ac02464bb190c278adfa6aae16"
+    0ea659b529801dd95fa02b818ce706968df366f006ff46f01b57bf03e04a71ee66fa32e2ac02464bb190c278adfa6aae16;
+  "niceprime: 6277101735386680763835789423207666416102355444464034512659; prime: -3, 6"
+    1 "0xd73c1dfe6a0566e157dd477c364d1ddb7f1ac945742e8655, 0x9b9a1fe9f00c30025f66721db612035b953dca319b1f0438"
+    01d73c1dfe6a0566e157dd477c364d1ddb7f1ac945742e8655;
+  "niceprime: 6277101735386680763835789423207666416102355444464034512659; prime: -3, 6"
+    2 "0xd73c1dfe6a0566e157dd477c364d1ddb7f1ac945742e8655, 0x9b9a1fe9f00c30025f66721db612035b953dca319b1f0438"
+    02d73c1dfe6a0566e157dd477c364d1ddb7f1ac945742e8655;
+  "niceprime: 6277101735386680763835789423207666416102355444464034512659; prime: -3, 6"
+    10 "0xd73c1dfe6a0566e157dd477c364d1ddb7f1ac945742e8655, 0x9b9a1fe9f00c30025f66721db612035b953dca319b1f0438"
+    0bd73c1dfe6a0566e157dd477c364d1ddb7f1ac945742e8655;
+  "niceprime: 6277101735386680763835789423207666416102355444464034512659; prime: -3, 6"
+    4 "0xd73c1dfe6a0566e157dd477c364d1ddb7f1ac945742e8655, 0x9b9a1fe9f00c30025f66721db612035b953dca319b1f0438"
+    04d73c1dfe6a0566e157dd477c364d1ddb7f1ac945742e86559b9a1fe9f00c30025f66721db612035b953dca319b1f0438;
+  "niceprime: 6277101735386680763835789423207666416102355444464034512659; prime: -3, 6"
+    6 "0xd73c1dfe6a0566e157dd477c364d1ddb7f1ac945742e8655, 0x9b9a1fe9f00c30025f66721db612035b953dca319b1f0438"
+    06d73c1dfe6a0566e157dd477c364d1ddb7f1ac945742e86559b9a1fe9f00c30025f66721db612035b953dca319b1f0438;
+  "niceprime: 6277101735386680763835789423207666416102355444464034512659; prime: -3, 6"
+    14 "0xd73c1dfe6a0566e157dd477c364d1ddb7f1ac945742e8655, 0x9b9a1fe9f00c30025f66721db612035b953dca319b1f0438"
+    0fd73c1dfe6a0566e157dd477c364d1ddb7f1ac945742e86559b9a1fe9f00c30025f66721db612035b953dca319b1f0438;
+  "niceprime: 6277101735386680763835789423207666416102355444464034512659; primeproj: -3, 6"
+    1 "0xcdf65dc6c906c5c240dba0d156b911614abe806fa2b8dc0a, 0"
+    01cdf65dc6c906c5c240dba0d156b911614abe806fa2b8dc0a;
+  "niceprime: 6277101735386680763835789423207666416102355444464034512659; primeproj: -3, 6"
+    2 "0xcdf65dc6c906c5c240dba0d156b911614abe806fa2b8dc0a, 0"
+    02cdf65dc6c906c5c240dba0d156b911614abe806fa2b8dc0a;
+  "niceprime: 6277101735386680763835789423207666416102355444464034512659; primeproj: -3, 6"
+    10 "0xcdf65dc6c906c5c240dba0d156b911614abe806fa2b8dc0a, 0"
+    0acdf65dc6c906c5c240dba0d156b911614abe806fa2b8dc0a;
+  "niceprime: 6277101735386680763835789423207666416102355444464034512659; primeproj: -3, 6"
+    4 "0xcdf65dc6c906c5c240dba0d156b911614abe806fa2b8dc0a, 0"
+    04cdf65dc6c906c5c240dba0d156b911614abe806fa2b8dc0a000000000000000000000000000000000000000000000000;
+  "niceprime: 6277101735386680763835789423207666416102355444464034512659; primeproj: -3, 6"
+    6 "0xcdf65dc6c906c5c240dba0d156b911614abe806fa2b8dc0a, 0"
+    06cdf65dc6c906c5c240dba0d156b911614abe806fa2b8dc0a000000000000000000000000000000000000000000000000;
+  "niceprime: 6277101735386680763835789423207666416102355444464034512659; primeproj: -3, 6"
+    14 "0xcdf65dc6c906c5c240dba0d156b911614abe806fa2b8dc0a, 0"
+    0ecdf65dc6c906c5c240dba0d156b911614abe806fa2b8dc0a000000000000000000000000000000000000000000000000;
+  "binpoly: 0x8000000000000000000000000000000000000000000000bb; binproj: 1, 1"
+    1 "0x4343aeb469f003cec07b93cfb49b4ba3c242f3481d2de895, 0x739991100f0cd80ae4be4459374688cc2295a7c4dd65606a"
+    014343aeb469f003cec07b93cfb49b4ba3c242f3481d2de895;
+  "binpoly: 0x8000000000000000000000000000000000000000000000bb; binproj: 1, 1"
+    2 "0x4343aeb469f003cec07b93cfb49b4ba3c242f3481d2de895, 0x739991100f0cd80ae4be4459374688cc2295a7c4dd65606a"
+    034343aeb469f003cec07b93cfb49b4ba3c242f3481d2de895;
+  "binpoly: 0x8000000000000000000000000000000000000000000000bb; binproj: 1, 1"
+    10 "0x4343aeb469f003cec07b93cfb49b4ba3c242f3481d2de895, 0x739991100f0cd80ae4be4459374688cc2295a7c4dd65606a"
+    0b4343aeb469f003cec07b93cfb49b4ba3c242f3481d2de895;
+  "binpoly: 0x8000000000000000000000000000000000000000000000bb; binproj: 1, 1"
+    4 "0x4343aeb469f003cec07b93cfb49b4ba3c242f3481d2de895, 0x739991100f0cd80ae4be4459374688cc2295a7c4dd65606a"
+    044343aeb469f003cec07b93cfb49b4ba3c242f3481d2de895739991100f0cd80ae4be4459374688cc2295a7c4dd65606a;
+  "binpoly: 0x8000000000000000000000000000000000000000000000bb; binproj: 1, 1"
+    6 "0x4343aeb469f003cec07b93cfb49b4ba3c242f3481d2de895, 0x739991100f0cd80ae4be4459374688cc2295a7c4dd65606a"
+    074343aeb469f003cec07b93cfb49b4ba3c242f3481d2de895739991100f0cd80ae4be4459374688cc2295a7c4dd65606a;
+  "binpoly: 0x8000000000000000000000000000000000000000000000bb; binproj: 1, 1"
+    14 "0x4343aeb469f003cec07b93cfb49b4ba3c242f3481d2de895, 0x739991100f0cd80ae4be4459374688cc2295a7c4dd65606a"
+    0f4343aeb469f003cec07b93cfb49b4ba3c242f3481d2de895739991100f0cd80ae4be4459374688cc2295a7c4dd65606a;
+  "binpoly: 0x8000000000000000000000000000000000000000000000bb; binproj: 1, 1"
+    1 "0x5657071b2de1bd5801a7394f8eab5f46638015c8ab667d35, 0x1cf9730b3d828d67ec7a1253cdb5bd610543a7fc1c274cf"
+    015657071b2de1bd5801a7394f8eab5f46638015c8ab667d35;
+  "binpoly: 0x8000000000000000000000000000000000000000000000bb; binproj: 1, 1"
+    2 "0x5657071b2de1bd5801a7394f8eab5f46638015c8ab667d35, 0x1cf9730b3d828d67ec7a1253cdb5bd610543a7fc1c274cf"
+    025657071b2de1bd5801a7394f8eab5f46638015c8ab667d35;
+  "binpoly: 0x8000000000000000000000000000000000000000000000bb; binproj: 1, 1"
+    10 "0x5657071b2de1bd5801a7394f8eab5f46638015c8ab667d35, 0x1cf9730b3d828d67ec7a1253cdb5bd610543a7fc1c274cf"
+    0a5657071b2de1bd5801a7394f8eab5f46638015c8ab667d35;
+  "binpoly: 0x8000000000000000000000000000000000000000000000bb; binproj: 1, 1"
+    4 "0x5657071b2de1bd5801a7394f8eab5f46638015c8ab667d35, 0x1cf9730b3d828d67ec7a1253cdb5bd610543a7fc1c274cf"
+    045657071b2de1bd5801a7394f8eab5f46638015c8ab667d3501cf9730b3d828d67ec7a1253cdb5bd610543a7fc1c274cf;
+  "binpoly: 0x8000000000000000000000000000000000000000000000bb; binproj: 1, 1"
+    6 "0x5657071b2de1bd5801a7394f8eab5f46638015c8ab667d35, 0x1cf9730b3d828d67ec7a1253cdb5bd610543a7fc1c274cf"
+    065657071b2de1bd5801a7394f8eab5f46638015c8ab667d3501cf9730b3d828d67ec7a1253cdb5bd610543a7fc1c274cf;
+  "binpoly: 0x8000000000000000000000000000000000000000000000bb; binproj: 1, 1"
+    14 "0x5657071b2de1bd5801a7394f8eab5f46638015c8ab667d35, 0x1cf9730b3d828d67ec7a1253cdb5bd610543a7fc1c274cf"
+    0e5657071b2de1bd5801a7394f8eab5f46638015c8ab667d3501cf9730b3d828d67ec7a1253cdb5bd610543a7fc1c274cf;
+  "binpoly: 0x8000000000000000000000000000000000000000000000bb; bin: 1, 1"
+    1 "0x64e1b37a072d12e046d1aa025ea3f7de15dfd1a2f9fff063, 0x790e8c70f3914c18ee6af84789ea4f03744202f8a379046c"
+    0164e1b37a072d12e046d1aa025ea3f7de15dfd1a2f9fff063;
+  "binpoly: 0x8000000000000000000000000000000000000000000000bb; bin: 1, 1"
+    2 "0x64e1b37a072d12e046d1aa025ea3f7de15dfd1a2f9fff063, 0x790e8c70f3914c18ee6af84789ea4f03744202f8a379046c"
+    0264e1b37a072d12e046d1aa025ea3f7de15dfd1a2f9fff063;
+  "binpoly: 0x8000000000000000000000000000000000000000000000bb; bin: 1, 1"
+    10 "0x64e1b37a072d12e046d1aa025ea3f7de15dfd1a2f9fff063, 0x790e8c70f3914c18ee6af84789ea4f03744202f8a379046c"
+    0b64e1b37a072d12e046d1aa025ea3f7de15dfd1a2f9fff063;
+  "binpoly: 0x8000000000000000000000000000000000000000000000bb; bin: 1, 1"
+    4 "0x64e1b37a072d12e046d1aa025ea3f7de15dfd1a2f9fff063, 0x790e8c70f3914c18ee6af84789ea4f03744202f8a379046c"
+    0464e1b37a072d12e046d1aa025ea3f7de15dfd1a2f9fff063790e8c70f3914c18ee6af84789ea4f03744202f8a379046c;
+  "binpoly: 0x8000000000000000000000000000000000000000000000bb; bin: 1, 1"
+    6 "0x64e1b37a072d12e046d1aa025ea3f7de15dfd1a2f9fff063, 0x790e8c70f3914c18ee6af84789ea4f03744202f8a379046c"
+    0664e1b37a072d12e046d1aa025ea3f7de15dfd1a2f9fff063790e8c70f3914c18ee6af84789ea4f03744202f8a379046c;
+  "binpoly: 0x8000000000000000000000000000000000000000000000bb; bin: 1, 1"
+    14 "0x64e1b37a072d12e046d1aa025ea3f7de15dfd1a2f9fff063, 0x790e8c70f3914c18ee6af84789ea4f03744202f8a379046c"
+    0f64e1b37a072d12e046d1aa025ea3f7de15dfd1a2f9fff063790e8c70f3914c18ee6af84789ea4f03744202f8a379046c;
+  "binpoly: 0x8000000000000000000000000000000000000000000000bb; binproj: 1, 1"
+    1 "0x541b14ee7b6511e0668c93cdd07a8314095557864083d1b6, 0x3e9e7df6e64439fc956345f8cb9d7786f4dd3552c51b6f49"
+    01541b14ee7b6511e0668c93cdd07a8314095557864083d1b6;
+  "binpoly: 0x8000000000000000000000000000000000000000000000bb; binproj: 1, 1"
+    2 "0x541b14ee7b6511e0668c93cdd07a8314095557864083d1b6, 0x3e9e7df6e64439fc956345f8cb9d7786f4dd3552c51b6f49"
+    02541b14ee7b6511e0668c93cdd07a8314095557864083d1b6;
+  "binpoly: 0x8000000000000000000000000000000000000000000000bb; binproj: 1, 1"
+    10 "0x541b14ee7b6511e0668c93cdd07a8314095557864083d1b6, 0x3e9e7df6e64439fc956345f8cb9d7786f4dd3552c51b6f49"
+    0a541b14ee7b6511e0668c93cdd07a8314095557864083d1b6;
+  "binpoly: 0x8000000000000000000000000000000000000000000000bb; binproj: 1, 1"
+    4 "0x541b14ee7b6511e0668c93cdd07a8314095557864083d1b6, 0x3e9e7df6e64439fc956345f8cb9d7786f4dd3552c51b6f49"
+    04541b14ee7b6511e0668c93cdd07a8314095557864083d1b63e9e7df6e64439fc956345f8cb9d7786f4dd3552c51b6f49;
+  "binpoly: 0x8000000000000000000000000000000000000000000000bb; binproj: 1, 1"
+    6 "0x541b14ee7b6511e0668c93cdd07a8314095557864083d1b6, 0x3e9e7df6e64439fc956345f8cb9d7786f4dd3552c51b6f49"
+    06541b14ee7b6511e0668c93cdd07a8314095557864083d1b63e9e7df6e64439fc956345f8cb9d7786f4dd3552c51b6f49;
+  "binpoly: 0x8000000000000000000000000000000000000000000000bb; binproj: 1, 1"
+    14 "0x541b14ee7b6511e0668c93cdd07a8314095557864083d1b6, 0x3e9e7df6e64439fc956345f8cb9d7786f4dd3552c51b6f49"
+    0e541b14ee7b6511e0668c93cdd07a8314095557864083d1b63e9e7df6e64439fc956345f8cb9d7786f4dd3552c51b6f49;
+  "binpoly: 0x8000000000000000000000000000000000000000000000bb; binproj: 1, 1"
+    1 "0x2411459ff8923241c82d741f0e481c4a5841bbf4f4ec611f, 0x4b05f8ca340830dfe6c1ef0e14ebaba2f9060a297b0fc509"
+    012411459ff8923241c82d741f0e481c4a5841bbf4f4ec611f;
+  "binpoly: 0x8000000000000000000000000000000000000000000000bb; binproj: 1, 1"
+    2 "0x2411459ff8923241c82d741f0e481c4a5841bbf4f4ec611f, 0x4b05f8ca340830dfe6c1ef0e14ebaba2f9060a297b0fc509"
+    022411459ff8923241c82d741f0e481c4a5841bbf4f4ec611f;
+  "binpoly: 0x8000000000000000000000000000000000000000000000bb; binproj: 1, 1"
+    10 "0x2411459ff8923241c82d741f0e481c4a5841bbf4f4ec611f, 0x4b05f8ca340830dfe6c1ef0e14ebaba2f9060a297b0fc509"
+    0a2411459ff8923241c82d741f0e481c4a5841bbf4f4ec611f;
+  "binpoly: 0x8000000000000000000000000000000000000000000000bb; binproj: 1, 1"
+    4 "0x2411459ff8923241c82d741f0e481c4a5841bbf4f4ec611f, 0x4b05f8ca340830dfe6c1ef0e14ebaba2f9060a297b0fc509"
+    042411459ff8923241c82d741f0e481c4a5841bbf4f4ec611f4b05f8ca340830dfe6c1ef0e14ebaba2f9060a297b0fc509;
+  "binpoly: 0x8000000000000000000000000000000000000000000000bb; binproj: 1, 1"
+    6 "0x2411459ff8923241c82d741f0e481c4a5841bbf4f4ec611f, 0x4b05f8ca340830dfe6c1ef0e14ebaba2f9060a297b0fc509"
+    062411459ff8923241c82d741f0e481c4a5841bbf4f4ec611f4b05f8ca340830dfe6c1ef0e14ebaba2f9060a297b0fc509;
+  "binpoly: 0x8000000000000000000000000000000000000000000000bb; binproj: 1, 1"
+    14 "0x2411459ff8923241c82d741f0e481c4a5841bbf4f4ec611f, 0x4b05f8ca340830dfe6c1ef0e14ebaba2f9060a297b0fc509"
+    0e2411459ff8923241c82d741f0e481c4a5841bbf4f4ec611f4b05f8ca340830dfe6c1ef0e14ebaba2f9060a297b0fc509;
+  "binpoly: 0x8000000000000000000000000000000000000000000000bb; binproj: 1, 1"
+    1 "0x7aa7fff05e605a0ce8762d1995a32002f649eae619d3fb13, 0x1f179dcb0f081e292477629556386538450535bb8bf90ed8"
+    017aa7fff05e605a0ce8762d1995a32002f649eae619d3fb13;
+  "binpoly: 0x8000000000000000000000000000000000000000000000bb; binproj: 1, 1"
+    2 "0x7aa7fff05e605a0ce8762d1995a32002f649eae619d3fb13, 0x1f179dcb0f081e292477629556386538450535bb8bf90ed8"
+    037aa7fff05e605a0ce8762d1995a32002f649eae619d3fb13;
+  "binpoly: 0x8000000000000000000000000000000000000000000000bb; binproj: 1, 1"
+    10 "0x7aa7fff05e605a0ce8762d1995a32002f649eae619d3fb13, 0x1f179dcb0f081e292477629556386538450535bb8bf90ed8"
+    0a7aa7fff05e605a0ce8762d1995a32002f649eae619d3fb13;
+  "binpoly: 0x8000000000000000000000000000000000000000000000bb; binproj: 1, 1"
+    4 "0x7aa7fff05e605a0ce8762d1995a32002f649eae619d3fb13, 0x1f179dcb0f081e292477629556386538450535bb8bf90ed8"
+    047aa7fff05e605a0ce8762d1995a32002f649eae619d3fb131f179dcb0f081e292477629556386538450535bb8bf90ed8;
+  "binpoly: 0x8000000000000000000000000000000000000000000000bb; binproj: 1, 1"
+    6 "0x7aa7fff05e605a0ce8762d1995a32002f649eae619d3fb13, 0x1f179dcb0f081e292477629556386538450535bb8bf90ed8"
+    077aa7fff05e605a0ce8762d1995a32002f649eae619d3fb131f179dcb0f081e292477629556386538450535bb8bf90ed8;
+  "binpoly: 0x8000000000000000000000000000000000000000000000bb; binproj: 1, 1"
+    14 "0x7aa7fff05e605a0ce8762d1995a32002f649eae619d3fb13, 0x1f179dcb0f081e292477629556386538450535bb8bf90ed8"
+    0e7aa7fff05e605a0ce8762d1995a32002f649eae619d3fb131f179dcb0f081e292477629556386538450535bb8bf90ed8;
+  "binpoly: 0x8000000000000000000000000000000000000000000000bb; binproj: 1, 1"
+    1 "0x20a8c8bf0d1a18d848879cc2b74babc9cfae943300a7ea01, 0x50582e19e34fb01dd4d071ee43a1a3273f34843de09ed41e"
+    0120a8c8bf0d1a18d848879cc2b74babc9cfae943300a7ea01;
+  "binpoly: 0x8000000000000000000000000000000000000000000000bb; binproj: 1, 1"
+    2 "0x20a8c8bf0d1a18d848879cc2b74babc9cfae943300a7ea01, 0x50582e19e34fb01dd4d071ee43a1a3273f34843de09ed41e"
+    0320a8c8bf0d1a18d848879cc2b74babc9cfae943300a7ea01;
+  "binpoly: 0x8000000000000000000000000000000000000000000000bb; binproj: 1, 1"
+    10 "0x20a8c8bf0d1a18d848879cc2b74babc9cfae943300a7ea01, 0x50582e19e34fb01dd4d071ee43a1a3273f34843de09ed41e"
+    0a20a8c8bf0d1a18d848879cc2b74babc9cfae943300a7ea01;
+  "binpoly: 0x8000000000000000000000000000000000000000000000bb; binproj: 1, 1"
+    4 "0x20a8c8bf0d1a18d848879cc2b74babc9cfae943300a7ea01, 0x50582e19e34fb01dd4d071ee43a1a3273f34843de09ed41e"
+    0420a8c8bf0d1a18d848879cc2b74babc9cfae943300a7ea0150582e19e34fb01dd4d071ee43a1a3273f34843de09ed41e;
+  "binpoly: 0x8000000000000000000000000000000000000000000000bb; binproj: 1, 1"
+    6 "0x20a8c8bf0d1a18d848879cc2b74babc9cfae943300a7ea01, 0x50582e19e34fb01dd4d071ee43a1a3273f34843de09ed41e"
+    0720a8c8bf0d1a18d848879cc2b74babc9cfae943300a7ea0150582e19e34fb01dd4d071ee43a1a3273f34843de09ed41e;
+  "binpoly: 0x8000000000000000000000000000000000000000000000bb; binproj: 1, 1"
+    14 "0x20a8c8bf0d1a18d848879cc2b74babc9cfae943300a7ea01, 0x50582e19e34fb01dd4d071ee43a1a3273f34843de09ed41e"
+    0e20a8c8bf0d1a18d848879cc2b74babc9cfae943300a7ea0150582e19e34fb01dd4d071ee43a1a3273f34843de09ed41e;
+  "binpoly: 0x8000000000000000000000000000000000000000000000bb; binproj: 1, 1"
+    1 "0x1f37333026d4274b4c0401e10d24270ab98d49904a2d4a46, 0x3e598cd0612ca1f7554012eef6036f487e21f5dcce8b8c9a"
+    011f37333026d4274b4c0401e10d24270ab98d49904a2d4a46;
+  "binpoly: 0x8000000000000000000000000000000000000000000000bb; binproj: 1, 1"
+    2 "0x1f37333026d4274b4c0401e10d24270ab98d49904a2d4a46, 0x3e598cd0612ca1f7554012eef6036f487e21f5dcce8b8c9a"
+    021f37333026d4274b4c0401e10d24270ab98d49904a2d4a46;
+  "binpoly: 0x8000000000000000000000000000000000000000000000bb; binproj: 1, 1"
+    10 "0x1f37333026d4274b4c0401e10d24270ab98d49904a2d4a46, 0x3e598cd0612ca1f7554012eef6036f487e21f5dcce8b8c9a"
+    0b1f37333026d4274b4c0401e10d24270ab98d49904a2d4a46;
+  "binpoly: 0x8000000000000000000000000000000000000000000000bb; binproj: 1, 1"
+    4 "0x1f37333026d4274b4c0401e10d24270ab98d49904a2d4a46, 0x3e598cd0612ca1f7554012eef6036f487e21f5dcce8b8c9a"
+    041f37333026d4274b4c0401e10d24270ab98d49904a2d4a463e598cd0612ca1f7554012eef6036f487e21f5dcce8b8c9a;
+  "binpoly: 0x8000000000000000000000000000000000000000000000bb; binproj: 1, 1"
+    6 "0x1f37333026d4274b4c0401e10d24270ab98d49904a2d4a46, 0x3e598cd0612ca1f7554012eef6036f487e21f5dcce8b8c9a"
+    061f37333026d4274b4c0401e10d24270ab98d49904a2d4a463e598cd0612ca1f7554012eef6036f487e21f5dcce8b8c9a;
+  "binpoly: 0x8000000000000000000000000000000000000000000000bb; binproj: 1, 1"
+    14 "0x1f37333026d4274b4c0401e10d24270ab98d49904a2d4a46, 0x3e598cd0612ca1f7554012eef6036f487e21f5dcce8b8c9a"
+    0f1f37333026d4274b4c0401e10d24270ab98d49904a2d4a463e598cd0612ca1f7554012eef6036f487e21f5dcce8b8c9a;
+  "binpoly: 0x8000000000000000000000000000000000000000000000bb; binproj: 1, 1"
+    1 "0x1e49a7bd97ebf1eb5f5baef6525c73156518fe6f61c6201e, 0x373c5bbe1722c0e57f21549e33c0718452850da146af3ccc"
+    011e49a7bd97ebf1eb5f5baef6525c73156518fe6f61c6201e;
+  "binpoly: 0x8000000000000000000000000000000000000000000000bb; binproj: 1, 1"
+    2 "0x1e49a7bd97ebf1eb5f5baef6525c73156518fe6f61c6201e, 0x373c5bbe1722c0e57f21549e33c0718452850da146af3ccc"
+    031e49a7bd97ebf1eb5f5baef6525c73156518fe6f61c6201e;
+  "binpoly: 0x8000000000000000000000000000000000000000000000bb; binproj: 1, 1"
+    10 "0x1e49a7bd97ebf1eb5f5baef6525c73156518fe6f61c6201e, 0x373c5bbe1722c0e57f21549e33c0718452850da146af3ccc"
+    0b1e49a7bd97ebf1eb5f5baef6525c73156518fe6f61c6201e;
+  "binpoly: 0x8000000000000000000000000000000000000000000000bb; binproj: 1, 1"
+    4 "0x1e49a7bd97ebf1eb5f5baef6525c73156518fe6f61c6201e, 0x373c5bbe1722c0e57f21549e33c0718452850da146af3ccc"
+    041e49a7bd97ebf1eb5f5baef6525c73156518fe6f61c6201e373c5bbe1722c0e57f21549e33c0718452850da146af3ccc;
+  "binpoly: 0x8000000000000000000000000000000000000000000000bb; binproj: 1, 1"
+    6 "0x1e49a7bd97ebf1eb5f5baef6525c73156518fe6f61c6201e, 0x373c5bbe1722c0e57f21549e33c0718452850da146af3ccc"
+    071e49a7bd97ebf1eb5f5baef6525c73156518fe6f61c6201e373c5bbe1722c0e57f21549e33c0718452850da146af3ccc;
+  "binpoly: 0x8000000000000000000000000000000000000000000000bb; binproj: 1, 1"
+    14 "0x1e49a7bd97ebf1eb5f5baef6525c73156518fe6f61c6201e, 0x373c5bbe1722c0e57f21549e33c0718452850da146af3ccc"
+    0f1e49a7bd97ebf1eb5f5baef6525c73156518fe6f61c6201e373c5bbe1722c0e57f21549e33c0718452850da146af3ccc;
+  "binpoly: 0x8000000000000000000000000000000000000000000000bb; bin: 1, 1"
+    1 "0x778f1f35c3d626b92bf5431f1f4b8ff58e55f4d928e0b310, 0x4e8ccb18a22d51bcdeeb09c684bad19818d1fc0296493f1d"
+    01778f1f35c3d626b92bf5431f1f4b8ff58e55f4d928e0b310;
+  "binpoly: 0x8000000000000000000000000000000000000000000000bb; bin: 1, 1"
+    2 "0x778f1f35c3d626b92bf5431f1f4b8ff58e55f4d928e0b310, 0x4e8ccb18a22d51bcdeeb09c684bad19818d1fc0296493f1d"
+    03778f1f35c3d626b92bf5431f1f4b8ff58e55f4d928e0b310;
+  "binpoly: 0x8000000000000000000000000000000000000000000000bb; bin: 1, 1"
+    10 "0x778f1f35c3d626b92bf5431f1f4b8ff58e55f4d928e0b310, 0x4e8ccb18a22d51bcdeeb09c684bad19818d1fc0296493f1d"
+    0b778f1f35c3d626b92bf5431f1f4b8ff58e55f4d928e0b310;
+  "binpoly: 0x8000000000000000000000000000000000000000000000bb; bin: 1, 1"
+    4 "0x778f1f35c3d626b92bf5431f1f4b8ff58e55f4d928e0b310, 0x4e8ccb18a22d51bcdeeb09c684bad19818d1fc0296493f1d"
+    04778f1f35c3d626b92bf5431f1f4b8ff58e55f4d928e0b3104e8ccb18a22d51bcdeeb09c684bad19818d1fc0296493f1d;
+  "binpoly: 0x8000000000000000000000000000000000000000000000bb; bin: 1, 1"
+    6 "0x778f1f35c3d626b92bf5431f1f4b8ff58e55f4d928e0b310, 0x4e8ccb18a22d51bcdeeb09c684bad19818d1fc0296493f1d"
+    07778f1f35c3d626b92bf5431f1f4b8ff58e55f4d928e0b3104e8ccb18a22d51bcdeeb09c684bad19818d1fc0296493f1d;
+  "binpoly: 0x8000000000000000000000000000000000000000000000bb; bin: 1, 1"
+    14 "0x778f1f35c3d626b92bf5431f1f4b8ff58e55f4d928e0b310, 0x4e8ccb18a22d51bcdeeb09c684bad19818d1fc0296493f1d"
+    0f778f1f35c3d626b92bf5431f1f4b8ff58e55f4d928e0b3104e8ccb18a22d51bcdeeb09c684bad19818d1fc0296493f1d;
+  "binpoly: 0x8000000000000000000000000000000000000000000000bb; bin: 1, 1"
+    1 "0x55b1efc9de4a137b8b1d029df401e61b0ce1eb7b0ea5fed8, 0x1300fb7ee8bd6abaadc35d2ebab7cc1d7a9a3e51c51a4b97"
+    0155b1efc9de4a137b8b1d029df401e61b0ce1eb7b0ea5fed8;
+  "binpoly: 0x8000000000000000000000000000000000000000000000bb; bin: 1, 1"
+    2 "0x55b1efc9de4a137b8b1d029df401e61b0ce1eb7b0ea5fed8, 0x1300fb7ee8bd6abaadc35d2ebab7cc1d7a9a3e51c51a4b97"
+    0355b1efc9de4a137b8b1d029df401e61b0ce1eb7b0ea5fed8;
+  "binpoly: 0x8000000000000000000000000000000000000000000000bb; bin: 1, 1"
+    10 "0x55b1efc9de4a137b8b1d029df401e61b0ce1eb7b0ea5fed8, 0x1300fb7ee8bd6abaadc35d2ebab7cc1d7a9a3e51c51a4b97"
+    0a55b1efc9de4a137b8b1d029df401e61b0ce1eb7b0ea5fed8;
+  "binpoly: 0x8000000000000000000000000000000000000000000000bb; bin: 1, 1"
+    4 "0x55b1efc9de4a137b8b1d029df401e61b0ce1eb7b0ea5fed8, 0x1300fb7ee8bd6abaadc35d2ebab7cc1d7a9a3e51c51a4b97"
+    0455b1efc9de4a137b8b1d029df401e61b0ce1eb7b0ea5fed81300fb7ee8bd6abaadc35d2ebab7cc1d7a9a3e51c51a4b97;
+  "binpoly: 0x8000000000000000000000000000000000000000000000bb; bin: 1, 1"
+    6 "0x55b1efc9de4a137b8b1d029df401e61b0ce1eb7b0ea5fed8, 0x1300fb7ee8bd6abaadc35d2ebab7cc1d7a9a3e51c51a4b97"
+    0755b1efc9de4a137b8b1d029df401e61b0ce1eb7b0ea5fed81300fb7ee8bd6abaadc35d2ebab7cc1d7a9a3e51c51a4b97;
+  "binpoly: 0x8000000000000000000000000000000000000000000000bb; bin: 1, 1"
+    14 "0x55b1efc9de4a137b8b1d029df401e61b0ce1eb7b0ea5fed8, 0x1300fb7ee8bd6abaadc35d2ebab7cc1d7a9a3e51c51a4b97"
+    0e55b1efc9de4a137b8b1d029df401e61b0ce1eb7b0ea5fed81300fb7ee8bd6abaadc35d2ebab7cc1d7a9a3e51c51a4b97;
+  "binpoly: 0x8000000000000000000000000000000000000000000000bb; binproj: 1, 1"
+    1 "0x4096fd47fd83815c62d39189391813d30757d22eeff22c58, 0x20c650b7df0b5020613d01add02cb8ac12ba4b535e7ec20e"
+    014096fd47fd83815c62d39189391813d30757d22eeff22c58;
+  "binpoly: 0x8000000000000000000000000000000000000000000000bb; binproj: 1, 1"
+    2 "0x4096fd47fd83815c62d39189391813d30757d22eeff22c58, 0x20c650b7df0b5020613d01add02cb8ac12ba4b535e7ec20e"
+    034096fd47fd83815c62d39189391813d30757d22eeff22c58;
+  "binpoly: 0x8000000000000000000000000000000000000000000000bb; binproj: 1, 1"
+    10 "0x4096fd47fd83815c62d39189391813d30757d22eeff22c58, 0x20c650b7df0b5020613d01add02cb8ac12ba4b535e7ec20e"
+    0a4096fd47fd83815c62d39189391813d30757d22eeff22c58;
+  "binpoly: 0x8000000000000000000000000000000000000000000000bb; binproj: 1, 1"
+    4 "0x4096fd47fd83815c62d39189391813d30757d22eeff22c58, 0x20c650b7df0b5020613d01add02cb8ac12ba4b535e7ec20e"
+    044096fd47fd83815c62d39189391813d30757d22eeff22c5820c650b7df0b5020613d01add02cb8ac12ba4b535e7ec20e;
+  "binpoly: 0x8000000000000000000000000000000000000000000000bb; binproj: 1, 1"
+    6 "0x4096fd47fd83815c62d39189391813d30757d22eeff22c58, 0x20c650b7df0b5020613d01add02cb8ac12ba4b535e7ec20e"
+    074096fd47fd83815c62d39189391813d30757d22eeff22c5820c650b7df0b5020613d01add02cb8ac12ba4b535e7ec20e;
+  "binpoly: 0x8000000000000000000000000000000000000000000000bb; binproj: 1, 1"
+    14 "0x4096fd47fd83815c62d39189391813d30757d22eeff22c58, 0x20c650b7df0b5020613d01add02cb8ac12ba4b535e7ec20e"
+    0e4096fd47fd83815c62d39189391813d30757d22eeff22c5820c650b7df0b5020613d01add02cb8ac12ba4b535e7ec20e;
+  "binpoly: 0x8000000000000000000000000000000000000000000000bb; bin: 1, 1"
+    1 "0x19391bbb8ba770803ab78120041b4f93df342a4fa0b211f1, 0x7a48fef3d594f699fdde633a54fa8a1a5bb5d4bf74eb3eee"
+    0119391bbb8ba770803ab78120041b4f93df342a4fa0b211f1;
+  "binpoly: 0x8000000000000000000000000000000000000000000000bb; bin: 1, 1"
+    2 "0x19391bbb8ba770803ab78120041b4f93df342a4fa0b211f1, 0x7a48fef3d594f699fdde633a54fa8a1a5bb5d4bf74eb3eee"
+    0319391bbb8ba770803ab78120041b4f93df342a4fa0b211f1;
+  "binpoly: 0x8000000000000000000000000000000000000000000000bb; bin: 1, 1"
+    10 "0x19391bbb8ba770803ab78120041b4f93df342a4fa0b211f1, 0x7a48fef3d594f699fdde633a54fa8a1a5bb5d4bf74eb3eee"
+    0b19391bbb8ba770803ab78120041b4f93df342a4fa0b211f1;
+  "binpoly: 0x8000000000000000000000000000000000000000000000bb; bin: 1, 1"
+    4 "0x19391bbb8ba770803ab78120041b4f93df342a4fa0b211f1, 0x7a48fef3d594f699fdde633a54fa8a1a5bb5d4bf74eb3eee"
+    0419391bbb8ba770803ab78120041b4f93df342a4fa0b211f17a48fef3d594f699fdde633a54fa8a1a5bb5d4bf74eb3eee;
+  "binpoly: 0x8000000000000000000000000000000000000000000000bb; bin: 1, 1"
+    6 "0x19391bbb8ba770803ab78120041b4f93df342a4fa0b211f1, 0x7a48fef3d594f699fdde633a54fa8a1a5bb5d4bf74eb3eee"
+    0719391bbb8ba770803ab78120041b4f93df342a4fa0b211f17a48fef3d594f699fdde633a54fa8a1a5bb5d4bf74eb3eee;
+  "binpoly: 0x8000000000000000000000000000000000000000000000bb; bin: 1, 1"
+    14 "0x19391bbb8ba770803ab78120041b4f93df342a4fa0b211f1, 0x7a48fef3d594f699fdde633a54fa8a1a5bb5d4bf74eb3eee"
+    0f19391bbb8ba770803ab78120041b4f93df342a4fa0b211f17a48fef3d594f699fdde633a54fa8a1a5bb5d4bf74eb3eee;
+  "binpoly: 0x8000000000000000000000000000000000000000000000bb; bin: 1, 1"
+    1 "0x5c39aacd95a92a49568683996b36a97a4a48dd5d4c2df145, 0x1c7884ec55df4c32b7a6ad44ca2d2d7fb85d13165cf6f1b7"
+    015c39aacd95a92a49568683996b36a97a4a48dd5d4c2df145;
+  "binpoly: 0x8000000000000000000000000000000000000000000000bb; bin: 1, 1"
+    2 "0x5c39aacd95a92a49568683996b36a97a4a48dd5d4c2df145, 0x1c7884ec55df4c32b7a6ad44ca2d2d7fb85d13165cf6f1b7"
+    025c39aacd95a92a49568683996b36a97a4a48dd5d4c2df145;
+  "binpoly: 0x8000000000000000000000000000000000000000000000bb; bin: 1, 1"
+    10 "0x5c39aacd95a92a49568683996b36a97a4a48dd5d4c2df145, 0x1c7884ec55df4c32b7a6ad44ca2d2d7fb85d13165cf6f1b7"
+    0a5c39aacd95a92a49568683996b36a97a4a48dd5d4c2df145;
+  "binpoly: 0x8000000000000000000000000000000000000000000000bb; bin: 1, 1"
+    4 "0x5c39aacd95a92a49568683996b36a97a4a48dd5d4c2df145, 0x1c7884ec55df4c32b7a6ad44ca2d2d7fb85d13165cf6f1b7"
+    045c39aacd95a92a49568683996b36a97a4a48dd5d4c2df1451c7884ec55df4c32b7a6ad44ca2d2d7fb85d13165cf6f1b7;
+  "binpoly: 0x8000000000000000000000000000000000000000000000bb; bin: 1, 1"
+    6 "0x5c39aacd95a92a49568683996b36a97a4a48dd5d4c2df145, 0x1c7884ec55df4c32b7a6ad44ca2d2d7fb85d13165cf6f1b7"
+    065c39aacd95a92a49568683996b36a97a4a48dd5d4c2df1451c7884ec55df4c32b7a6ad44ca2d2d7fb85d13165cf6f1b7;
+  "binpoly: 0x8000000000000000000000000000000000000000000000bb; bin: 1, 1"
+    14 "0x5c39aacd95a92a49568683996b36a97a4a48dd5d4c2df145, 0x1c7884ec55df4c32b7a6ad44ca2d2d7fb85d13165cf6f1b7"
+    0e5c39aacd95a92a49568683996b36a97a4a48dd5d4c2df1451c7884ec55df4c32b7a6ad44ca2d2d7fb85d13165cf6f1b7;
+  "binpoly: 0x8000000000000000000000000000000000000000000000bb; binproj: 1, 1"
+    1 "0x36e17de09989a68c460e8037061e6d50ba39e636437f2a0e, 0x519d1ca5741cbd2094e4da11690a9f9becf7fc2be3d90f43"
+    0136e17de09989a68c460e8037061e6d50ba39e636437f2a0e;
+  "binpoly: 0x8000000000000000000000000000000000000000000000bb; binproj: 1, 1"
+    2 "0x36e17de09989a68c460e8037061e6d50ba39e636437f2a0e, 0x519d1ca5741cbd2094e4da11690a9f9becf7fc2be3d90f43"
+    0336e17de09989a68c460e8037061e6d50ba39e636437f2a0e;
+  "binpoly: 0x8000000000000000000000000000000000000000000000bb; binproj: 1, 1"
+    10 "0x36e17de09989a68c460e8037061e6d50ba39e636437f2a0e, 0x519d1ca5741cbd2094e4da11690a9f9becf7fc2be3d90f43"
+    0a36e17de09989a68c460e8037061e6d50ba39e636437f2a0e;
+  "binpoly: 0x8000000000000000000000000000000000000000000000bb; binproj: 1, 1"
+    4 "0x36e17de09989a68c460e8037061e6d50ba39e636437f2a0e, 0x519d1ca5741cbd2094e4da11690a9f9becf7fc2be3d90f43"
+    0436e17de09989a68c460e8037061e6d50ba39e636437f2a0e519d1ca5741cbd2094e4da11690a9f9becf7fc2be3d90f43;
+  "binpoly: 0x8000000000000000000000000000000000000000000000bb; binproj: 1, 1"
+    6 "0x36e17de09989a68c460e8037061e6d50ba39e636437f2a0e, 0x519d1ca5741cbd2094e4da11690a9f9becf7fc2be3d90f43"
+    0736e17de09989a68c460e8037061e6d50ba39e636437f2a0e519d1ca5741cbd2094e4da11690a9f9becf7fc2be3d90f43;
+  "binpoly: 0x8000000000000000000000000000000000000000000000bb; binproj: 1, 1"
+    14 "0x36e17de09989a68c460e8037061e6d50ba39e636437f2a0e, 0x519d1ca5741cbd2094e4da11690a9f9becf7fc2be3d90f43"
+    0e36e17de09989a68c460e8037061e6d50ba39e636437f2a0e519d1ca5741cbd2094e4da11690a9f9becf7fc2be3d90f43;
+  "binpoly: 0x8000000000000000000000000000000000000000000000bb; binproj: 1, 1"
+    1 "0xe5ae49c08857f870df660ecea0daf49a954add38b2bc360, 0x4ffb1a65b46e7a786c06dc147bb3584bd7d5478a658dc9c"
+    010e5ae49c08857f870df660ecea0daf49a954add38b2bc360;
+  "binpoly: 0x8000000000000000000000000000000000000000000000bb; binproj: 1, 1"
+    2 "0xe5ae49c08857f870df660ecea0daf49a954add38b2bc360, 0x4ffb1a65b46e7a786c06dc147bb3584bd7d5478a658dc9c"
+    020e5ae49c08857f870df660ecea0daf49a954add38b2bc360;
+  "binpoly: 0x8000000000000000000000000000000000000000000000bb; binproj: 1, 1"
+    10 "0xe5ae49c08857f870df660ecea0daf49a954add38b2bc360, 0x4ffb1a65b46e7a786c06dc147bb3584bd7d5478a658dc9c"
+    0a0e5ae49c08857f870df660ecea0daf49a954add38b2bc360;
+  "binpoly: 0x8000000000000000000000000000000000000000000000bb; binproj: 1, 1"
+    4 "0xe5ae49c08857f870df660ecea0daf49a954add38b2bc360, 0x4ffb1a65b46e7a786c06dc147bb3584bd7d5478a658dc9c"
+    040e5ae49c08857f870df660ecea0daf49a954add38b2bc36004ffb1a65b46e7a786c06dc147bb3584bd7d5478a658dc9c;
+  "binpoly: 0x8000000000000000000000000000000000000000000000bb; binproj: 1, 1"
+    6 "0xe5ae49c08857f870df660ecea0daf49a954add38b2bc360, 0x4ffb1a65b46e7a786c06dc147bb3584bd7d5478a658dc9c"
+    060e5ae49c08857f870df660ecea0daf49a954add38b2bc36004ffb1a65b46e7a786c06dc147bb3584bd7d5478a658dc9c;
+  "binpoly: 0x8000000000000000000000000000000000000000000000bb; binproj: 1, 1"
+    14 "0xe5ae49c08857f870df660ecea0daf49a954add38b2bc360, 0x4ffb1a65b46e7a786c06dc147bb3584bd7d5478a658dc9c"
+    0e0e5ae49c08857f870df660ecea0daf49a954add38b2bc36004ffb1a65b46e7a786c06dc147bb3584bd7d5478a658dc9c;
+  "binpoly: 0x8000000000000000000000000000000000000000000000bb; bin: 1, 1"
+    1 "0x6e04125f2dc2365aefa92730915381931b078cedbf629e05, 0x47490d0ed8641541332d5d4ab3ce5b524e9f9357dab4693f"
+    016e04125f2dc2365aefa92730915381931b078cedbf629e05;
+  "binpoly: 0x8000000000000000000000000000000000000000000000bb; bin: 1, 1"
+    2 "0x6e04125f2dc2365aefa92730915381931b078cedbf629e05, 0x47490d0ed8641541332d5d4ab3ce5b524e9f9357dab4693f"
+    036e04125f2dc2365aefa92730915381931b078cedbf629e05;
+  "binpoly: 0x8000000000000000000000000000000000000000000000bb; bin: 1, 1"
+    10 "0x6e04125f2dc2365aefa92730915381931b078cedbf629e05, 0x47490d0ed8641541332d5d4ab3ce5b524e9f9357dab4693f"
+    0b6e04125f2dc2365aefa92730915381931b078cedbf629e05;
+  "binpoly: 0x8000000000000000000000000000000000000000000000bb; bin: 1, 1"
+    4 "0x6e04125f2dc2365aefa92730915381931b078cedbf629e05, 0x47490d0ed8641541332d5d4ab3ce5b524e9f9357dab4693f"
+    046e04125f2dc2365aefa92730915381931b078cedbf629e0547490d0ed8641541332d5d4ab3ce5b524e9f9357dab4693f;
+  "binpoly: 0x8000000000000000000000000000000000000000000000bb; bin: 1, 1"
+    6 "0x6e04125f2dc2365aefa92730915381931b078cedbf629e05, 0x47490d0ed8641541332d5d4ab3ce5b524e9f9357dab4693f"
+    076e04125f2dc2365aefa92730915381931b078cedbf629e0547490d0ed8641541332d5d4ab3ce5b524e9f9357dab4693f;
+  "binpoly: 0x8000000000000000000000000000000000000000000000bb; bin: 1, 1"
+    14 "0x6e04125f2dc2365aefa92730915381931b078cedbf629e05, 0x47490d0ed8641541332d5d4ab3ce5b524e9f9357dab4693f"
+    0f6e04125f2dc2365aefa92730915381931b078cedbf629e0547490d0ed8641541332d5d4ab3ce5b524e9f9357dab4693f;
+  "binpoly: 0x8000000000000000000000000000000000000000000000bb; binproj: 1, 1"
+    1 "0x5c4c6b5bdd62fb20bafaedabb4d97ed468e95cbc3dfd5e76, 0x4932a0e1b6d970ea2a61a7ed2cc2a7fa638ffea834fee0a0"
+    015c4c6b5bdd62fb20bafaedabb4d97ed468e95cbc3dfd5e76;
+  "binpoly: 0x8000000000000000000000000000000000000000000000bb; binproj: 1, 1"
+    2 "0x5c4c6b5bdd62fb20bafaedabb4d97ed468e95cbc3dfd5e76, 0x4932a0e1b6d970ea2a61a7ed2cc2a7fa638ffea834fee0a0"
+    025c4c6b5bdd62fb20bafaedabb4d97ed468e95cbc3dfd5e76;
+  "binpoly: 0x8000000000000000000000000000000000000000000000bb; binproj: 1, 1"
+    10 "0x5c4c6b5bdd62fb20bafaedabb4d97ed468e95cbc3dfd5e76, 0x4932a0e1b6d970ea2a61a7ed2cc2a7fa638ffea834fee0a0"
+    0b5c4c6b5bdd62fb20bafaedabb4d97ed468e95cbc3dfd5e76;
+  "binpoly: 0x8000000000000000000000000000000000000000000000bb; binproj: 1, 1"
+    4 "0x5c4c6b5bdd62fb20bafaedabb4d97ed468e95cbc3dfd5e76, 0x4932a0e1b6d970ea2a61a7ed2cc2a7fa638ffea834fee0a0"
+    045c4c6b5bdd62fb20bafaedabb4d97ed468e95cbc3dfd5e764932a0e1b6d970ea2a61a7ed2cc2a7fa638ffea834fee0a0;
+  "binpoly: 0x8000000000000000000000000000000000000000000000bb; binproj: 1, 1"
+    6 "0x5c4c6b5bdd62fb20bafaedabb4d97ed468e95cbc3dfd5e76, 0x4932a0e1b6d970ea2a61a7ed2cc2a7fa638ffea834fee0a0"
+    065c4c6b5bdd62fb20bafaedabb4d97ed468e95cbc3dfd5e764932a0e1b6d970ea2a61a7ed2cc2a7fa638ffea834fee0a0;
+  "binpoly: 0x8000000000000000000000000000000000000000000000bb; binproj: 1, 1"
+    14 "0x5c4c6b5bdd62fb20bafaedabb4d97ed468e95cbc3dfd5e76, 0x4932a0e1b6d970ea2a61a7ed2cc2a7fa638ffea834fee0a0"
+    0f5c4c6b5bdd62fb20bafaedabb4d97ed468e95cbc3dfd5e764932a0e1b6d970ea2a61a7ed2cc2a7fa638ffea834fee0a0;
+  "binpoly: 0x8000000000000000000000000000000000000000000000bb; binproj: 1, 1"
+    1 "0x6a360d5e7ecfddcf0a9e559084a5449ee6d6af987fc0143f, 0x1a57e78331521a137f4d1c43365b6aee3175b0005a81d213"
+    016a360d5e7ecfddcf0a9e559084a5449ee6d6af987fc0143f;
+  "binpoly: 0x8000000000000000000000000000000000000000000000bb; binproj: 1, 1"
+    2 "0x6a360d5e7ecfddcf0a9e559084a5449ee6d6af987fc0143f, 0x1a57e78331521a137f4d1c43365b6aee3175b0005a81d213"
+    026a360d5e7ecfddcf0a9e559084a5449ee6d6af987fc0143f;
+  "binpoly: 0x8000000000000000000000000000000000000000000000bb; binproj: 1, 1"
+    10 "0x6a360d5e7ecfddcf0a9e559084a5449ee6d6af987fc0143f, 0x1a57e78331521a137f4d1c43365b6aee3175b0005a81d213"
+    0a6a360d5e7ecfddcf0a9e559084a5449ee6d6af987fc0143f;
+  "binpoly: 0x8000000000000000000000000000000000000000000000bb; binproj: 1, 1"
+    4 "0x6a360d5e7ecfddcf0a9e559084a5449ee6d6af987fc0143f, 0x1a57e78331521a137f4d1c43365b6aee3175b0005a81d213"
+    046a360d5e7ecfddcf0a9e559084a5449ee6d6af987fc0143f1a57e78331521a137f4d1c43365b6aee3175b0005a81d213;
+  "binpoly: 0x8000000000000000000000000000000000000000000000bb; binproj: 1, 1"
+    6 "0x6a360d5e7ecfddcf0a9e559084a5449ee6d6af987fc0143f, 0x1a57e78331521a137f4d1c43365b6aee3175b0005a81d213"
+    066a360d5e7ecfddcf0a9e559084a5449ee6d6af987fc0143f1a57e78331521a137f4d1c43365b6aee3175b0005a81d213;
+  "binpoly: 0x8000000000000000000000000000000000000000000000bb; binproj: 1, 1"
+    14 "0x6a360d5e7ecfddcf0a9e559084a5449ee6d6af987fc0143f, 0x1a57e78331521a137f4d1c43365b6aee3175b0005a81d213"
+    0e6a360d5e7ecfddcf0a9e559084a5449ee6d6af987fc0143f1a57e78331521a137f4d1c43365b6aee3175b0005a81d213;
+  "binpoly: 0x8000000000000000000000000000000000000000000000bb; binproj: 1, 1"
+    1 "0x157dd5cf6e5569889fd2134a43ec65d9577ee52f16304717, 0x3adcce30cceea003b91178b3508c445fdc3533dc5b687c08"
+    01157dd5cf6e5569889fd2134a43ec65d9577ee52f16304717;
+  "binpoly: 0x8000000000000000000000000000000000000000000000bb; binproj: 1, 1"
+    2 "0x157dd5cf6e5569889fd2134a43ec65d9577ee52f16304717, 0x3adcce30cceea003b91178b3508c445fdc3533dc5b687c08"
+    02157dd5cf6e5569889fd2134a43ec65d9577ee52f16304717;
+  "binpoly: 0x8000000000000000000000000000000000000000000000bb; binproj: 1, 1"
+    10 "0x157dd5cf6e5569889fd2134a43ec65d9577ee52f16304717, 0x3adcce30cceea003b91178b3508c445fdc3533dc5b687c08"
+    0b157dd5cf6e5569889fd2134a43ec65d9577ee52f16304717;
+  "binpoly: 0x8000000000000000000000000000000000000000000000bb; binproj: 1, 1"
+    4 "0x157dd5cf6e5569889fd2134a43ec65d9577ee52f16304717, 0x3adcce30cceea003b91178b3508c445fdc3533dc5b687c08"
+    04157dd5cf6e5569889fd2134a43ec65d9577ee52f163047173adcce30cceea003b91178b3508c445fdc3533dc5b687c08;
+  "binpoly: 0x8000000000000000000000000000000000000000000000bb; binproj: 1, 1"
+    6 "0x157dd5cf6e5569889fd2134a43ec65d9577ee52f16304717, 0x3adcce30cceea003b91178b3508c445fdc3533dc5b687c08"
+    06157dd5cf6e5569889fd2134a43ec65d9577ee52f163047173adcce30cceea003b91178b3508c445fdc3533dc5b687c08;
+  "binpoly: 0x8000000000000000000000000000000000000000000000bb; binproj: 1, 1"
+    14 "0x157dd5cf6e5569889fd2134a43ec65d9577ee52f16304717, 0x3adcce30cceea003b91178b3508c445fdc3533dc5b687c08"
+    0f157dd5cf6e5569889fd2134a43ec65d9577ee52f163047173adcce30cceea003b91178b3508c445fdc3533dc5b687c08;
+  "binpoly: 0x8000000000000000000000000000000000000000000000bb; bin: 1, 1"
+    1 "0, 1"
+    01000000000000000000000000000000000000000000000000;
+  "binpoly: 0x8000000000000000000000000000000000000000000000bb; bin: 1, 1"
+    2 "0, 1"
+    02000000000000000000000000000000000000000000000000;
+  "binpoly: 0x8000000000000000000000000000000000000000000000bb; bin: 1, 1"
+    10 "0, 1"
+    0a000000000000000000000000000000000000000000000000;
+  "binpoly: 0x8000000000000000000000000000000000000000000000bb; bin: 1, 1"
+    4 "0, 1"
+    04000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001;
+  "binpoly: 0x8000000000000000000000000000000000000000000000bb; bin: 1, 1"
+    6 "0, 1"
+    06000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001;
+  "binpoly: 0x8000000000000000000000000000000000000000000000bb; bin: 1, 1"
+    14 "0, 1"
+    0e000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001;
+}
+
+os2ecp {
+  "prime: 6277101735386680763835789423207666416083908700390324961279
+     prime: -3, 0x64210519e59c80e70fa7e9ab72243049feb8deecc146b9b1"
+     4 00ff inf 1;
+
+  ## Mismatch between flags and descriptor.
+  "prime: 6277101735386680763835789423207666416102355444464034512659; primeproj: -3, 6"
+    1 01694f1d5405eaa694093ce90cd20f4452407cec983f2ad29e
+    "0x694f1d5405eaa694093ce90cd20f4452407cec983f2ad29e, 0x2416f0c58db563c1ebe8abb83ad992dea937df9f775575fe" 0;
+  "prime: 6277101735386680763835789423207666416102355444464034512659; primeproj: -3, 6"
+    14 01694f1d5405eaa694093ce90cd20f4452407cec983f2ad29e
+    FAIL -1;
+
+  "prime: 6277101735386680763835789423207666416102355444464034512659; primeproj: -3, 6"
+    2 02694f1d5405eaa694093ce90cd20f4452407cec983f2ad29e
+    "0x694f1d5405eaa694093ce90cd20f4452407cec983f2ad29e, 0x2416f0c58db563c1ebe8abb83ad992dea937df9f775575fe" 0;
+  "prime: 6277101735386680763835789423207666416102355444464034512659; primeproj: -3, 6"
+    13 02694f1d5405eaa694093ce90cd20f4452407cec983f2ad29e
+    FAIL -1;
+
+  "prime: 6277101735386680763835789423207666416102355444464034512659; primeproj: -3, 6"
+    8 0b694f1d5405eaa694093ce90cd20f4452407cec983f2ad29e
+    "0x694f1d5405eaa694093ce90cd20f4452407cec983f2ad29e, 0xdbe90f3a724a9c3e14175447c5266d2156c8206088aa8915" 0;
+  "prime: 6277101735386680763835789423207666416102355444464034512659; primeproj: -3, 6"
+    7 0b694f1d5405eaa694093ce90cd20f4452407cec983f2ad29e
+    FAIL -1;
+
+  "prime: 6277101735386680763835789423207666416102355444464034512659; primeproj: -3, 6"
+    4 04694f1d5405eaa694093ce90cd20f4452407cec983f2ad29e2416f0c58db563c1ebe8abb83ad992dea937df9f775575fe
+    "0x694f1d5405eaa694093ce90cd20f4452407cec983f2ad29e, 0x2416f0c58db563c1ebe8abb83ad992dea937df9f775575fe" 0;
+  "prime: 6277101735386680763835789423207666416102355444464034512659; primeproj: -3, 6"
+    11 04694f1d5405eaa694093ce90cd20f4452407cec983f2ad29e2416f0c58db563c1ebe8abb83ad992dea937df9f775575fe
+    FAIL -1;
+
+  ## (The hybrid forms require /all/ of the applicable flag bits to be set.)
+  "prime: 6277101735386680763835789423207666416102355444464034512659; primeproj: -3, 6"
+    6 06694f1d5405eaa694093ce90cd20f4452407cec983f2ad29e2416f0c58db563c1ebe8abb83ad992dea937df9f775575fe
+    "0x694f1d5405eaa694093ce90cd20f4452407cec983f2ad29e, 0x2416f0c58db563c1ebe8abb83ad992dea937df9f775575fe" 0;
+  "prime: 6277101735386680763835789423207666416102355444464034512659; primeproj: -3, 6"
+    13 06694f1d5405eaa694093ce90cd20f4452407cec983f2ad29e2416f0c58db563c1ebe8abb83ad992dea937df9f775575fe
+    FAIL -1;
+  "prime: 6277101735386680763835789423207666416102355444464034512659; primeproj: -3, 6"
+    11 06694f1d5405eaa694093ce90cd20f4452407cec983f2ad29e2416f0c58db563c1ebe8abb83ad992dea937df9f775575fe
+    FAIL -1;
+
+  "prime: 6277101735386680763835789423207666416102355444464034512659; primeproj: -3, 6"
+    12 0f694f1d5405eaa694093ce90cd20f4452407cec983f2ad29edbe90f3a724a9c3e14175447c5266d2156c8206088aa8915
+    "0x694f1d5405eaa694093ce90cd20f4452407cec983f2ad29e, 0xdbe90f3a724a9c3e14175447c5266d2156c8206088aa8915" 0;
+  "prime: 6277101735386680763835789423207666416102355444464034512659; primeproj: -3, 6"
+    11 0f694f1d5405eaa694093ce90cd20f4452407cec983f2ad29edbe90f3a724a9c3e14175447c5266d2156c8206088aa8915
+    FAIL -1;
+  "prime: 6277101735386680763835789423207666416102355444464034512659; primeproj: -3, 6"
+    7 0f694f1d5405eaa694093ce90cd20f4452407cec983f2ad29edbe90f3a724a9c3e14175447c5266d2156c8206088aa8915
+    FAIL -1;
+
+  ## Truncated inputs.
+  "prime: 6277101735386680763835789423207666416102355444464034512659; primeproj: -3, 6"
+    1 01694f1d5405eaa694093ce90cd20f4452407cec983f2ad2
+    FAIL -1;
+  "prime: 6277101735386680763835789423207666416102355444464034512659; primeproj: -3, 6"
+    2 02694f1d5405eaa694093ce90cd20f4452407cec983f2ad2
+    FAIL -1;
+  "prime: 6277101735386680763835789423207666416102355444464034512659; primeproj: -3, 6"
+    4 04694f1d5405eaa694093ce90cd20f4452407cec983f2ad29e2416f0c58db563c1ebe8abb83ad992dea937df9f775575
+    FAIL -1;
+  "prime: 6277101735386680763835789423207666416102355444464034512659; primeproj: -3, 6"
+    4 04694f1d5405eaa694093ce90cd20f4452407cec983f2ad29e
+    FAIL -1;
+  "prime: 6277101735386680763835789423207666416102355444464034512659; primeproj: -3, 6"
+    6 06694f1d5405eaa694093ce90cd20f4452407cec983f2ad29e2416f0c58db563c1ebe8abb83ad992dea937df9f775575
+    FAIL -1;
+  "prime: 6277101735386680763835789423207666416102355444464034512659; primeproj: -3, 6"
+    6 06694f1d5405eaa694093ce90cd20f4452407cec983f2ad29e
+    FAIL -1;
+  "prime: 6277101735386680763835789423207666416102355444464034512659; primeproj: -3, 6"
+    6 06694f1d5405eaa694093ce90cd20f4452407cec983f2ad2
+    FAIL -1;
+  "prime: 6277101735386680763835789423207666416102355444464034512659; primeproj: -3, 6"
+    8 0b694f1d5405eaa694093ce90cd20f4452407cec983f2ad2
+    FAIL -1;
+  "prime: 6277101735386680763835789423207666416102355444464034512659; primeproj: -3, 6"
+    12 0f694f1d5405eaa694093ce90cd20f4452407cec983f2ad29edbe90f3a724a9c3e14175447c5266d2156c8206088aa89
+    FAIL -1;
+  "prime: 6277101735386680763835789423207666416102355444464034512659; primeproj: -3, 6"
+    12 0f694f1d5405eaa694093ce90cd20f4452407cec983f2ad29e
+    FAIL -1;
+  "prime: 6277101735386680763835789423207666416102355444464034512659; primeproj: -3, 6"
+    12 0f694f1d5405eaa694093ce90cd20f4452407cec983f2ad2
+    FAIL -1;
+
+  ## Some automated tests, from `ec-compr-test.sage'.
+  "prime: 6277101735386680763835789423207666416102355444464034512659; primeproj: -3, 6"
+    1
+    01694f1d5405eaa694093ce90cd20f4452407cec983f2ad29e
+    "0x694f1d5405eaa694093ce90cd20f4452407cec983f2ad29e, 0x2416f0c58db563c1ebe8abb83ad992dea937df9f775575fe"
+    0;
+  "prime: 6277101735386680763835789423207666416102355444464034512659; primeproj: -3, 6"
+    4
+    04694f1d5405eaa694093ce90cd20f4452407cec983f2ad29e2416f0c58db563c1ebe8abb83ad992dea937df9f775575fe30ab74acfcf2dddd34313b2620
+    "0x694f1d5405eaa694093ce90cd20f4452407cec983f2ad29e, 0x2416f0c58db563c1ebe8abb83ad992dea937df9f775575fe"
+    13;
+  "prime: 6277101735386680763835789423207666416102355444464034512659; primeproj: -3, 6"
+    2
+    02694f1d5405eaa694093ce90cd20f4452407cec983f2ad29e902745d7
+    "0x694f1d5405eaa694093ce90cd20f4452407cec983f2ad29e, 0x2416f0c58db563c1ebe8abb83ad992dea937df9f775575fe"
+    4;
+  "prime: 6277101735386680763835789423207666416102355444464034512659; primeproj: -3, 6"
+    6
+    06694f1d5405eaa694093ce90cd20f4452407cec983f2ad29e2416f0c58db563c1ebe8abb83ad992dea937df9f775575fea4bcedf53b
+    "0x694f1d5405eaa694093ce90cd20f4452407cec983f2ad29e, 0x2416f0c58db563c1ebe8abb83ad992dea937df9f775575fe"
+    5;
+  "prime: 6277101735386680763835789423207666416102355444464034512659; primeproj: -3, 6"
+    6
+    07694f1d5405eaa694093ce90cd20f4452407cec983f2ad29e2416f0c58db563c1ebe8abb83ad992dea937df9f775575fe64c00c7867fe5609e164490ba8
+    FAIL
+    13;
+  "prime: 6277101735386680763835789423207666416102355444464034512659; primeproj: -3, 6"
+    8
+    0a694f1d5405eaa694093ce90cd20f4452407cec983f2ad29ed981506b80ec547661eee31c
+    "0x694f1d5405eaa694093ce90cd20f4452407cec983f2ad29e, 0x2416f0c58db563c1ebe8abb83ad992dea937df9f775575fe"
+    12;
+  "prime: 6277101735386680763835789423207666416102355444464034512659; primeproj: -3, 6"
+    12
+    0e694f1d5405eaa694093ce90cd20f4452407cec983f2ad29e2416f0c58db563c1ebe8abb83ad992dea937df9f775575fef4dcc0773b4ffc
+    "0x694f1d5405eaa694093ce90cd20f4452407cec983f2ad29e, 0x2416f0c58db563c1ebe8abb83ad992dea937df9f775575fe"
+    7;
+  "prime: 6277101735386680763835789423207666416102355444464034512659; primeproj: -3, 6"
+    12
+    0f694f1d5405eaa694093ce90cd20f4452407cec983f2ad29e2416f0c58db563c1ebe8abb83ad992dea937df9f775575fe269df3156c6676
+    FAIL
+    7;
+  "prime: 6277101735386680763835789423207666416102355444464034512659; primeproj: -3, 6"
+    1
+    01a83e44fff520fa2a241e771371330957a439af1b0736098b4cccb20d9ae7e18ec1a3
+    "0xa83e44fff520fa2a241e771371330957a439af1b0736098b, 0x1db7040ca8c00351e34b9da93d4ca6f46ac51d6713e7f74d"
+    10;
+  "prime: 6277101735386680763835789423207666416102355444464034512659; primeproj: -3, 6"
+    4
+    04a83e44fff520fa2a241e771371330957a439af1b0736098be248fbf3573ffcae1cb46256c2b3590b953ae298ec1807c68c31b084e289
+    "0xa83e44fff520fa2a241e771371330957a439af1b0736098b, 0xe248fbf3573ffcae1cb46256c2b3590b953ae298ec1807c6"
+    6;
+  "prime: 6277101735386680763835789423207666416102355444464034512659; primeproj: -3, 6"
+    2
+    02a83e44fff520fa2a241e771371330957a439af1b0736098b8ed890
+    "0xa83e44fff520fa2a241e771371330957a439af1b0736098b, 0xe248fbf3573ffcae1cb46256c2b3590b953ae298ec1807c6"
+    3;
+  "prime: 6277101735386680763835789423207666416102355444464034512659; primeproj: -3, 6"
+    6
+    06a83e44fff520fa2a241e771371330957a439af1b0736098be248fbf3573ffcae1cb46256c2b3590b953ae298ec1807c6e26ab73e6537512ca8e5
+    "0xa83e44fff520fa2a241e771371330957a439af1b0736098b, 0xe248fbf3573ffcae1cb46256c2b3590b953ae298ec1807c6"
+    10;
+  "prime: 6277101735386680763835789423207666416102355444464034512659; primeproj: -3, 6"
+    6
+    07a83e44fff520fa2a241e771371330957a439af1b0736098be248fbf3573ffcae1cb46256c2b3590b953ae298ec1807c6b958ca
+    FAIL
+    3;
+  "prime: 6277101735386680763835789423207666416102355444464034512659; primeproj: -3, 6"
+    8
+    0ba83e44fff520fa2a241e771371330957a439af1b0736098b47c5c1b979acd9f653f582b26d
+    "0xa83e44fff520fa2a241e771371330957a439af1b0736098b, 0xe248fbf3573ffcae1cb46256c2b3590b953ae298ec1807c6"
+    13;
+  "prime: 6277101735386680763835789423207666416102355444464034512659; primeproj: -3, 6"
+    12
+    0fa83e44fff520fa2a241e771371330957a439af1b0736098be248fbf3573ffcae1cb46256c2b3590b953ae298ec1807c65c
+    "0xa83e44fff520fa2a241e771371330957a439af1b0736098b, 0xe248fbf3573ffcae1cb46256c2b3590b953ae298ec1807c6"
+    1;
+  "prime: 6277101735386680763835789423207666416102355444464034512659; primeproj: -3, 6"
+    12
+    0ea83e44fff520fa2a241e771371330957a439af1b0736098be248fbf3573ffcae1cb46256c2b3590b953ae298ec1807c600
+    FAIL
+    1;
+  "prime: 6277101735386680763835789423207666416102355444464034512659; primeproj: -3, 6"
+    1
+    01a5b404e72d3b83af5bc9ad477bd6cad966ecd19efabea834c865832d6bf0281080
+    "0xa5b404e72d3b83af5bc9ad477bd6cad966ecd19efabea834, 0x50f9eef6f3fcad11c5607caf554ffd29f24027bec6e7efa6"
+    9;
+  "prime: 6277101735386680763835789423207666416102355444464034512659; primeproj: -3, 6"
+    4
+    04a5b404e72d3b83af5bc9ad477bd6cad966ecd19efabea834af0611090c0352ee3a9f8350aab002d60dbfd84139180f6d0c
+    "0xa5b404e72d3b83af5bc9ad477bd6cad966ecd19efabea834, 0xaf0611090c0352ee3a9f8350aab002d60dbfd84139180f6d"
+    1;
+  "prime: 6277101735386680763835789423207666416102355444464034512659; primeproj: -3, 6"
+    2
+    03a5b404e72d3b83af5bc9ad477bd6cad966ecd19efabea83430b0d7
+    "0xa5b404e72d3b83af5bc9ad477bd6cad966ecd19efabea834, 0xaf0611090c0352ee3a9f8350aab002d60dbfd84139180f6d"
+    3;
+  "prime: 6277101735386680763835789423207666416102355444464034512659; primeproj: -3, 6"
+    6
+    07a5b404e72d3b83af5bc9ad477bd6cad966ecd19efabea834af0611090c0352ee3a9f8350aab002d60dbfd84139180f6d71a5d517693bdcd4d9
+    "0xa5b404e72d3b83af5bc9ad477bd6cad966ecd19efabea834, 0xaf0611090c0352ee3a9f8350aab002d60dbfd84139180f6d"
+    9;
+  "prime: 6277101735386680763835789423207666416102355444464034512659; primeproj: -3, 6"
+    6
+    06a5b404e72d3b83af5bc9ad477bd6cad966ecd19efabea834af0611090c0352ee3a9f8350aab002d60dbfd84139180f6d5a279aafee67d44c04fb
+    FAIL
+    10;
+  "prime: 6277101735386680763835789423207666416102355444464034512659; primeproj: -3, 6"
+    8
+    0ba5b404e72d3b83af5bc9ad477bd6cad966ecd19efabea834c486
+    "0xa5b404e72d3b83af5bc9ad477bd6cad966ecd19efabea834, 0xaf0611090c0352ee3a9f8350aab002d60dbfd84139180f6d"
+    2;
+  "prime: 6277101735386680763835789423207666416102355444464034512659; primeproj: -3, 6"
+    12
+    0fa5b404e72d3b83af5bc9ad477bd6cad966ecd19efabea834af0611090c0352ee3a9f8350aab002d60dbfd84139180f6dca40806b95f8f1eeac69
+    "0xa5b404e72d3b83af5bc9ad477bd6cad966ecd19efabea834, 0xaf0611090c0352ee3a9f8350aab002d60dbfd84139180f6d"
+    10;
+  "prime: 6277101735386680763835789423207666416102355444464034512659; primeproj: -3, 6"
+    12
+    0ea5b404e72d3b83af5bc9ad477bd6cad966ecd19efabea834af0611090c0352ee3a9f8350aab002d60dbfd84139180f6de8f05a09
+    FAIL
+    4;
+  "niceprime: 6277101735386680763835789423207666416102355444464034512659; primeproj: -3, 6"
+    1
+    017c34105e5f122b21f5591b996d7d688d99be3997e3c0649376cb9c6fb755fe720d066d
+    "0x7c34105e5f122b21f5591b996d7d688d99be3997e3c06493, 0x289d5b2e8b647e023d83d0a57cae8729758cd49004d2aff9"
+    11;
+  "niceprime: 6277101735386680763835789423207666416102355444464034512659; primeproj: -3, 6"
+    4
+    047c34105e5f122b21f5591b996d7d688d99be3997e3c06493289d5b2e8b647e023d83d0a57cae8729758cd49004d2aff9c0d4fe238cacef92c0
+    "0x7c34105e5f122b21f5591b996d7d688d99be3997e3c06493, 0x289d5b2e8b647e023d83d0a57cae8729758cd49004d2aff9"
+    9;
+  "niceprime: 6277101735386680763835789423207666416102355444464034512659; primeproj: -3, 6"
+    2
+    037c34105e5f122b21f5591b996d7d688d99be3997e3c06493
+    "0x7c34105e5f122b21f5591b996d7d688d99be3997e3c06493, 0x289d5b2e8b647e023d83d0a57cae8729758cd49004d2aff9"
+    0;
+  "niceprime: 6277101735386680763835789423207666416102355444464034512659; primeproj: -3, 6"
+    6
+    077c34105e5f122b21f5591b996d7d688d99be3997e3c06493289d5b2e8b647e023d83d0a57cae8729758cd49004d2aff91ad71e63007a32b5
+    "0x7c34105e5f122b21f5591b996d7d688d99be3997e3c06493, 0x289d5b2e8b647e023d83d0a57cae8729758cd49004d2aff9"
+    8;
+  "niceprime: 6277101735386680763835789423207666416102355444464034512659; primeproj: -3, 6"
+    6
+    067c34105e5f122b21f5591b996d7d688d99be3997e3c06493289d5b2e8b647e023d83d0a57cae8729758cd49004d2aff9f28ef5c42fdd1ec8c4
+    FAIL
+    9;
+  "niceprime: 6277101735386680763835789423207666416102355444464034512659; primeproj: -3, 6"
+    8
+    0a7c34105e5f122b21f5591b996d7d688d99be3997e3c064938c02448973b55d5e20aadb57
+    "0x7c34105e5f122b21f5591b996d7d688d99be3997e3c06493, 0x289d5b2e8b647e023d83d0a57cae8729758cd49004d2aff9"
+    12;
+  "niceprime: 6277101735386680763835789423207666416102355444464034512659; primeproj: -3, 6"
+    12
+    0e7c34105e5f122b21f5591b996d7d688d99be3997e3c06493289d5b2e8b647e023d83d0a57cae8729758cd49004d2aff98444
+    "0x7c34105e5f122b21f5591b996d7d688d99be3997e3c06493, 0x289d5b2e8b647e023d83d0a57cae8729758cd49004d2aff9"
+    2;
+  "niceprime: 6277101735386680763835789423207666416102355444464034512659; primeproj: -3, 6"
+    12
+    0f7c34105e5f122b21f5591b996d7d688d99be3997e3c06493289d5b2e8b647e023d83d0a57cae8729758cd49004d2aff90f294d8cb7
+    FAIL
+    5;
+  "prime: 6277101735386680763835789423207666416102355444464034512659; primeproj: -3, 6"
+    1
+    01f5d56fd888a0f08841eee7d156f4a91d07a3f2d5c6f3f44d5a15efe5bef116ce56c2
+    "0xf5d56fd888a0f08841eee7d156f4a91d07a3f2d5c6f3f44d, 0x73e62494a7091acee4f1dfc658f4f7894ed94669fc42bac5"
+    10;
+  "prime: 6277101735386680763835789423207666416102355444464034512659; primeproj: -3, 6"
+    4
+    04f5d56fd888a0f08841eee7d156f4a91d07a3f2d5c6f3f44d8c19db6b58f6e5311b0e2039a70b0876b126b99603bd444e9d9d29aa
+    "0xf5d56fd888a0f08841eee7d156f4a91d07a3f2d5c6f3f44d, 0x8c19db6b58f6e5311b0e2039a70b0876b126b99603bd444e"
+    4;
+  "prime: 6277101735386680763835789423207666416102355444464034512659; primeproj: -3, 6"
+    2
+    02f5d56fd888a0f08841eee7d156f4a91d07a3f2d5c6f3f44d401a38d8acea447c3d498da6
+    "0xf5d56fd888a0f08841eee7d156f4a91d07a3f2d5c6f3f44d, 0x8c19db6b58f6e5311b0e2039a70b0876b126b99603bd444e"
+    12;
+  "prime: 6277101735386680763835789423207666416102355444464034512659; primeproj: -3, 6"
+    6
+    06f5d56fd888a0f08841eee7d156f4a91d07a3f2d5c6f3f44d8c19db6b58f6e5311b0e2039a70b0876b126b99603bd444eaa1dba
+    "0xf5d56fd888a0f08841eee7d156f4a91d07a3f2d5c6f3f44d, 0x8c19db6b58f6e5311b0e2039a70b0876b126b99603bd444e"
+    3;
+  "prime: 6277101735386680763835789423207666416102355444464034512659; primeproj: -3, 6"
+    6
+    07f5d56fd888a0f08841eee7d156f4a91d07a3f2d5c6f3f44d8c19db6b58f6e5311b0e2039a70b0876b126b99603bd444e7cac128ce187ce1d8a
+    FAIL
+    9;
+  "prime: 6277101735386680763835789423207666416102355444464034512659; primeproj: -3, 6"
+    8
+    0bf5d56fd888a0f08841eee7d156f4a91d07a3f2d5c6f3f44d834c9a51a3be6b051d0611
+    "0xf5d56fd888a0f08841eee7d156f4a91d07a3f2d5c6f3f44d, 0x8c19db6b58f6e5311b0e2039a70b0876b126b99603bd444e"
+    11;
+  "prime: 6277101735386680763835789423207666416102355444464034512659; primeproj: -3, 6"
+    12
+    0ff5d56fd888a0f08841eee7d156f4a91d07a3f2d5c6f3f44d8c19db6b58f6e5311b0e2039a70b0876b126b99603bd444e7c674eaed42a60283ed840746f
+    "0xf5d56fd888a0f08841eee7d156f4a91d07a3f2d5c6f3f44d, 0x8c19db6b58f6e5311b0e2039a70b0876b126b99603bd444e"
+    13;
+  "prime: 6277101735386680763835789423207666416102355444464034512659; primeproj: -3, 6"
+    12
+    0ef5d56fd888a0f08841eee7d156f4a91d07a3f2d5c6f3f44d8c19db6b58f6e5311b0e2039a70b0876b126b99603bd444e092c2d2a5f4e653318b53f
+    FAIL
+    11;
+  "prime: 6277101735386680763835789423207666416102355444464034512659; prime: -3, 6"
+    1
+    01dc46619f909961b2eae36c1935136d7c9e53741a63a448f818efba0f81bca1862867969187
+    "0xdc46619f909961b2eae36c1935136d7c9e53741a63a448f8, 0x77d0d33fecb0d1049deeee3b1c727a3e9d15a5af81a4e1eb"
+    13;
+  "prime: 6277101735386680763835789423207666416102355444464034512659; prime: -3, 6"
+    4
+    04dc46619f909961b2eae36c1935136d7c9e53741a63a448f877d0d33fecb0d1049deeee3b1c727a3e9d15a5af81a4e1ebc7708d
+    "0xdc46619f909961b2eae36c1935136d7c9e53741a63a448f8, 0x77d0d33fecb0d1049deeee3b1c727a3e9d15a5af81a4e1eb"
+    3;
+  "prime: 6277101735386680763835789423207666416102355444464034512659; prime: -3, 6"
+    2
+    03dc46619f909961b2eae36c1935136d7c9e53741a63a448f843378401fce01374
+    "0xdc46619f909961b2eae36c1935136d7c9e53741a63a448f8, 0x77d0d33fecb0d1049deeee3b1c727a3e9d15a5af81a4e1eb"
+    8;
+  "prime: 6277101735386680763835789423207666416102355444464034512659; prime: -3, 6"
+    6
+    07dc46619f909961b2eae36c1935136d7c9e53741a63a448f877d0d33fecb0d1049deeee3b1c727a3e9d15a5af81a4e1eb96473008b1005b88474e8c04bf
+    "0xdc46619f909961b2eae36c1935136d7c9e53741a63a448f8, 0x77d0d33fecb0d1049deeee3b1c727a3e9d15a5af81a4e1eb"
+    13;
+  "prime: 6277101735386680763835789423207666416102355444464034512659; prime: -3, 6"
+    6
+    06dc46619f909961b2eae36c1935136d7c9e53741a63a448f877d0d33fecb0d1049deeee3b1c727a3e9d15a5af81a4e1eb207d5040
+    FAIL
+    4;
+  "prime: 6277101735386680763835789423207666416102355444464034512659; prime: -3, 6"
+    8
+    0adc46619f909961b2eae36c1935136d7c9e53741a63a448f8d0203736ae9ce5b6
+    "0xdc46619f909961b2eae36c1935136d7c9e53741a63a448f8, 0x77d0d33fecb0d1049deeee3b1c727a3e9d15a5af81a4e1eb"
+    8;
+  "prime: 6277101735386680763835789423207666416102355444464034512659; prime: -3, 6"
+    12
+    0edc46619f909961b2eae36c1935136d7c9e53741a63a448f877d0d33fecb0d1049deeee3b1c727a3e9d15a5af81a4e1ebe41c
+    "0xdc46619f909961b2eae36c1935136d7c9e53741a63a448f8, 0x77d0d33fecb0d1049deeee3b1c727a3e9d15a5af81a4e1eb"
+    2;
+  "prime: 6277101735386680763835789423207666416102355444464034512659; prime: -3, 6"
+    12
+    0fdc46619f909961b2eae36c1935136d7c9e53741a63a448f877d0d33fecb0d1049deeee3b1c727a3e9d15a5af81a4e1eb15c7b71b1b97f8a1
+    FAIL
+    8;
+  "prime: 6277101735386680763835789423207666416102355444464034512659; prime: -3, 6"
+    1
+    01a8f80cd8b48f0fa75505586a6c1e064c8fd5bd99c5fb5dcb7c1b9d55
+    "0xa8f80cd8b48f0fa75505586a6c1e064c8fd5bd99c5fb5dcb, 0x4df2ef0cf197b05bceb0357e1faf3d87f46503429431ea"
+    4;
+  "prime: 6277101735386680763835789423207666416102355444464034512659; prime: -3, 6"
+    4
+    04a8f80cd8b48f0fa75505586a6c1e064c8fd5bd99c5fb5dcb004df2ef0cf197b05bceb0357e1faf3d87f46503429431ea
+    "0xa8f80cd8b48f0fa75505586a6c1e064c8fd5bd99c5fb5dcb, 0x4df2ef0cf197b05bceb0357e1faf3d87f46503429431ea"
+    0;
+  "prime: 6277101735386680763835789423207666416102355444464034512659; prime: -3, 6"
+    2
+    02a8f80cd8b48f0fa75505586a6c1e064c8fd5bd99c5fb5dcb
+    "0xa8f80cd8b48f0fa75505586a6c1e064c8fd5bd99c5fb5dcb, 0x4df2ef0cf197b05bceb0357e1faf3d87f46503429431ea"
+    0;
+  "prime: 6277101735386680763835789423207666416102355444464034512659; prime: -3, 6"
+    6
+    06a8f80cd8b48f0fa75505586a6c1e064c8fd5bd99c5fb5dcb004df2ef0cf197b05bceb0357e1faf3d87f46503429431ea901f
+    "0xa8f80cd8b48f0fa75505586a6c1e064c8fd5bd99c5fb5dcb, 0x4df2ef0cf197b05bceb0357e1faf3d87f46503429431ea"
+    2;
+  "prime: 6277101735386680763835789423207666416102355444464034512659; prime: -3, 6"
+    6
+    07a8f80cd8b48f0fa75505586a6c1e064c8fd5bd99c5fb5dcb004df2ef0cf197b05bceb0357e1faf3d87f46503429431ea22
+    FAIL
+    1;
+  "prime: 6277101735386680763835789423207666416102355444464034512659; prime: -3, 6"
+    8
+    0aa8f80cd8b48f0fa75505586a6c1e064c8fd5bd99c5fb5dcb37145047def7fdf3d2d6794e5e27
+    "0xa8f80cd8b48f0fa75505586a6c1e064c8fd5bd99c5fb5dcb, 0x4df2ef0cf197b05bceb0357e1faf3d87f46503429431ea"
+    14;
+  "prime: 6277101735386680763835789423207666416102355444464034512659; prime: -3, 6"
+    12
+    0ea8f80cd8b48f0fa75505586a6c1e064c8fd5bd99c5fb5dcb004df2ef0cf197b05bceb0357e1faf3d87f46503429431ea87b59d
+    "0xa8f80cd8b48f0fa75505586a6c1e064c8fd5bd99c5fb5dcb, 0x4df2ef0cf197b05bceb0357e1faf3d87f46503429431ea"
+    3;
+  "prime: 6277101735386680763835789423207666416102355444464034512659; prime: -3, 6"
+    12
+    0fa8f80cd8b48f0fa75505586a6c1e064c8fd5bd99c5fb5dcb004df2ef0cf197b05bceb0357e1faf3d87f46503429431eaed3b3b090bcb31
+    FAIL
+    7;
+  "niceprime: 6277101735386680763835789423207666416102355444464034512659; prime: -3, 6"
+    1
+    015a213bc1258f59faa9b5064674a69ba5e7a9d6b5ebf0cd692d
+    "0x5a213bc1258f59faa9b5064674a69ba5e7a9d6b5ebf0cd69, 0x7a53220b6eb8fc3efcd1794368a011cf5f497185d18fb38f"
+    1;
+  "niceprime: 6277101735386680763835789423207666416102355444464034512659; prime: -3, 6"
+    4
+    045a213bc1258f59faa9b5064674a69ba5e7a9d6b5ebf0cd697a53220b6eb8fc3efcd1794368a011cf5f497185d18fb38f397b
+    "0x5a213bc1258f59faa9b5064674a69ba5e7a9d6b5ebf0cd69, 0x7a53220b6eb8fc3efcd1794368a011cf5f497185d18fb38f"
+    2;
+  "niceprime: 6277101735386680763835789423207666416102355444464034512659; prime: -3, 6"
+    2
+    035a213bc1258f59faa9b5064674a69ba5e7a9d6b5ebf0cd690d980cfa784dfb
+    "0x5a213bc1258f59faa9b5064674a69ba5e7a9d6b5ebf0cd69, 0x7a53220b6eb8fc3efcd1794368a011cf5f497185d18fb38f"
+    7;
+  "niceprime: 6277101735386680763835789423207666416102355444464034512659; prime: -3, 6"
+    6
+    075a213bc1258f59faa9b5064674a69ba5e7a9d6b5ebf0cd697a53220b6eb8fc3efcd1794368a011cf5f497185d18fb38f6048a31a2018baaf56
+    "0x5a213bc1258f59faa9b5064674a69ba5e7a9d6b5ebf0cd69, 0x7a53220b6eb8fc3efcd1794368a011cf5f497185d18fb38f"
+    9;
+  "niceprime: 6277101735386680763835789423207666416102355444464034512659; prime: -3, 6"
+    6
+    065a213bc1258f59faa9b5064674a69ba5e7a9d6b5ebf0cd697a53220b6eb8fc3efcd1794368a011cf5f497185d18fb38fa74cdaaea2997808c5
+    FAIL
+    9;
+  "niceprime: 6277101735386680763835789423207666416102355444464034512659; prime: -3, 6"
+    8
+    0a5a213bc1258f59faa9b5064674a69ba5e7a9d6b5ebf0cd69b1c512cb517b
+    "0x5a213bc1258f59faa9b5064674a69ba5e7a9d6b5ebf0cd69, 0x7a53220b6eb8fc3efcd1794368a011cf5f497185d18fb38f"
+    6;
+  "niceprime: 6277101735386680763835789423207666416102355444464034512659; prime: -3, 6"
+    12
+    0e5a213bc1258f59faa9b5064674a69ba5e7a9d6b5ebf0cd697a53220b6eb8fc3efcd1794368a011cf5f497185d18fb38f6874c185d3565a
+    "0x5a213bc1258f59faa9b5064674a69ba5e7a9d6b5ebf0cd69, 0x7a53220b6eb8fc3efcd1794368a011cf5f497185d18fb38f"
+    7;
+  "niceprime: 6277101735386680763835789423207666416102355444464034512659; prime: -3, 6"
+    12
+    0f5a213bc1258f59faa9b5064674a69ba5e7a9d6b5ebf0cd697a53220b6eb8fc3efcd1794368a011cf5f497185d18fb38fb73eae2718
+    FAIL
+    5;
+  "prime: 6277101735386680763835789423207666416102355444464034512659; prime: -3, 6"
+    1
+    01e1a8ab766889961fad7cb7e0b49e3aef58b966757a2c3325217b8f8c3f3f
+    "0xe1a8ab766889961fad7cb7e0b49e3aef58b966757a2c3325, 0x33996e41dce5ceb7f08ae065b4f6f4f917b0c4a37706f367"
+    6;
+  "prime: 6277101735386680763835789423207666416102355444464034512659; prime: -3, 6"
+    4
+    04e1a8ab766889961fad7cb7e0b49e3aef58b966757a2c3325cc6691be231a31480f751f9a4b090b06e84f3b5c88f90bac04cd4eb46208e9
+    "0xe1a8ab766889961fad7cb7e0b49e3aef58b966757a2c3325, 0xcc6691be231a31480f751f9a4b090b06e84f3b5c88f90bac"
+    7;
+  "prime: 6277101735386680763835789423207666416102355444464034512659; prime: -3, 6"
+    2
+    02e1a8ab766889961fad7cb7e0b49e3aef58b966757a2c3325bc
+    "0xe1a8ab766889961fad7cb7e0b49e3aef58b966757a2c3325, 0xcc6691be231a31480f751f9a4b090b06e84f3b5c88f90bac"
+    1;
+  "prime: 6277101735386680763835789423207666416102355444464034512659; prime: -3, 6"
+    6
+    06e1a8ab766889961fad7cb7e0b49e3aef58b966757a2c3325cc6691be231a31480f751f9a4b090b06e84f3b5c88f90bacb8d573e21b8f174323
+    "0xe1a8ab766889961fad7cb7e0b49e3aef58b966757a2c3325, 0xcc6691be231a31480f751f9a4b090b06e84f3b5c88f90bac"
+    9;
+  "prime: 6277101735386680763835789423207666416102355444464034512659; prime: -3, 6"
+    6
+    07e1a8ab766889961fad7cb7e0b49e3aef58b966757a2c3325cc6691be231a31480f751f9a4b090b06e84f3b5c88f90bac24a63e5cba5cf2d4c718369034
+    FAIL
+    13;
+  "prime: 6277101735386680763835789423207666416102355444464034512659; prime: -3, 6"
+    8
+    0be1a8ab766889961fad7cb7e0b49e3aef58b966757a2c332506823810e736a9b5cd
+    "0xe1a8ab766889961fad7cb7e0b49e3aef58b966757a2c3325, 0xcc6691be231a31480f751f9a4b090b06e84f3b5c88f90bac"
+    9;
+  "prime: 6277101735386680763835789423207666416102355444464034512659; prime: -3, 6"
+    12
+    0fe1a8ab766889961fad7cb7e0b49e3aef58b966757a2c3325cc6691be231a31480f751f9a4b090b06e84f3b5c88f90baca9c75bdebad8d546a2f5
+    "0xe1a8ab766889961fad7cb7e0b49e3aef58b966757a2c3325, 0xcc6691be231a31480f751f9a4b090b06e84f3b5c88f90bac"
+    10;
+  "prime: 6277101735386680763835789423207666416102355444464034512659; prime: -3, 6"
+    12
+    0ee1a8ab766889961fad7cb7e0b49e3aef58b966757a2c3325cc6691be231a31480f751f9a4b090b06e84f3b5c88f90bac86d460248f9d
+    FAIL
+    6;
+  "niceprime: 6277101735386680763835789423207666416102355444464034512659; prime: -3, 6"
+    1
+    018b3b579ed1bd8fa70aba6cfa1f2e6c7cc192e94c46d0bc4712
+    "0x8b3b579ed1bd8fa70aba6cfa1f2e6c7cc192e94c46d0bc47, 0x608eae976fb68fe4fd46450756ed16c4aec59ad13975cc6c"
+    1;
+  "niceprime: 6277101735386680763835789423207666416102355444464034512659; prime: -3, 6"
+    4
+    048b3b579ed1bd8fa70aba6cfa1f2e6c7cc192e94c46d0bc47608eae976fb68fe4fd46450756ed16c4aec59ad13975cc6c26fe2fd9
+    "0x8b3b579ed1bd8fa70aba6cfa1f2e6c7cc192e94c46d0bc47, 0x608eae976fb68fe4fd46450756ed16c4aec59ad13975cc6c"
+    4;
+  "niceprime: 6277101735386680763835789423207666416102355444464034512659; prime: -3, 6"
+    2
+    028b3b579ed1bd8fa70aba6cfa1f2e6c7cc192e94c46d0bc47c2a2442f
+    "0x8b3b579ed1bd8fa70aba6cfa1f2e6c7cc192e94c46d0bc47, 0x608eae976fb68fe4fd46450756ed16c4aec59ad13975cc6c"
+    4;
+  "niceprime: 6277101735386680763835789423207666416102355444464034512659; prime: -3, 6"
+    6
+    068b3b579ed1bd8fa70aba6cfa1f2e6c7cc192e94c46d0bc47608eae976fb68fe4fd46450756ed16c4aec59ad13975cc6cd5ac23e091ef51ac
+    "0x8b3b579ed1bd8fa70aba6cfa1f2e6c7cc192e94c46d0bc47, 0x608eae976fb68fe4fd46450756ed16c4aec59ad13975cc6c"
+    8;
+  "niceprime: 6277101735386680763835789423207666416102355444464034512659; prime: -3, 6"
+    6
+    078b3b579ed1bd8fa70aba6cfa1f2e6c7cc192e94c46d0bc47608eae976fb68fe4fd46450756ed16c4aec59ad13975cc6cd8e5fe2bb7f8955594d857290bc3
+    FAIL
+    14;
+  "niceprime: 6277101735386680763835789423207666416102355444464034512659; prime: -3, 6"
+    8
+    0a8b3b579ed1bd8fa70aba6cfa1f2e6c7cc192e94c46d0bc4702603f1896b500fa3326fbe489
+    "0x8b3b579ed1bd8fa70aba6cfa1f2e6c7cc192e94c46d0bc47, 0x608eae976fb68fe4fd46450756ed16c4aec59ad13975cc6c"
+    13;
+  "niceprime: 6277101735386680763835789423207666416102355444464034512659; prime: -3, 6"
+    12
+    0e8b3b579ed1bd8fa70aba6cfa1f2e6c7cc192e94c46d0bc47608eae976fb68fe4fd46450756ed16c4aec59ad13975cc6c
+    "0x8b3b579ed1bd8fa70aba6cfa1f2e6c7cc192e94c46d0bc47, 0x608eae976fb68fe4fd46450756ed16c4aec59ad13975cc6c"
+    0;
+  "niceprime: 6277101735386680763835789423207666416102355444464034512659; prime: -3, 6"
+    12
+    0f8b3b579ed1bd8fa70aba6cfa1f2e6c7cc192e94c46d0bc47608eae976fb68fe4fd46450756ed16c4aec59ad13975cc6c82fd1c5ce10542
+    FAIL
+    7;
+  "niceprime: 6277101735386680763835789423207666416102355444464034512659; prime: -3, 6"
+    1
+    01e5eab6ba916413fba8c4697fac734fa5ffb76451c9a9b964525ab912fb
+    "0xe5eab6ba916413fba8c4697fac734fa5ffb76451c9a9b964, 0x5ba475395248a0872c5a9fa37732a483002951cc149723f3"
+    5;
+  "niceprime: 6277101735386680763835789423207666416102355444464034512659; prime: -3, 6"
+    4
+    04e5eab6ba916413fba8c4697fac734fa5ffb76451c9a9b964a45b8ac6adb75f78d3a5605c88cd5b7cffd6ae33eb68db20eabd7dfa2c22780d0b493c02
+    "0xe5eab6ba916413fba8c4697fac734fa5ffb76451c9a9b964, 0xa45b8ac6adb75f78d3a5605c88cd5b7cffd6ae33eb68db20"
+    12;
+  "niceprime: 6277101735386680763835789423207666416102355444464034512659; prime: -3, 6"
+    2
+    02e5eab6ba916413fba8c4697fac734fa5ffb76451c9a9b964cc4438ee36ffcdec063af021
+    "0xe5eab6ba916413fba8c4697fac734fa5ffb76451c9a9b964, 0xa45b8ac6adb75f78d3a5605c88cd5b7cffd6ae33eb68db20"
+    12;
+  "niceprime: 6277101735386680763835789423207666416102355444464034512659; prime: -3, 6"
+    6
+    06e5eab6ba916413fba8c4697fac734fa5ffb76451c9a9b964a45b8ac6adb75f78d3a5605c88cd5b7cffd6ae33eb68db20d7c754b1997806cf5f60a2be
+    "0xe5eab6ba916413fba8c4697fac734fa5ffb76451c9a9b964, 0xa45b8ac6adb75f78d3a5605c88cd5b7cffd6ae33eb68db20"
+    12;
+  "niceprime: 6277101735386680763835789423207666416102355444464034512659; prime: -3, 6"
+    6
+    07e5eab6ba916413fba8c4697fac734fa5ffb76451c9a9b964a45b8ac6adb75f78d3a5605c88cd5b7cffd6ae33eb68db20c99f2affc4ea
+    FAIL
+    6;
+  "niceprime: 6277101735386680763835789423207666416102355444464034512659; prime: -3, 6"
+    8
+    0be5eab6ba916413fba8c4697fac734fa5ffb76451c9a9b964dc47938e41c5
+    "0xe5eab6ba916413fba8c4697fac734fa5ffb76451c9a9b964, 0xa45b8ac6adb75f78d3a5605c88cd5b7cffd6ae33eb68db20"
+    6;
+  "niceprime: 6277101735386680763835789423207666416102355444464034512659; prime: -3, 6"
+    12
+    0fe5eab6ba916413fba8c4697fac734fa5ffb76451c9a9b964a45b8ac6adb75f78d3a5605c88cd5b7cffd6ae33eb68db202198df77f7dfcb
+    "0xe5eab6ba916413fba8c4697fac734fa5ffb76451c9a9b964, 0xa45b8ac6adb75f78d3a5605c88cd5b7cffd6ae33eb68db20"
+    7;
+  "niceprime: 6277101735386680763835789423207666416102355444464034512659; prime: -3, 6"
+    12
+    0ee5eab6ba916413fba8c4697fac734fa5ffb76451c9a9b964a45b8ac6adb75f78d3a5605c88cd5b7cffd6ae33eb68db20
+    FAIL
+    0;
+  "prime: 6277101735386680763835789423207666416102355444464034512659; primeproj: -3, 6"
+    1
+    01ad47a5035e18fcd30f3a34f48718d2866bb185a93baeb420
+    "0xad47a5035e18fcd30f3a34f48718d2866bb185a93baeb420, 0x7e779ae6fefc5d18bd3abbf8801c04148b4a42309975fd7e"
+    0;
+  "prime: 6277101735386680763835789423207666416102355444464034512659; primeproj: -3, 6"
+    4
+    04ad47a5035e18fcd30f3a34f48718d2866bb185a93baeb4207e779ae6fefc5d18bd3abbf8801c04148b4a42309975fd7e
+    "0xad47a5035e18fcd30f3a34f48718d2866bb185a93baeb420, 0x7e779ae6fefc5d18bd3abbf8801c04148b4a42309975fd7e"
+    0;
+  "prime: 6277101735386680763835789423207666416102355444464034512659; primeproj: -3, 6"
+    2
+    02ad47a5035e18fcd30f3a34f48718d2866bb185a93baeb420fe8569
+    "0xad47a5035e18fcd30f3a34f48718d2866bb185a93baeb420, 0x7e779ae6fefc5d18bd3abbf8801c04148b4a42309975fd7e"
+    3;
+  "prime: 6277101735386680763835789423207666416102355444464034512659; primeproj: -3, 6"
+    6
+    06ad47a5035e18fcd30f3a34f48718d2866bb185a93baeb4207e779ae6fefc5d18bd3abbf8801c04148b4a42309975fd7efb5565
+    "0xad47a5035e18fcd30f3a34f48718d2866bb185a93baeb420, 0x7e779ae6fefc5d18bd3abbf8801c04148b4a42309975fd7e"
+    3;
+  "prime: 6277101735386680763835789423207666416102355444464034512659; primeproj: -3, 6"
+    6
+    07ad47a5035e18fcd30f3a34f48718d2866bb185a93baeb4207e779ae6fefc5d18bd3abbf8801c04148b4a42309975fd7e1997
+    FAIL
+    2;
+  "prime: 6277101735386680763835789423207666416102355444464034512659; primeproj: -3, 6"
+    8
+    0aad47a5035e18fcd30f3a34f48718d2866bb185a93baeb42090d798e6ba5ac7583ee81f9682
+    "0xad47a5035e18fcd30f3a34f48718d2866bb185a93baeb420, 0x7e779ae6fefc5d18bd3abbf8801c04148b4a42309975fd7e"
+    13;
+  "prime: 6277101735386680763835789423207666416102355444464034512659; primeproj: -3, 6"
+    12
+    0ead47a5035e18fcd30f3a34f48718d2866bb185a93baeb4207e779ae6fefc5d18bd3abbf8801c04148b4a42309975fd7e66cbf3
+    "0xad47a5035e18fcd30f3a34f48718d2866bb185a93baeb420, 0x7e779ae6fefc5d18bd3abbf8801c04148b4a42309975fd7e"
+    3;
+  "prime: 6277101735386680763835789423207666416102355444464034512659; primeproj: -3, 6"
+    12
+    0fad47a5035e18fcd30f3a34f48718d2866bb185a93baeb4207e779ae6fefc5d18bd3abbf8801c04148b4a42309975fd7ee9e0d7ab966e0ea4e1c601dc
+    FAIL
+    12;
+  "niceprime: 6277101735386680763835789423207666416102355444464034512659; prime: -3, 6"
+    1
+    0123199c43e03054933b8da07733516696fc55b1a305475995a579875a
+    "0x23199c43e03054933b8da07733516696fc55b1a305475995, 0x4544790392d407753cd6e636101136da9d7e515c0333592d"
+    4;
+  "niceprime: 6277101735386680763835789423207666416102355444464034512659; prime: -3, 6"
+    4
+    0423199c43e03054933b8da07733516696fc55b1a3054759954544790392d407753cd6e636101136da9d7e515c0333592d5bc5b568c8ff1ed697de98efa3008e
+    "0x23199c43e03054933b8da07733516696fc55b1a305475995, 0x4544790392d407753cd6e636101136da9d7e515c0333592d"
+    15;
+  "niceprime: 6277101735386680763835789423207666416102355444464034512659; prime: -3, 6"
+    2
+    0323199c43e03054933b8da07733516696fc55b1a305475995c6234b70
+    "0x23199c43e03054933b8da07733516696fc55b1a305475995, 0x4544790392d407753cd6e636101136da9d7e515c0333592d"
+    4;
+  "niceprime: 6277101735386680763835789423207666416102355444464034512659; prime: -3, 6"
+    6
+    0723199c43e03054933b8da07733516696fc55b1a3054759954544790392d407753cd6e636101136da9d7e515c0333592da225725d972cd6e6f0a789321d
+    "0x23199c43e03054933b8da07733516696fc55b1a305475995, 0x4544790392d407753cd6e636101136da9d7e515c0333592d"
+    13;
+  "niceprime: 6277101735386680763835789423207666416102355444464034512659; prime: -3, 6"
+    6
+    0623199c43e03054933b8da07733516696fc55b1a3054759954544790392d407753cd6e636101136da9d7e515c0333592d98c6745743ca2c3db760568e150da9
+    FAIL
+    15;
+  "niceprime: 6277101735386680763835789423207666416102355444464034512659; prime: -3, 6"
+    8
+    0a23199c43e03054933b8da07733516696fc55b1a305475995f43f88252a
+    "0x23199c43e03054933b8da07733516696fc55b1a305475995, 0x4544790392d407753cd6e636101136da9d7e515c0333592d"
+    5;
+  "niceprime: 6277101735386680763835789423207666416102355444464034512659; prime: -3, 6"
+    12
+    0e23199c43e03054933b8da07733516696fc55b1a3054759954544790392d407753cd6e636101136da9d7e515c0333592dab1edda693e9cb51
+    "0x23199c43e03054933b8da07733516696fc55b1a305475995, 0x4544790392d407753cd6e636101136da9d7e515c0333592d"
+    8;
+  "niceprime: 6277101735386680763835789423207666416102355444464034512659; prime: -3, 6"
+    12
+    0f23199c43e03054933b8da07733516696fc55b1a3054759954544790392d407753cd6e636101136da9d7e515c0333592d109fcb331164e38c5456
+    FAIL
+    10;
+  "niceprime: 6277101735386680763835789423207666416102355444464034512659; prime: -3, 6"
+    1
+    018e87fb02a03e9e428c066a02752c46bfd34865a2a2d8f33a2c922ed52f7d
+    "0x8e87fb02a03e9e428c066a02752c46bfd34865a2a2d8f33a, 0x32cf5eebd1b82c2633488efb96844cb45c88c533c6c9d6b8"
+    6;
+  "niceprime: 6277101735386680763835789423207666416102355444464034512659; prime: -3, 6"
+    4
+    048e87fb02a03e9e428c066a02752c46bfd34865a2a2d8f33a32cf5eebd1b82c2633488efb96844cb45c88c533c6c9d6b8fe3bddafe634
+    "0x8e87fb02a03e9e428c066a02752c46bfd34865a2a2d8f33a, 0x32cf5eebd1b82c2633488efb96844cb45c88c533c6c9d6b8"
+    6;
+  "niceprime: 6277101735386680763835789423207666416102355444464034512659; prime: -3, 6"
+    2
+    028e87fb02a03e9e428c066a02752c46bfd34865a2a2d8f33ab6c6268c41
+    "0x8e87fb02a03e9e428c066a02752c46bfd34865a2a2d8f33a, 0x32cf5eebd1b82c2633488efb96844cb45c88c533c6c9d6b8"
+    5;
+  "niceprime: 6277101735386680763835789423207666416102355444464034512659; prime: -3, 6"
+    6
+    068e87fb02a03e9e428c066a02752c46bfd34865a2a2d8f33a32cf5eebd1b82c2633488efb96844cb45c88c533c6c9d6b873f477f89a596a5620
+    "0x8e87fb02a03e9e428c066a02752c46bfd34865a2a2d8f33a, 0x32cf5eebd1b82c2633488efb96844cb45c88c533c6c9d6b8"
+    9;
+  "niceprime: 6277101735386680763835789423207666416102355444464034512659; prime: -3, 6"
+    6
+    078e87fb02a03e9e428c066a02752c46bfd34865a2a2d8f33a32cf5eebd1b82c2633488efb96844cb45c88c533c6c9d6b82cd17a9498b70697d12d4b3786
+    FAIL
+    13;
+  "niceprime: 6277101735386680763835789423207666416102355444464034512659; prime: -3, 6"
+    8
+    0a8e87fb02a03e9e428c066a02752c46bfd34865a2a2d8f33ada7d59746f8972
+    "0x8e87fb02a03e9e428c066a02752c46bfd34865a2a2d8f33a, 0x32cf5eebd1b82c2633488efb96844cb45c88c533c6c9d6b8"
+    7;
+  "niceprime: 6277101735386680763835789423207666416102355444464034512659; prime: -3, 6"
+    12
+    0e8e87fb02a03e9e428c066a02752c46bfd34865a2a2d8f33a32cf5eebd1b82c2633488efb96844cb45c88c533c6c9d6b842b8f93c4ce08cd4ca7077b52dc6a4
+    "0x8e87fb02a03e9e428c066a02752c46bfd34865a2a2d8f33a, 0x32cf5eebd1b82c2633488efb96844cb45c88c533c6c9d6b8"
+    15;
+  "niceprime: 6277101735386680763835789423207666416102355444464034512659; prime: -3, 6"
+    12
+    0f8e87fb02a03e9e428c066a02752c46bfd34865a2a2d8f33a32cf5eebd1b82c2633488efb96844cb45c88c533c6c9d6b82eeec91becfc53a7ca
+    FAIL
+    9;
+  "prime: 6277101735386680763835789423207666416102355444464034512659; primeproj: -3, 6"
+    1
+    011a39bfc960e8b0e1278c6cc57231260400307b2aa5d042961f9576b92b5a
+    "0x1a39bfc960e8b0e1278c6cc57231260400307b2aa5d04296, 0x12aa1aba568f1dbfc547ff062049ab8f9161088a090c8c95"
+    6;
+  "prime: 6277101735386680763835789423207666416102355444464034512659; primeproj: -3, 6"
+    4
+    041a39bfc960e8b0e1278c6cc57231260400307b2aa5d04296ed55e545a970e2403ab800f9dfb654706e9ef775f6f3727e41605c
+    "0x1a39bfc960e8b0e1278c6cc57231260400307b2aa5d04296, 0xed55e545a970e2403ab800f9dfb654706e9ef775f6f3727e"
+    3;
+  "prime: 6277101735386680763835789423207666416102355444464034512659; primeproj: -3, 6"
+    2
+    021a39bfc960e8b0e1278c6cc57231260400307b2aa5d04296e3614412df55bded9fca2092e4
+    "0x1a39bfc960e8b0e1278c6cc57231260400307b2aa5d04296, 0xed55e545a970e2403ab800f9dfb654706e9ef775f6f3727e"
+    13;
+  "prime: 6277101735386680763835789423207666416102355444464034512659; primeproj: -3, 6"
+    6
+    061a39bfc960e8b0e1278c6cc57231260400307b2aa5d04296ed55e545a970e2403ab800f9dfb654706e9ef775f6f3727e9c733ceebc3a089b3c
+    "0x1a39bfc960e8b0e1278c6cc57231260400307b2aa5d04296, 0xed55e545a970e2403ab800f9dfb654706e9ef775f6f3727e"
+    9;
+  "prime: 6277101735386680763835789423207666416102355444464034512659; primeproj: -3, 6"
+    6
+    071a39bfc960e8b0e1278c6cc57231260400307b2aa5d04296ed55e545a970e2403ab800f9dfb654706e9ef775f6f3727e6d63a366
+    FAIL
+    4;
+  "prime: 6277101735386680763835789423207666416102355444464034512659; primeproj: -3, 6"
+    8
+    0b1a39bfc960e8b0e1278c6cc57231260400307b2aa5d04296b8294f47eab80443d9308967a068
+    "0x1a39bfc960e8b0e1278c6cc57231260400307b2aa5d04296, 0xed55e545a970e2403ab800f9dfb654706e9ef775f6f3727e"
+    14;
+  "prime: 6277101735386680763835789423207666416102355444464034512659; primeproj: -3, 6"
+    12
+    0f1a39bfc960e8b0e1278c6cc57231260400307b2aa5d04296ed55e545a970e2403ab800f9dfb654706e9ef775f6f3727e53
+    "0x1a39bfc960e8b0e1278c6cc57231260400307b2aa5d04296, 0xed55e545a970e2403ab800f9dfb654706e9ef775f6f3727e"
+    1;
+  "prime: 6277101735386680763835789423207666416102355444464034512659; primeproj: -3, 6"
+    12
+    0e1a39bfc960e8b0e1278c6cc57231260400307b2aa5d04296ed55e545a970e2403ab800f9dfb654706e9ef775f6f3727e3ffa46
+    FAIL
+    3;
+  "prime: 6277101735386680763835789423207666416102355444464034512659; prime: -3, 6"
+    1
+    01ec551a2e0190fdd8e7680db09a7a56435cce09d724880d5c614147b49b90b6bf08
+    "0xec551a2e0190fdd8e7680db09a7a56435cce09d724880d5c, 0x1271b496586efe3d6d7f7e3710e86294641a9eccc2fc3ff8"
+    9;
+  "prime: 6277101735386680763835789423207666416102355444464034512659; prime: -3, 6"
+    4
+    04ec551a2e0190fdd8e7680db09a7a56435cce09d724880d5ced8e4b69a79101c2928081c8ef179d6b9be561333d03bf1b3ea05ab6676ffb2e
+    "0xec551a2e0190fdd8e7680db09a7a56435cce09d724880d5c, 0xed8e4b69a79101c2928081c8ef179d6b9be561333d03bf1b"
+    8;
+  "prime: 6277101735386680763835789423207666416102355444464034512659; prime: -3, 6"
+    2
+    03ec551a2e0190fdd8e7680db09a7a56435cce09d724880d5c39f2397257c021201ac2
+    "0xec551a2e0190fdd8e7680db09a7a56435cce09d724880d5c, 0xed8e4b69a79101c2928081c8ef179d6b9be561333d03bf1b"
+    10;
+  "prime: 6277101735386680763835789423207666416102355444464034512659; prime: -3, 6"
+    6
+    07ec551a2e0190fdd8e7680db09a7a56435cce09d724880d5ced8e4b69a79101c2928081c8ef179d6b9be561333d03bf1b4341
+    "0xec551a2e0190fdd8e7680db09a7a56435cce09d724880d5c, 0xed8e4b69a79101c2928081c8ef179d6b9be561333d03bf1b"
+    2;
+  "prime: 6277101735386680763835789423207666416102355444464034512659; prime: -3, 6"
+    6
+    06ec551a2e0190fdd8e7680db09a7a56435cce09d724880d5ced8e4b69a79101c2928081c8ef179d6b9be561333d03bf1b0ebcb653
+    FAIL
+    4;
+  "prime: 6277101735386680763835789423207666416102355444464034512659; prime: -3, 6"
+    8
+    0bec551a2e0190fdd8e7680db09a7a56435cce09d724880d5cd3076029119f7ff4
+    "0xec551a2e0190fdd8e7680db09a7a56435cce09d724880d5c, 0xed8e4b69a79101c2928081c8ef179d6b9be561333d03bf1b"
+    8;
+  "prime: 6277101735386680763835789423207666416102355444464034512659; prime: -3, 6"
+    12
+    0fec551a2e0190fdd8e7680db09a7a56435cce09d724880d5ced8e4b69a79101c2928081c8ef179d6b9be561333d03bf1b73
+    "0xec551a2e0190fdd8e7680db09a7a56435cce09d724880d5c, 0xed8e4b69a79101c2928081c8ef179d6b9be561333d03bf1b"
+    1;
+  "prime: 6277101735386680763835789423207666416102355444464034512659; prime: -3, 6"
+    12
+    0eec551a2e0190fdd8e7680db09a7a56435cce09d724880d5ced8e4b69a79101c2928081c8ef179d6b9be561333d03bf1b0b34520578b51af5d70e64
+    FAIL
+    11;
+  "prime: 6277101735386680763835789423207666416102355444464034512659; primeproj: -3, 6"
+    1
+    01894bf358973201ec442d448745b08263d3e6e66675ddcb32f2dfd1b99bd3a045bd2ac8f2dd
+    "0x894bf358973201ec442d448745b08263d3e6e66675ddcb32, 0x6fbfe09762c422ffcf5ff7e9d08041a9ddc638985e2e8a13"
+    13;
+  "prime: 6277101735386680763835789423207666416102355444464034512659; primeproj: -3, 6"
+    4
+    04894bf358973201ec442d448745b08263d3e6e66675ddcb326fbfe09762c422ffcf5ff7e9d08041a9ddc638985e2e8a136ff8e62bc3d25e4707
+    "0x894bf358973201ec442d448745b08263d3e6e66675ddcb32, 0x6fbfe09762c422ffcf5ff7e9d08041a9ddc638985e2e8a13"
+    9;
+  "prime: 6277101735386680763835789423207666416102355444464034512659; primeproj: -3, 6"
+    2
+    03894bf358973201ec442d448745b08263d3e6e66675ddcb328f
+    "0x894bf358973201ec442d448745b08263d3e6e66675ddcb32, 0x6fbfe09762c422ffcf5ff7e9d08041a9ddc638985e2e8a13"
+    1;
+  "prime: 6277101735386680763835789423207666416102355444464034512659; primeproj: -3, 6"
+    6
+    07894bf358973201ec442d448745b08263d3e6e66675ddcb326fbfe09762c422ffcf5ff7e9d08041a9ddc638985e2e8a137325
+    "0x894bf358973201ec442d448745b08263d3e6e66675ddcb32, 0x6fbfe09762c422ffcf5ff7e9d08041a9ddc638985e2e8a13"
+    2;
+  "prime: 6277101735386680763835789423207666416102355444464034512659; primeproj: -3, 6"
+    6
+    06894bf358973201ec442d448745b08263d3e6e66675ddcb326fbfe09762c422ffcf5ff7e9d08041a9ddc638985e2e8a1363
+    FAIL
+    1;
+  "prime: 6277101735386680763835789423207666416102355444464034512659; primeproj: -3, 6"
+    8
+    0a894bf358973201ec442d448745b08263d3e6e66675ddcb32cc
+    "0x894bf358973201ec442d448745b08263d3e6e66675ddcb32, 0x6fbfe09762c422ffcf5ff7e9d08041a9ddc638985e2e8a13"
+    1;
+  "prime: 6277101735386680763835789423207666416102355444464034512659; primeproj: -3, 6"
+    12
+    0e894bf358973201ec442d448745b08263d3e6e66675ddcb326fbfe09762c422ffcf5ff7e9d08041a9ddc638985e2e8a13
+    "0x894bf358973201ec442d448745b08263d3e6e66675ddcb32, 0x6fbfe09762c422ffcf5ff7e9d08041a9ddc638985e2e8a13"
+    0;
+  "prime: 6277101735386680763835789423207666416102355444464034512659; primeproj: -3, 6"
+    12
+    0f894bf358973201ec442d448745b08263d3e6e66675ddcb326fbfe09762c422ffcf5ff7e9d08041a9ddc638985e2e8a13cfb3a2aad95d1299a4a2e4
+    FAIL
+    11;
+  "prime: 6277101735386680763835789423207666416102355444464034512659; primeproj: -3, 6"
+    1
+    01f52e1e56e4ccfcdb416f949550625dae491ea7c05a1fadcb3d
+    "0xf52e1e56e4ccfcdb416f949550625dae491ea7c05a1fadcb, 0x1012eea27a2a5616943d8b283b96070a369b895fc00d3818"
+    1;
+  "prime: 6277101735386680763835789423207666416102355444464034512659; primeproj: -3, 6"
+    4
+    04f52e1e56e4ccfcdb416f949550625dae491ea7c05a1fadcbefed115d85d5a9e96bc274d7c469f8f5c96476a03ff2c6fb95f775a2f5b47b3d22e65a
+    "0xf52e1e56e4ccfcdb416f949550625dae491ea7c05a1fadcb, 0xefed115d85d5a9e96bc274d7c469f8f5c96476a03ff2c6fb"
+    11;
+  "prime: 6277101735386680763835789423207666416102355444464034512659; primeproj: -3, 6"
+    2
+    03f52e1e56e4ccfcdb416f949550625dae491ea7c05a1fadcbe2b4
+    "0xf52e1e56e4ccfcdb416f949550625dae491ea7c05a1fadcb, 0xefed115d85d5a9e96bc274d7c469f8f5c96476a03ff2c6fb"
+    2;
+  "prime: 6277101735386680763835789423207666416102355444464034512659; primeproj: -3, 6"
+    6
+    07f52e1e56e4ccfcdb416f949550625dae491ea7c05a1fadcbefed115d85d5a9e96bc274d7c469f8f5c96476a03ff2c6fbe09179a92ddad04d75d634dd33ce02
+    "0xf52e1e56e4ccfcdb416f949550625dae491ea7c05a1fadcb, 0xefed115d85d5a9e96bc274d7c469f8f5c96476a03ff2c6fb"
+    15;
+  "prime: 6277101735386680763835789423207666416102355444464034512659; primeproj: -3, 6"
+    6
+    06f52e1e56e4ccfcdb416f949550625dae491ea7c05a1fadcbefed115d85d5a9e96bc274d7c469f8f5c96476a03ff2c6fb8a051f10e73379729144
+    FAIL
+    10;
+  "prime: 6277101735386680763835789423207666416102355444464034512659; primeproj: -3, 6"
+    8
+    0bf52e1e56e4ccfcdb416f949550625dae491ea7c05a1fadcb70356b60b4849c99
+    "0xf52e1e56e4ccfcdb416f949550625dae491ea7c05a1fadcb, 0xefed115d85d5a9e96bc274d7c469f8f5c96476a03ff2c6fb"
+    8;
+  "prime: 6277101735386680763835789423207666416102355444464034512659; primeproj: -3, 6"
+    12
+    0ff52e1e56e4ccfcdb416f949550625dae491ea7c05a1fadcbefed115d85d5a9e96bc274d7c469f8f5c96476a03ff2c6fb29072a13653428e39bea3a1a
+    "0xf52e1e56e4ccfcdb416f949550625dae491ea7c05a1fadcb, 0xefed115d85d5a9e96bc274d7c469f8f5c96476a03ff2c6fb"
+    12;
+  "prime: 6277101735386680763835789423207666416102355444464034512659; primeproj: -3, 6"
+    12
+    0ef52e1e56e4ccfcdb416f949550625dae491ea7c05a1fadcbefed115d85d5a9e96bc274d7c469f8f5c96476a03ff2c6fbcb2c5425ce82e23c3fc64cb238
+    FAIL
+    13;
+  "prime: 6277101735386680763835789423207666416102355444464034512659; prime: -3, 6"
+    1
+    01537b5e804337cc50e9dd2838fff5b9bf6e65b28af8d810af242f2304ee65
+    "0x537b5e804337cc50e9dd2838fff5b9bf6e65b28af8d810af, 0x3927f54fa9c6c6ce399e9b7a7950dd8869b057799e9e18d5"
+    6;
+  "prime: 6277101735386680763835789423207666416102355444464034512659; prime: -3, 6"
+    4
+    04537b5e804337cc50e9dd2838fff5b9bf6e65b28af8d810af3927f54fa9c6c6ce399e9b7a7950dd8869b057799e9e18d58a4a66c021b9
+    "0x537b5e804337cc50e9dd2838fff5b9bf6e65b28af8d810af, 0x3927f54fa9c6c6ce399e9b7a7950dd8869b057799e9e18d5"
+    6;
+  "prime: 6277101735386680763835789423207666416102355444464034512659; prime: -3, 6"
+    2
+    03537b5e804337cc50e9dd2838fff5b9bf6e65b28af8d810afb35a3268d41032be3b
+    "0x537b5e804337cc50e9dd2838fff5b9bf6e65b28af8d810af, 0x3927f54fa9c6c6ce399e9b7a7950dd8869b057799e9e18d5"
+    9;
+  "prime: 6277101735386680763835789423207666416102355444464034512659; prime: -3, 6"
+    6
+    07537b5e804337cc50e9dd2838fff5b9bf6e65b28af8d810af3927f54fa9c6c6ce399e9b7a7950dd8869b057799e9e18d52cbd
+    "0x537b5e804337cc50e9dd2838fff5b9bf6e65b28af8d810af, 0x3927f54fa9c6c6ce399e9b7a7950dd8869b057799e9e18d5"
+    2;
+  "prime: 6277101735386680763835789423207666416102355444464034512659; prime: -3, 6"
+    6
+    06537b5e804337cc50e9dd2838fff5b9bf6e65b28af8d810af3927f54fa9c6c6ce399e9b7a7950dd8869b057799e9e18d5e66c07
+    FAIL
+    3;
+  "prime: 6277101735386680763835789423207666416102355444464034512659; prime: -3, 6"
+    8
+    0a537b5e804337cc50e9dd2838fff5b9bf6e65b28af8d810af51
+    "0x537b5e804337cc50e9dd2838fff5b9bf6e65b28af8d810af, 0x3927f54fa9c6c6ce399e9b7a7950dd8869b057799e9e18d5"
+    1;
+  "prime: 6277101735386680763835789423207666416102355444464034512659; prime: -3, 6"
+    12
+    0e537b5e804337cc50e9dd2838fff5b9bf6e65b28af8d810af3927f54fa9c6c6ce399e9b7a7950dd8869b057799e9e18d5eb3019ef0b57936b8f14a4f7e654
+    "0x537b5e804337cc50e9dd2838fff5b9bf6e65b28af8d810af, 0x3927f54fa9c6c6ce399e9b7a7950dd8869b057799e9e18d5"
+    14;
+  "prime: 6277101735386680763835789423207666416102355444464034512659; prime: -3, 6"
+    12
+    0f537b5e804337cc50e9dd2838fff5b9bf6e65b28af8d810af3927f54fa9c6c6ce399e9b7a7950dd8869b057799e9e18d5802617a7efd6
+    FAIL
+    6;
+  "prime: 6277101735386680763835789423207666416102355444464034512659; prime: -3, 6"
+    1
+    015f77a2c30438fe751e983255eef145dde67d6fb3cab494b1ae
+    "0x5f77a2c30438fe751e983255eef145dde67d6fb3cab494b1, 0x1ca24390c660f28aedfa70a348c0e637905c985e04c722fc"
+    1;
+  "prime: 6277101735386680763835789423207666416102355444464034512659; prime: -3, 6"
+    4
+    045f77a2c30438fe751e983255eef145dde67d6fb3cab494b11ca24390c660f28aedfa70a348c0e637905c985e04c722fc4bcecc0a6aecd11c9bbf1b6f
+    "0x5f77a2c30438fe751e983255eef145dde67d6fb3cab494b1, 0x1ca24390c660f28aedfa70a348c0e637905c985e04c722fc"
+    12;
+  "prime: 6277101735386680763835789423207666416102355444464034512659; prime: -3, 6"
+    2
+    025f77a2c30438fe751e983255eef145dde67d6fb3cab494b11e6d63f943
+    "0x5f77a2c30438fe751e983255eef145dde67d6fb3cab494b1, 0x1ca24390c660f28aedfa70a348c0e637905c985e04c722fc"
+    5;
+  "prime: 6277101735386680763835789423207666416102355444464034512659; prime: -3, 6"
+    6
+    065f77a2c30438fe751e983255eef145dde67d6fb3cab494b11ca24390c660f28aedfa70a348c0e637905c985e04c722fc130cf9bf
+    "0x5f77a2c30438fe751e983255eef145dde67d6fb3cab494b1, 0x1ca24390c660f28aedfa70a348c0e637905c985e04c722fc"
+    4;
+  "prime: 6277101735386680763835789423207666416102355444464034512659; prime: -3, 6"
+    6
+    075f77a2c30438fe751e983255eef145dde67d6fb3cab494b11ca24390c660f28aedfa70a348c0e637905c985e04c722fc743cac28f1c3021db38c52
+    FAIL
+    11;
+  "prime: 6277101735386680763835789423207666416102355444464034512659; prime: -3, 6"
+    8
+    0a5f77a2c30438fe751e983255eef145dde67d6fb3cab494b198979830bf270f
+    "0x5f77a2c30438fe751e983255eef145dde67d6fb3cab494b1, 0x1ca24390c660f28aedfa70a348c0e637905c985e04c722fc"
+    7;
+  "prime: 6277101735386680763835789423207666416102355444464034512659; prime: -3, 6"
+    12
+    0e5f77a2c30438fe751e983255eef145dde67d6fb3cab494b11ca24390c660f28aedfa70a348c0e637905c985e04c722fcd4b9e032246697587014efa5d6
+    "0x5f77a2c30438fe751e983255eef145dde67d6fb3cab494b1, 0x1ca24390c660f28aedfa70a348c0e637905c985e04c722fc"
+    13;
+  "prime: 6277101735386680763835789423207666416102355444464034512659; prime: -3, 6"
+    12
+    0f5f77a2c30438fe751e983255eef145dde67d6fb3cab494b11ca24390c660f28aedfa70a348c0e637905c985e04c722fc256d3aab55c5213205
+    FAIL
+    9;
+  "niceprime: 6277101735386680763835789423207666416102355444464034512659; prime: -3, 6"
+    2
+    02cdf65dc6c906c5c240dba0d156b911614abe806fa2b8dc0a07f6
+    "0xcdf65dc6c906c5c240dba0d156b911614abe806fa2b8dc0a, 0"
+    2;
+  "niceprime: 6277101735386680763835789423207666416102355444464034512659; prime: -3, 6"
+    2
+    03cdf65dc6c906c5c240dba0d156b911614abe806fa2b8dc0ac7f8b56cea
+    FAIL
+    5;
+  "niceprime: 6277101735386680763835789423207666416102355444464034512659; prime: -3, 6"
+    8
+    0acdf65dc6c906c5c240dba0d156b911614abe806fa2b8dc0a6eb4f62caa5f7d7d0c
+    "0xcdf65dc6c906c5c240dba0d156b911614abe806fa2b8dc0a, 0"
+    9;
+  "niceprime: 6277101735386680763835789423207666416102355444464034512659; prime: -3, 6"
+    8
+    0bcdf65dc6c906c5c240dba0d156b911614abe806fa2b8dc0a9a5d3dcd5d94634cb7f89f037e
+    FAIL
+    13;
+  "niceprime: 6277101735386680763835789423207666416102355444464034512659; primeproj: -3, 6"
+    1
+    019e3f8ddafa260dc256675004ad006328a0497fd7749a9e6f
+    FAIL
+    0;
+  "niceprime: 6277101735386680763835789423207666416102355444464034512659; primeproj: -3, 6"
+    2
+    029e3f8ddafa260dc256675004ad006328a0497fd7749a9e6f
+    FAIL
+    0;
+  "niceprime: 6277101735386680763835789423207666416102355444464034512659; primeproj: -3, 6"
+    8
+    0a9e3f8ddafa260dc256675004ad006328a0497fd7749a9e6f
+    FAIL
+    0;
+  "binpoly: 0x8000000000000000000000000000000000000000000000bb; bin: 1, 1"
+    1
+    0142d0c5ece183d9d4f068eaf42ec52844bb7fc559cd384f93
+    "0x42d0c5ece183d9d4f068eaf42ec52844bb7fc559cd384f93, 0x4f86433f7532cb78a36fe52992631246e400d05bd3487b66"
+    0;
+  "binpoly: 0x8000000000000000000000000000000000000000000000bb; bin: 1, 1"
+    4
+    0442d0c5ece183d9d4f068eaf42ec52844bb7fc559cd384f930d5686d394b112ac53070fddbca63a025f7f15021e7034f55534
+    "0x42d0c5ece183d9d4f068eaf42ec52844bb7fc559cd384f93, 0xd5686d394b112ac53070fddbca63a025f7f15021e7034f5"
+    2;
+  "binpoly: 0x8000000000000000000000000000000000000000000000bb; bin: 1, 1"
+    2
+    0342d0c5ece183d9d4f068eaf42ec52844bb7fc559cd384f93
+    "0x42d0c5ece183d9d4f068eaf42ec52844bb7fc559cd384f93, 0xd5686d394b112ac53070fddbca63a025f7f15021e7034f5"
+    0;
+  "binpoly: 0x8000000000000000000000000000000000000000000000bb; bin: 1, 1"
+    6
+    0742d0c5ece183d9d4f068eaf42ec52844bb7fc559cd384f930d5686d394b112ac53070fddbca63a025f7f15021e7034f5800416220c442b
+    "0x42d0c5ece183d9d4f068eaf42ec52844bb7fc559cd384f93, 0xd5686d394b112ac53070fddbca63a025f7f15021e7034f5"
+    7;
+  "binpoly: 0x8000000000000000000000000000000000000000000000bb; bin: 1, 1"
+    6
+    0642d0c5ece183d9d4f068eaf42ec52844bb7fc559cd384f930d5686d394b112ac53070fddbca63a025f7f15021e7034f5346b3387f0b280bebb
+    FAIL
+    9;
+  "binpoly: 0x8000000000000000000000000000000000000000000000bb; bin: 1, 1"
+    8
+    0a42d0c5ece183d9d4f068eaf42ec52844bb7fc559cd384f93cdc6
+    "0x42d0c5ece183d9d4f068eaf42ec52844bb7fc559cd384f93, 0xd5686d394b112ac53070fddbca63a025f7f15021e7034f5"
+    2;
+  "binpoly: 0x8000000000000000000000000000000000000000000000bb; bin: 1, 1"
+    12
+    0e42d0c5ece183d9d4f068eaf42ec52844bb7fc559cd384f930d5686d394b112ac53070fddbca63a025f7f15021e7034f50d559a642415a60e5eff7de82e
+    "0x42d0c5ece183d9d4f068eaf42ec52844bb7fc559cd384f93, 0xd5686d394b112ac53070fddbca63a025f7f15021e7034f5"
+    13;
+  "binpoly: 0x8000000000000000000000000000000000000000000000bb; bin: 1, 1"
+    12
+    0f42d0c5ece183d9d4f068eaf42ec52844bb7fc559cd384f930d5686d394b112ac53070fddbca63a025f7f15021e7034f5
+    FAIL
+    0;
+  "binpoly: 0x8000000000000000000000000000000000000000000000bb; binproj: 1, 1"
+    1
+    01143841095281e016ca51510570ff93851232e53c7b2b4244
+    "0x143841095281e016ca51510570ff93851232e53c7b2b4244, 0x56bf3c8554f9e52b1c9363df8d62f991682d4a6c455cdc21"
+    0;
+  "binpoly: 0x8000000000000000000000000000000000000000000000bb; binproj: 1, 1"
+    4
+    04143841095281e016ca51510570ff93851232e53c7b2b424456bf3c8554f9e52b1c9363df8d62f991682d4a6c455cdc218655aa
+    "0x143841095281e016ca51510570ff93851232e53c7b2b4244, 0x56bf3c8554f9e52b1c9363df8d62f991682d4a6c455cdc21"
+    3;
+  "binpoly: 0x8000000000000000000000000000000000000000000000bb; binproj: 1, 1"
+    2
+    02143841095281e016ca51510570ff93851232e53c7b2b424446e64f42b9b006d0e6d2
+    "0x143841095281e016ca51510570ff93851232e53c7b2b4244, 0x56bf3c8554f9e52b1c9363df8d62f991682d4a6c455cdc21"
+    10;
+  "binpoly: 0x8000000000000000000000000000000000000000000000bb; binproj: 1, 1"
+    6
+    06143841095281e016ca51510570ff93851232e53c7b2b424456bf3c8554f9e52b1c9363df8d62f991682d4a6c455cdc21ed80e39961
+    "0x143841095281e016ca51510570ff93851232e53c7b2b4244, 0x56bf3c8554f9e52b1c9363df8d62f991682d4a6c455cdc21"
+    5;
+  "binpoly: 0x8000000000000000000000000000000000000000000000bb; binproj: 1, 1"
+    6
+    07143841095281e016ca51510570ff93851232e53c7b2b424456bf3c8554f9e52b1c9363df8d62f991682d4a6c455cdc21e328616aa8e29e899775bdc99c70
+    FAIL
+    14;
+  "binpoly: 0x8000000000000000000000000000000000000000000000bb; binproj: 1, 1"
+    8
+    0b143841095281e016ca51510570ff93851232e53c7b2b42442a46
+    "0x143841095281e016ca51510570ff93851232e53c7b2b4244, 0x56bf3c8554f9e52b1c9363df8d62f991682d4a6c455cdc21"
+    2;
+  "binpoly: 0x8000000000000000000000000000000000000000000000bb; binproj: 1, 1"
+    12
+    0f143841095281e016ca51510570ff93851232e53c7b2b424456bf3c8554f9e52b1c9363df8d62f991682d4a6c455cdc21ee6d9806675dd054c3976fd4f0
+    "0x143841095281e016ca51510570ff93851232e53c7b2b4244, 0x56bf3c8554f9e52b1c9363df8d62f991682d4a6c455cdc21"
+    13;
+  "binpoly: 0x8000000000000000000000000000000000000000000000bb; binproj: 1, 1"
+    12
+    0e143841095281e016ca51510570ff93851232e53c7b2b424456bf3c8554f9e52b1c9363df8d62f991682d4a6c455cdc216dfc3874302f4fd12d5a1c5328
+    FAIL
+    13;
+  "binpoly: 0x8000000000000000000000000000000000000000000000bb; bin: 1, 1"
+    1
+    015f53927deae3d279d9fddb97b4e4601eae7957d1df492463d766dae42371bc
+    "0x5f53927deae3d279d9fddb97b4e4601eae7957d1df492463, 0x72189d26f3476fd3279cdf839448493ded933073137fdbd9"
+    7;
+  "binpoly: 0x8000000000000000000000000000000000000000000000bb; bin: 1, 1"
+    4
+    045f53927deae3d279d9fddb97b4e4601eae7957d1df49246372189d26f3476fd3279cdf839448493ded933073137fdbd97c90f26f
+    "0x5f53927deae3d279d9fddb97b4e4601eae7957d1df492463, 0x72189d26f3476fd3279cdf839448493ded933073137fdbd9"
+    4;
+  "binpoly: 0x8000000000000000000000000000000000000000000000bb; bin: 1, 1"
+    2
+    025f53927deae3d279d9fddb97b4e4601eae7957d1df492463a1
+    "0x5f53927deae3d279d9fddb97b4e4601eae7957d1df492463, 0x72189d26f3476fd3279cdf839448493ded933073137fdbd9"
+    1;
+  "binpoly: 0x8000000000000000000000000000000000000000000000bb; bin: 1, 1"
+    6
+    065f53927deae3d279d9fddb97b4e4601eae7957d1df49246372189d26f3476fd3279cdf839448493ded933073137fdbd91959f01f889df1327814b05de5dcc5
+    "0x5f53927deae3d279d9fddb97b4e4601eae7957d1df492463, 0x72189d26f3476fd3279cdf839448493ded933073137fdbd9"
+    15;
+  "binpoly: 0x8000000000000000000000000000000000000000000000bb; bin: 1, 1"
+    6
+    075f53927deae3d279d9fddb97b4e4601eae7957d1df49246372189d26f3476fd3279cdf839448493ded933073137fdbd975
+    FAIL
+    1;
+  "binpoly: 0x8000000000000000000000000000000000000000000000bb; bin: 1, 1"
+    8
+    0b5f53927deae3d279d9fddb97b4e4601eae7957d1df4924639fb48e169c2f77b0583a53d1507635
+    "0x5f53927deae3d279d9fddb97b4e4601eae7957d1df492463, 0x72189d26f3476fd3279cdf839448493ded933073137fdbd9"
+    15;
+  "binpoly: 0x8000000000000000000000000000000000000000000000bb; bin: 1, 1"
+    12
+    0f5f53927deae3d279d9fddb97b4e4601eae7957d1df49246372189d26f3476fd3279cdf839448493ded933073137fdbd9b0e2a8181da5389c244020d8dee6
+    "0x5f53927deae3d279d9fddb97b4e4601eae7957d1df492463, 0x72189d26f3476fd3279cdf839448493ded933073137fdbd9"
+    14;
+  "binpoly: 0x8000000000000000000000000000000000000000000000bb; bin: 1, 1"
+    12
+    0e5f53927deae3d279d9fddb97b4e4601eae7957d1df49246372189d26f3476fd3279cdf839448493ded933073137fdbd9bbb4b20f824b7e6e5b1a4d3a
+    FAIL
+    12;
+  "binpoly: 0x8000000000000000000000000000000000000000000000bb; binproj: 1, 1"
+    1
+    0150b296f3be1b33d82235eef215fd872c9e88885e8eb23304d7ddfa59adc0cdc5a05ce886e96c
+    "0x50b296f3be1b33d82235eef215fd872c9e88885e8eb23304, 0x22d918c7798828a8ef323d832fa6ffdae19882a0222b9433"
+    14;
+  "binpoly: 0x8000000000000000000000000000000000000000000000bb; binproj: 1, 1"
+    4
+    0450b296f3be1b33d82235eef215fd872c9e88885e8eb23304726b8e34c7931b70cd07d3713a5b78f67f100afeac99a7373ed873c1e13bec3fc38fb766da
+    "0x50b296f3be1b33d82235eef215fd872c9e88885e8eb23304, 0x726b8e34c7931b70cd07d3713a5b78f67f100afeac99a737"
+    13;
+  "binpoly: 0x8000000000000000000000000000000000000000000000bb; binproj: 1, 1"
+    2
+    0350b296f3be1b33d82235eef215fd872c9e88885e8eb233048c74a5
+    "0x50b296f3be1b33d82235eef215fd872c9e88885e8eb23304, 0x726b8e34c7931b70cd07d3713a5b78f67f100afeac99a737"
+    3;
+  "binpoly: 0x8000000000000000000000000000000000000000000000bb; binproj: 1, 1"
+    6
+    0750b296f3be1b33d82235eef215fd872c9e88885e8eb23304726b8e34c7931b70cd07d3713a5b78f67f100afeac99a73709058e
+    "0x50b296f3be1b33d82235eef215fd872c9e88885e8eb23304, 0x726b8e34c7931b70cd07d3713a5b78f67f100afeac99a737"
+    3;
+  "binpoly: 0x8000000000000000000000000000000000000000000000bb; binproj: 1, 1"
+    6
+    0650b296f3be1b33d82235eef215fd872c9e88885e8eb23304726b8e34c7931b70cd07d3713a5b78f67f100afeac99a737c3f48cb90d5e4ea9297f2addfe
+    FAIL
+    13;
+  "binpoly: 0x8000000000000000000000000000000000000000000000bb; binproj: 1, 1"
+    8
+    0b50b296f3be1b33d82235eef215fd872c9e88885e8eb23304e2872a50d3cd3a2cd0d7e94a
+    "0x50b296f3be1b33d82235eef215fd872c9e88885e8eb23304, 0x726b8e34c7931b70cd07d3713a5b78f67f100afeac99a737"
+    12;
+  "binpoly: 0x8000000000000000000000000000000000000000000000bb; binproj: 1, 1"
+    12
+    0f50b296f3be1b33d82235eef215fd872c9e88885e8eb23304726b8e34c7931b70cd07d3713a5b78f67f100afeac99a73707
+    "0x50b296f3be1b33d82235eef215fd872c9e88885e8eb23304, 0x726b8e34c7931b70cd07d3713a5b78f67f100afeac99a737"
+    1;
+  "binpoly: 0x8000000000000000000000000000000000000000000000bb; binproj: 1, 1"
+    12
+    0e50b296f3be1b33d82235eef215fd872c9e88885e8eb23304726b8e34c7931b70cd07d3713a5b78f67f100afeac99a737fd
+    FAIL
+    1;
+  "binpoly: 0x8000000000000000000000000000000000000000000000bb; binproj: 1, 1"
+    1
+    010b6af2c1df0eed206416d4d619d2d31749b697a3d98c4e55ca13daf72f7314b1cb
+    "0xb6af2c1df0eed206416d4d619d2d31749b697a3d98c4e55, 0x5d955003e4e21e8e6c9802a75aef0d327ea861a569fda7c5"
+    9;
+  "binpoly: 0x8000000000000000000000000000000000000000000000bb; binproj: 1, 1"
+    4
+    040b6af2c1df0eed206416d4d619d2d31749b697a3d98c4e555d955003e4e21e8e6c9802a75aef0d327ea861a569fda7c5e37ab8f8668fddde9a55efdf
+    "0xb6af2c1df0eed206416d4d619d2d31749b697a3d98c4e55, 0x5d955003e4e21e8e6c9802a75aef0d327ea861a569fda7c5"
+    12;
+  "binpoly: 0x8000000000000000000000000000000000000000000000bb; binproj: 1, 1"
+    2
+    020b6af2c1df0eed206416d4d619d2d31749b697a3d98c4e55a372ad344d1ccd71
+    "0xb6af2c1df0eed206416d4d619d2d31749b697a3d98c4e55, 0x5d955003e4e21e8e6c9802a75aef0d327ea861a569fda7c5"
+    8;
+  "binpoly: 0x8000000000000000000000000000000000000000000000bb; binproj: 1, 1"
+    6
+    060b6af2c1df0eed206416d4d619d2d31749b697a3d98c4e555d955003e4e21e8e6c9802a75aef0d327ea861a569fda7c5cc45bc188cd7d594
+    "0xb6af2c1df0eed206416d4d619d2d31749b697a3d98c4e55, 0x5d955003e4e21e8e6c9802a75aef0d327ea861a569fda7c5"
+    8;
+  "binpoly: 0x8000000000000000000000000000000000000000000000bb; binproj: 1, 1"
+    6
+    070b6af2c1df0eed206416d4d619d2d31749b697a3d98c4e555d955003e4e21e8e6c9802a75aef0d327ea861a569fda7c5d098499d1a
+    FAIL
+    5;
+  "binpoly: 0x8000000000000000000000000000000000000000000000bb; binproj: 1, 1"
+    8
+    0b0b6af2c1df0eed206416d4d619d2d31749b697a3d98c4e55
+    "0xb6af2c1df0eed206416d4d619d2d31749b697a3d98c4e55, 0x5d955003e4e21e8e6c9802a75aef0d327ea861a569fda7c5"
+    0;
+  "binpoly: 0x8000000000000000000000000000000000000000000000bb; binproj: 1, 1"
+    12
+    0f0b6af2c1df0eed206416d4d619d2d31749b697a3d98c4e555d955003e4e21e8e6c9802a75aef0d327ea861a569fda7c501486879f678c9f6
+    "0xb6af2c1df0eed206416d4d619d2d31749b697a3d98c4e55, 0x5d955003e4e21e8e6c9802a75aef0d327ea861a569fda7c5"
+    8;
+  "binpoly: 0x8000000000000000000000000000000000000000000000bb; binproj: 1, 1"
+    12
+    0e0b6af2c1df0eed206416d4d619d2d31749b697a3d98c4e555d955003e4e21e8e6c9802a75aef0d327ea861a569fda7c59284
+    FAIL
+    2;
+  "binpoly: 0x8000000000000000000000000000000000000000000000bb; bin: 1, 1"
+    1
+    01718a98068bc37ff19189b8dabc6ffe2c55ec786de5d3b1d1ca65
+    "0x718a98068bc37ff19189b8dabc6ffe2c55ec786de5d3b1d1, 0x7ba2829a81835093c344d8fe94a093a7d742e110c70739e0"
+    2;
+  "binpoly: 0x8000000000000000000000000000000000000000000000bb; bin: 1, 1"
+    4
+    04718a98068bc37ff19189b8dabc6ffe2c55ec786de5d3b1d10a281a9c0a402f6252cd602428cf6d8b82ae997d22d48831c6799783fd94f7461e31
+    "0x718a98068bc37ff19189b8dabc6ffe2c55ec786de5d3b1d1, 0xa281a9c0a402f6252cd602428cf6d8b82ae997d22d48831"
+    10;
+  "binpoly: 0x8000000000000000000000000000000000000000000000bb; bin: 1, 1"
+    2
+    03718a98068bc37ff19189b8dabc6ffe2c55ec786de5d3b1d169bc83bef8d029ed97ee89
+    "0x718a98068bc37ff19189b8dabc6ffe2c55ec786de5d3b1d1, 0xa281a9c0a402f6252cd602428cf6d8b82ae997d22d48831"
+    11;
+  "binpoly: 0x8000000000000000000000000000000000000000000000bb; bin: 1, 1"
+    6
+    07718a98068bc37ff19189b8dabc6ffe2c55ec786de5d3b1d10a281a9c0a402f6252cd602428cf6d8b82ae997d22d488316ce32c0a72d783e28c5aad
+    "0x718a98068bc37ff19189b8dabc6ffe2c55ec786de5d3b1d1, 0xa281a9c0a402f6252cd602428cf6d8b82ae997d22d48831"
+    11;
+  "binpoly: 0x8000000000000000000000000000000000000000000000bb; bin: 1, 1"
+    6
+    06718a98068bc37ff19189b8dabc6ffe2c55ec786de5d3b1d10a281a9c0a402f6252cd602428cf6d8b82ae997d22d48831b523dd4fd2d25e
+    FAIL
+    7;
+  "binpoly: 0x8000000000000000000000000000000000000000000000bb; bin: 1, 1"
+    8
+    0a718a98068bc37ff19189b8dabc6ffe2c55ec786de5d3b1d1a5297d0b
+    "0x718a98068bc37ff19189b8dabc6ffe2c55ec786de5d3b1d1, 0xa281a9c0a402f6252cd602428cf6d8b82ae997d22d48831"
+    4;
+  "binpoly: 0x8000000000000000000000000000000000000000000000bb; bin: 1, 1"
+    12
+    0e718a98068bc37ff19189b8dabc6ffe2c55ec786de5d3b1d10a281a9c0a402f6252cd602428cf6d8b82ae997d22d488311faeac70cbaa
+    "0x718a98068bc37ff19189b8dabc6ffe2c55ec786de5d3b1d1, 0xa281a9c0a402f6252cd602428cf6d8b82ae997d22d48831"
+    6;
+  "binpoly: 0x8000000000000000000000000000000000000000000000bb; bin: 1, 1"
+    12
+    0f718a98068bc37ff19189b8dabc6ffe2c55ec786de5d3b1d10a281a9c0a402f6252cd602428cf6d8b82ae997d22d4883111e7e92eb1fd41
+    FAIL
+    7;
+  "binpoly: 0x8000000000000000000000000000000000000000000000bb; bin: 1, 1"
+    1
+    013e79bcc94d83602dfdbba17ca0e041b92d3af5f7881499293cfc8f3da5
+    "0x3e79bcc94d83602dfdbba17ca0e041b92d3af5f788149929, 0x7451ad262ae8394ca3cc7cc23eb4bb1a89997bdb51de3707"
+    5;
+  "binpoly: 0x8000000000000000000000000000000000000000000000bb; bin: 1, 1"
+    4
+    043e79bcc94d83602dfdbba17ca0e041b92d3af5f7881499297451ad262ae8394ca3cc7cc23eb4bb1a89997bdb51de3707d3267fe97c852e5b3f
+    "0x3e79bcc94d83602dfdbba17ca0e041b92d3af5f788149929, 0x7451ad262ae8394ca3cc7cc23eb4bb1a89997bdb51de3707"
+    9;
+  "binpoly: 0x8000000000000000000000000000000000000000000000bb; bin: 1, 1"
+    2
+    023e79bcc94d83602dfdbba17ca0e041b92d3af5f7881499299640aa7e06b1f585cbe306c26a
+    "0x3e79bcc94d83602dfdbba17ca0e041b92d3af5f788149929, 0x7451ad262ae8394ca3cc7cc23eb4bb1a89997bdb51de3707"
+    13;
+  "binpoly: 0x8000000000000000000000000000000000000000000000bb; bin: 1, 1"
+    6
+    063e79bcc94d83602dfdbba17ca0e041b92d3af5f7881499297451ad262ae8394ca3cc7cc23eb4bb1a89997bdb51de3707b26f
+    "0x3e79bcc94d83602dfdbba17ca0e041b92d3af5f788149929, 0x7451ad262ae8394ca3cc7cc23eb4bb1a89997bdb51de3707"
+    2;
+  "binpoly: 0x8000000000000000000000000000000000000000000000bb; bin: 1, 1"
+    6
+    073e79bcc94d83602dfdbba17ca0e041b92d3af5f7881499297451ad262ae8394ca3cc7cc23eb4bb1a89997bdb51de370781f67d342c4cc01cc70b
+    FAIL
+    10;
+  "binpoly: 0x8000000000000000000000000000000000000000000000bb; bin: 1, 1"
+    8
+    0b3e79bcc94d83602dfdbba17ca0e041b92d3af5f788149929e8f85cc7
+    "0x3e79bcc94d83602dfdbba17ca0e041b92d3af5f788149929, 0x7451ad262ae8394ca3cc7cc23eb4bb1a89997bdb51de3707"
+    4;
+  "binpoly: 0x8000000000000000000000000000000000000000000000bb; bin: 1, 1"
+    12
+    0f3e79bcc94d83602dfdbba17ca0e041b92d3af5f7881499297451ad262ae8394ca3cc7cc23eb4bb1a89997bdb51de370740735ace47541583eb1b
+    "0x3e79bcc94d83602dfdbba17ca0e041b92d3af5f788149929, 0x7451ad262ae8394ca3cc7cc23eb4bb1a89997bdb51de3707"
+    10;
+  "binpoly: 0x8000000000000000000000000000000000000000000000bb; bin: 1, 1"
+    12
+    0e3e79bcc94d83602dfdbba17ca0e041b92d3af5f7881499297451ad262ae8394ca3cc7cc23eb4bb1a89997bdb51de3707
+    FAIL
+    0;
+  "binpoly: 0x8000000000000000000000000000000000000000000000bb; binproj: 1, 1"
+    1
+    011b4b1d1207b9a2107e782a7a04b5d0b0f7d55d34aa75bf0e96196fa22b4b928128c4d71cc442
+    "0x1b4b1d1207b9a2107e782a7a04b5d0b0f7d55d34aa75bf0e, 0x7fb2b2b3ba042e2e9c68de83cd452fa029428b0a4b89d1b3"
+    14;
+  "binpoly: 0x8000000000000000000000000000000000000000000000bb; binproj: 1, 1"
+    4
+    041b4b1d1207b9a2107e782a7a04b5d0b0f7d55d34aa75bf0e64f9afa1bdbd8c3ee210f4f9c9f0ff10de97d63ee1fc6ebdb2fbe0bd2a494d21d5357df037
+    "0x1b4b1d1207b9a2107e782a7a04b5d0b0f7d55d34aa75bf0e, 0x64f9afa1bdbd8c3ee210f4f9c9f0ff10de97d63ee1fc6ebd"
+    13;
+  "binpoly: 0x8000000000000000000000000000000000000000000000bb; binproj: 1, 1"
+    2
+    031b4b1d1207b9a2107e782a7a04b5d0b0f7d55d34aa75bf0e05846900382967d1315c
+    "0x1b4b1d1207b9a2107e782a7a04b5d0b0f7d55d34aa75bf0e, 0x64f9afa1bdbd8c3ee210f4f9c9f0ff10de97d63ee1fc6ebd"
+    10;
+  "binpoly: 0x8000000000000000000000000000000000000000000000bb; binproj: 1, 1"
+    6
+    071b4b1d1207b9a2107e782a7a04b5d0b0f7d55d34aa75bf0e64f9afa1bdbd8c3ee210f4f9c9f0ff10de97d63ee1fc6ebdcc9d
+    "0x1b4b1d1207b9a2107e782a7a04b5d0b0f7d55d34aa75bf0e, 0x64f9afa1bdbd8c3ee210f4f9c9f0ff10de97d63ee1fc6ebd"
+    2;
+  "binpoly: 0x8000000000000000000000000000000000000000000000bb; binproj: 1, 1"
+    6
+    061b4b1d1207b9a2107e782a7a04b5d0b0f7d55d34aa75bf0e64f9afa1bdbd8c3ee210f4f9c9f0ff10de97d63ee1fc6ebdad
+    FAIL
+    1;
+  "binpoly: 0x8000000000000000000000000000000000000000000000bb; binproj: 1, 1"
+    8
+    0a1b4b1d1207b9a2107e782a7a04b5d0b0f7d55d34aa75bf0e8756da0ebc7f38
+    "0x1b4b1d1207b9a2107e782a7a04b5d0b0f7d55d34aa75bf0e, 0x64f9afa1bdbd8c3ee210f4f9c9f0ff10de97d63ee1fc6ebd"
+    7;
+  "binpoly: 0x8000000000000000000000000000000000000000000000bb; binproj: 1, 1"
+    12
+    0e1b4b1d1207b9a2107e782a7a04b5d0b0f7d55d34aa75bf0e64f9afa1bdbd8c3ee210f4f9c9f0ff10de97d63ee1fc6ebd924d1c480e467425
+    "0x1b4b1d1207b9a2107e782a7a04b5d0b0f7d55d34aa75bf0e, 0x64f9afa1bdbd8c3ee210f4f9c9f0ff10de97d63ee1fc6ebd"
+    8;
+  "binpoly: 0x8000000000000000000000000000000000000000000000bb; binproj: 1, 1"
+    12
+    0f1b4b1d1207b9a2107e782a7a04b5d0b0f7d55d34aa75bf0e64f9afa1bdbd8c3ee210f4f9c9f0ff10de97d63ee1fc6ebd9284e88a79
+    FAIL
+    5;
+  "binpoly: 0x8000000000000000000000000000000000000000000000bb; bin: 1, 1"
+    1
+    01720850cdd7aa529e223eaac55d6af7ef0727fa24dde25de6bdb3616cef
+    "0x720850cdd7aa529e223eaac55d6af7ef0727fa24dde25de6, 0x56d3f2fbbf87844128b487c90cd87a9ad2fe5a79111e781b"
+    5;
+  "binpoly: 0x8000000000000000000000000000000000000000000000bb; bin: 1, 1"
+    4
+    04720850cdd7aa529e223eaac55d6af7ef0727fa24dde25de624dba236682dd6df0a8a2d0c51b28d75d5d9a05dccfc25fdc5561390e156f8658540897767
+    "0x720850cdd7aa529e223eaac55d6af7ef0727fa24dde25de6, 0x24dba236682dd6df0a8a2d0c51b28d75d5d9a05dccfc25fd"
+    13;
+  "binpoly: 0x8000000000000000000000000000000000000000000000bb; bin: 1, 1"
+    2
+    03720850cdd7aa529e223eaac55d6af7ef0727fa24dde25de62de503bfd2
+    "0x720850cdd7aa529e223eaac55d6af7ef0727fa24dde25de6, 0x24dba236682dd6df0a8a2d0c51b28d75d5d9a05dccfc25fd"
+    5;
+  "binpoly: 0x8000000000000000000000000000000000000000000000bb; bin: 1, 1"
+    6
+    07720850cdd7aa529e223eaac55d6af7ef0727fa24dde25de624dba236682dd6df0a8a2d0c51b28d75d5d9a05dccfc25fd51ef6049717669245940f6cc956f69
+    "0x720850cdd7aa529e223eaac55d6af7ef0727fa24dde25de6, 0x24dba236682dd6df0a8a2d0c51b28d75d5d9a05dccfc25fd"
+    15;
+  "binpoly: 0x8000000000000000000000000000000000000000000000bb; bin: 1, 1"
+    6
+    06720850cdd7aa529e223eaac55d6af7ef0727fa24dde25de624dba236682dd6df0a8a2d0c51b28d75d5d9a05dccfc25fdc4e745
+    FAIL
+    3;
+  "binpoly: 0x8000000000000000000000000000000000000000000000bb; bin: 1, 1"
+    8
+    0a720850cdd7aa529e223eaac55d6af7ef0727fa24dde25de6bf9f16cc34abe1ec981eca1735a2
+    "0x720850cdd7aa529e223eaac55d6af7ef0727fa24dde25de6, 0x24dba236682dd6df0a8a2d0c51b28d75d5d9a05dccfc25fd"
+    14;
+  "binpoly: 0x8000000000000000000000000000000000000000000000bb; bin: 1, 1"
+    12
+    0e720850cdd7aa529e223eaac55d6af7ef0727fa24dde25de624dba236682dd6df0a8a2d0c51b28d75d5d9a05dccfc25fd78
+    "0x720850cdd7aa529e223eaac55d6af7ef0727fa24dde25de6, 0x24dba236682dd6df0a8a2d0c51b28d75d5d9a05dccfc25fd"
+    1;
+  "binpoly: 0x8000000000000000000000000000000000000000000000bb; bin: 1, 1"
+    12
+    0f720850cdd7aa529e223eaac55d6af7ef0727fa24dde25de624dba236682dd6df0a8a2d0c51b28d75d5d9a05dccfc25fd35a27fca1dd809f9
+    FAIL
+    8;
+  "binpoly: 0x8000000000000000000000000000000000000000000000bb; bin: 1, 1"
+    1
+    014b119756d0897fb0abd041a3b178ac542d7bbb4b057d8ff2398f
+    "0x4b119756d0897fb0abd041a3b178ac542d7bbb4b057d8ff2, 0x295367d5eeed9fe6cd37ff3f10b4a4ca807e912625ebfac5"
+    2;
+  "binpoly: 0x8000000000000000000000000000000000000000000000bb; bin: 1, 1"
+    4
+    044b119756d0897fb0abd041a3b178ac542d7bbb4b057d8ff26242f0833e64e05666e7be9ca1cc089ead052a6d20967537c037a7
+    "0x4b119756d0897fb0abd041a3b178ac542d7bbb4b057d8ff2, 0x6242f0833e64e05666e7be9ca1cc089ead052a6d20967537"
+    3;
+  "binpoly: 0x8000000000000000000000000000000000000000000000bb; bin: 1, 1"
+    2
+    034b119756d0897fb0abd041a3b178ac542d7bbb4b057d8ff2dcbc
+    "0x4b119756d0897fb0abd041a3b178ac542d7bbb4b057d8ff2, 0x6242f0833e64e05666e7be9ca1cc089ead052a6d20967537"
+    2;
+  "binpoly: 0x8000000000000000000000000000000000000000000000bb; bin: 1, 1"
+    6
+    074b119756d0897fb0abd041a3b178ac542d7bbb4b057d8ff26242f0833e64e05666e7be9ca1cc089ead052a6d2096753751c6d9a8bdc34b4e8f018f417f
+    "0x4b119756d0897fb0abd041a3b178ac542d7bbb4b057d8ff2, 0x6242f0833e64e05666e7be9ca1cc089ead052a6d20967537"
+    13;
+  "binpoly: 0x8000000000000000000000000000000000000000000000bb; bin: 1, 1"
+    6
+    064b119756d0897fb0abd041a3b178ac542d7bbb4b057d8ff26242f0833e64e05666e7be9ca1cc089ead052a6d209675377143151f3e
+    FAIL
+    5;
+  "binpoly: 0x8000000000000000000000000000000000000000000000bb; bin: 1, 1"
+    8
+    0b4b119756d0897fb0abd041a3b178ac542d7bbb4b057d8ff2988cf372c3048e19fadf
+    "0x4b119756d0897fb0abd041a3b178ac542d7bbb4b057d8ff2, 0x6242f0833e64e05666e7be9ca1cc089ead052a6d20967537"
+    10;
+  "binpoly: 0x8000000000000000000000000000000000000000000000bb; bin: 1, 1"
+    12
+    0f4b119756d0897fb0abd041a3b178ac542d7bbb4b057d8ff26242f0833e64e05666e7be9ca1cc089ead052a6d20967537137193b926796c20246ca8
+    "0x4b119756d0897fb0abd041a3b178ac542d7bbb4b057d8ff2, 0x6242f0833e64e05666e7be9ca1cc089ead052a6d20967537"
+    11;
+  "binpoly: 0x8000000000000000000000000000000000000000000000bb; bin: 1, 1"
+    12
+    0e4b119756d0897fb0abd041a3b178ac542d7bbb4b057d8ff26242f0833e64e05666e7be9ca1cc089ead052a6d20967537b3f1bd
+    FAIL
+    3;
+  "binpoly: 0x8000000000000000000000000000000000000000000000bb; bin: 1, 1"
+    1
+    015523d9648dbbb91675acf5aa53fddf6e799d94550f8c21e54117
+    "0x5523d9648dbbb91675acf5aa53fddf6e799d94550f8c21e5, 0x329b3dd35f5803b3dbc5c400fe1a477d8f5270f23d8aa0d8"
+    2;
+  "binpoly: 0x8000000000000000000000000000000000000000000000bb; bin: 1, 1"
+    4
+    045523d9648dbbb91675acf5aa53fddf6e799d94550f8c21e567b8e4b7d2e3baa5ae6931aaade79813f6cfe4a73206813db5bdfb2f889a2f550b
+    "0x5523d9648dbbb91675acf5aa53fddf6e799d94550f8c21e5, 0x67b8e4b7d2e3baa5ae6931aaade79813f6cfe4a73206813d"
+    9;
+  "binpoly: 0x8000000000000000000000000000000000000000000000bb; bin: 1, 1"
+    2
+    035523d9648dbbb91675acf5aa53fddf6e799d94550f8c21e5b1fbc74859f7247ff2d3a72636
+    "0x5523d9648dbbb91675acf5aa53fddf6e799d94550f8c21e5, 0x67b8e4b7d2e3baa5ae6931aaade79813f6cfe4a73206813d"
+    13;
+  "binpoly: 0x8000000000000000000000000000000000000000000000bb; bin: 1, 1"
+    6
+    075523d9648dbbb91675acf5aa53fddf6e799d94550f8c21e567b8e4b7d2e3baa5ae6931aaade79813f6cfe4a73206813d59aac961
+    "0x5523d9648dbbb91675acf5aa53fddf6e799d94550f8c21e5, 0x67b8e4b7d2e3baa5ae6931aaade79813f6cfe4a73206813d"
+    4;
+  "binpoly: 0x8000000000000000000000000000000000000000000000bb; bin: 1, 1"
+    6
+    065523d9648dbbb91675acf5aa53fddf6e799d94550f8c21e567b8e4b7d2e3baa5ae6931aaade79813f6cfe4a73206813dab63dabc6d9df5
+    FAIL
+    7;
+  "binpoly: 0x8000000000000000000000000000000000000000000000bb; bin: 1, 1"
+    8
+    0b5523d9648dbbb91675acf5aa53fddf6e799d94550f8c21e5276c591b7ceff8c2ee2235f54b4c
+    "0x5523d9648dbbb91675acf5aa53fddf6e799d94550f8c21e5, 0x67b8e4b7d2e3baa5ae6931aaade79813f6cfe4a73206813d"
+    14;
+  "binpoly: 0x8000000000000000000000000000000000000000000000bb; bin: 1, 1"
+    12
+    0f5523d9648dbbb91675acf5aa53fddf6e799d94550f8c21e567b8e4b7d2e3baa5ae6931aaade79813f6cfe4a73206813d9932ef5f8528425f34902d9b
+    "0x5523d9648dbbb91675acf5aa53fddf6e799d94550f8c21e5, 0x67b8e4b7d2e3baa5ae6931aaade79813f6cfe4a73206813d"
+    12;
+  "binpoly: 0x8000000000000000000000000000000000000000000000bb; bin: 1, 1"
+    12
+    0e5523d9648dbbb91675acf5aa53fddf6e799d94550f8c21e567b8e4b7d2e3baa5ae6931aaade79813f6cfe4a73206813d44bb0de380
+    FAIL
+    5;
+  "binpoly: 0x8000000000000000000000000000000000000000000000bb; bin: 1, 1"
+    1
+    01445e705aa6399aa54b9187b3ec473cd4ac68f628260bd1064e949a64ca90fd0764c49703b21c
+    "0x445e705aa6399aa54b9187b3ec473cd4ac68f628260bd106, 0x564825543eca1f13f6c580d305b8db3200700fed789bcd03"
+    14;
+  "binpoly: 0x8000000000000000000000000000000000000000000000bb; bin: 1, 1"
+    4
+    04445e705aa6399aa54b9187b3ec473cd4ac68f628260bd1061216550e98f385b6bd540760e9ffe7e6ac18f9c55e901c0535abf5f1bd
+    "0x445e705aa6399aa54b9187b3ec473cd4ac68f628260bd106, 0x1216550e98f385b6bd540760e9ffe7e6ac18f9c55e901c05"
+    5;
+  "binpoly: 0x8000000000000000000000000000000000000000000000bb; bin: 1, 1"
+    2
+    03445e705aa6399aa54b9187b3ec473cd4ac68f628260bd1068854e5ccca5e5bc84d995bb86743
+    "0x445e705aa6399aa54b9187b3ec473cd4ac68f628260bd106, 0x1216550e98f385b6bd540760e9ffe7e6ac18f9c55e901c05"
+    14;
+  "binpoly: 0x8000000000000000000000000000000000000000000000bb; bin: 1, 1"
+    6
+    07445e705aa6399aa54b9187b3ec473cd4ac68f628260bd1061216550e98f385b6bd540760e9ffe7e6ac18f9c55e901c05ddc57448b48f429208
+    "0x445e705aa6399aa54b9187b3ec473cd4ac68f628260bd106, 0x1216550e98f385b6bd540760e9ffe7e6ac18f9c55e901c05"
+    9;
+  "binpoly: 0x8000000000000000000000000000000000000000000000bb; bin: 1, 1"
+    6
+    06445e705aa6399aa54b9187b3ec473cd4ac68f628260bd1061216550e98f385b6bd540760e9ffe7e6ac18f9c55e901c05c6625905c3a0
+    FAIL
+    6;
+  "binpoly: 0x8000000000000000000000000000000000000000000000bb; bin: 1, 1"
+    8
+    0a445e705aa6399aa54b9187b3ec473cd4ac68f628260bd106da2c5a
+    "0x445e705aa6399aa54b9187b3ec473cd4ac68f628260bd106, 0x1216550e98f385b6bd540760e9ffe7e6ac18f9c55e901c05"
+    3;
+  "binpoly: 0x8000000000000000000000000000000000000000000000bb; bin: 1, 1"
+    12
+    0e445e705aa6399aa54b9187b3ec473cd4ac68f628260bd1061216550e98f385b6bd540760e9ffe7e6ac18f9c55e901c05909dbd0e78550d3ceb685126a62609
+    "0x445e705aa6399aa54b9187b3ec473cd4ac68f628260bd106, 0x1216550e98f385b6bd540760e9ffe7e6ac18f9c55e901c05"
+    15;
+  "binpoly: 0x8000000000000000000000000000000000000000000000bb; bin: 1, 1"
+    12
+    0f445e705aa6399aa54b9187b3ec473cd4ac68f628260bd1061216550e98f385b6bd540760e9ffe7e6ac18f9c55e901c05c9ead4300b
+    FAIL
+    5;
+  "binpoly: 0x8000000000000000000000000000000000000000000000bb; binproj: 1, 1"
+    1
+    016efa496ce41e84ac9c51e39765f5ba81040c105cfa5b3ab831aedfcb
+    "0x6efa496ce41e84ac9c51e39765f5ba81040c105cfa5b3ab8, 0x67b333aa0ca3081a948a2058b9d7e35701d63025280ef530"
+    4;
+  "binpoly: 0x8000000000000000000000000000000000000000000000bb; binproj: 1, 1"
+    4
+    046efa496ce41e84ac9c51e39765f5ba81040c105cfa5b3ab867b333aa0ca3081a948a2058b9d7e35701d63025280ef5302a0a28490d670f9a7756a20c9685
+    "0x6efa496ce41e84ac9c51e39765f5ba81040c105cfa5b3ab8, 0x67b333aa0ca3081a948a2058b9d7e35701d63025280ef530"
+    14;
+  "binpoly: 0x8000000000000000000000000000000000000000000000bb; binproj: 1, 1"
+    2
+    026efa496ce41e84ac9c51e39765f5ba81040c105cfa5b3ab824
+    "0x6efa496ce41e84ac9c51e39765f5ba81040c105cfa5b3ab8, 0x67b333aa0ca3081a948a2058b9d7e35701d63025280ef530"
+    1;
+  "binpoly: 0x8000000000000000000000000000000000000000000000bb; binproj: 1, 1"
+    6
+    066efa496ce41e84ac9c51e39765f5ba81040c105cfa5b3ab867b333aa0ca3081a948a2058b9d7e35701d63025280ef5300a088e3c
+    "0x6efa496ce41e84ac9c51e39765f5ba81040c105cfa5b3ab8, 0x67b333aa0ca3081a948a2058b9d7e35701d63025280ef530"
+    4;
+  "binpoly: 0x8000000000000000000000000000000000000000000000bb; binproj: 1, 1"
+    6
+    076efa496ce41e84ac9c51e39765f5ba81040c105cfa5b3ab867b333aa0ca3081a948a2058b9d7e35701d63025280ef53091165419d6c73202
+    FAIL
+    8;
+  "binpoly: 0x8000000000000000000000000000000000000000000000bb; binproj: 1, 1"
+    8
+    0b6efa496ce41e84ac9c51e39765f5ba81040c105cfa5b3ab85aced3aedbcd63da
+    "0x6efa496ce41e84ac9c51e39765f5ba81040c105cfa5b3ab8, 0x67b333aa0ca3081a948a2058b9d7e35701d63025280ef530"
+    8;
+  "binpoly: 0x8000000000000000000000000000000000000000000000bb; binproj: 1, 1"
+    12
+    0f6efa496ce41e84ac9c51e39765f5ba81040c105cfa5b3ab867b333aa0ca3081a948a2058b9d7e35701d63025280ef5309632074b2d964c3b854a4dd8dab86d
+    "0x6efa496ce41e84ac9c51e39765f5ba81040c105cfa5b3ab8, 0x67b333aa0ca3081a948a2058b9d7e35701d63025280ef530"
+    15;
+  "binpoly: 0x8000000000000000000000000000000000000000000000bb; binproj: 1, 1"
+    12
+    0e6efa496ce41e84ac9c51e39765f5ba81040c105cfa5b3ab867b333aa0ca3081a948a2058b9d7e35701d63025280ef53048a05700b1643d293af5
+    FAIL
+    10;
+  "binpoly: 0x8000000000000000000000000000000000000000000000bb; binproj: 1, 1"
+    1
+    01635c7f2e747f7a5ffe9560056369b37971ce53ef4d9befd63083b001be6dbdeb37be2e
+    "0x635c7f2e747f7a5ffe9560056369b37971ce53ef4d9befd6, 0x3402953703ad0e287e16bd2768ae4641a0d40afc41f393f5"
+    11;
+  "binpoly: 0x8000000000000000000000000000000000000000000000bb; binproj: 1, 1"
+    4
+    04635c7f2e747f7a5ffe9560056369b37971ce53ef4d9befd63402953703ad0e287e16bd2768ae4641a0d40afc41f393f5aca3f3f90b1ea55dcbb91e60
+    "0x635c7f2e747f7a5ffe9560056369b37971ce53ef4d9befd6, 0x3402953703ad0e287e16bd2768ae4641a0d40afc41f393f5"
+    12;
+  "binpoly: 0x8000000000000000000000000000000000000000000000bb; binproj: 1, 1"
+    2
+    02635c7f2e747f7a5ffe9560056369b37971ce53ef4d9befd6
+    "0x635c7f2e747f7a5ffe9560056369b37971ce53ef4d9befd6, 0x3402953703ad0e287e16bd2768ae4641a0d40afc41f393f5"
+    0;
+  "binpoly: 0x8000000000000000000000000000000000000000000000bb; binproj: 1, 1"
+    6
+    06635c7f2e747f7a5ffe9560056369b37971ce53ef4d9befd63402953703ad0e287e16bd2768ae4641a0d40afc41f393f5121e955c85c2d00d9e05b56a
+    "0x635c7f2e747f7a5ffe9560056369b37971ce53ef4d9befd6, 0x3402953703ad0e287e16bd2768ae4641a0d40afc41f393f5"
+    12;
+  "binpoly: 0x8000000000000000000000000000000000000000000000bb; binproj: 1, 1"
+    6
+    07635c7f2e747f7a5ffe9560056369b37971ce53ef4d9befd63402953703ad0e287e16bd2768ae4641a0d40afc41f393f52ce3f0a16ec4581d7440eb3d27
+    FAIL
+    13;
+  "binpoly: 0x8000000000000000000000000000000000000000000000bb; binproj: 1, 1"
+    8
+    0a635c7f2e747f7a5ffe9560056369b37971ce53ef4d9befd6ab6312708e1f56187628124c
+    "0x635c7f2e747f7a5ffe9560056369b37971ce53ef4d9befd6, 0x3402953703ad0e287e16bd2768ae4641a0d40afc41f393f5"
+    12;
+  "binpoly: 0x8000000000000000000000000000000000000000000000bb; binproj: 1, 1"
+    12
+    0e635c7f2e747f7a5ffe9560056369b37971ce53ef4d9befd63402953703ad0e287e16bd2768ae4641a0d40afc41f393f57dd939315fa66e5f3e9a79b2
+    "0x635c7f2e747f7a5ffe9560056369b37971ce53ef4d9befd6, 0x3402953703ad0e287e16bd2768ae4641a0d40afc41f393f5"
+    12;
+  "binpoly: 0x8000000000000000000000000000000000000000000000bb; binproj: 1, 1"
+    12
+    0f635c7f2e747f7a5ffe9560056369b37971ce53ef4d9befd63402953703ad0e287e16bd2768ae4641a0d40afc41f393f57d117748fba9d73c23
+    FAIL
+    9;
+  "binpoly: 0x8000000000000000000000000000000000000000000000bb; binproj: 1, 1"
+    1
+    0105c672a9eba4a4f5ab94bf732c230789b0bfc2537b44f69975
+    "0x5c672a9eba4a4f5ab94bf732c230789b0bfc2537b44f699, 0x6771e747ff1a99be39ab8267b30645b8cc1b66dbd6de5212"
+    1;
+  "binpoly: 0x8000000000000000000000000000000000000000000000bb; binproj: 1, 1"
+    4
+    0405c672a9eba4a4f5ab94bf732c230789b0bfc2537b44f6996771e747ff1a99be39ab8267b30645b8cc1b66dbd6de521257f1727620162e8f77fefd02df
+    "0x5c672a9eba4a4f5ab94bf732c230789b0bfc2537b44f699, 0x6771e747ff1a99be39ab8267b30645b8cc1b66dbd6de5212"
+    13;
+  "binpoly: 0x8000000000000000000000000000000000000000000000bb; binproj: 1, 1"
+    2
+    0205c672a9eba4a4f5ab94bf732c230789b0bfc2537b44f699ea521a
+    "0x5c672a9eba4a4f5ab94bf732c230789b0bfc2537b44f699, 0x6771e747ff1a99be39ab8267b30645b8cc1b66dbd6de5212"
+    3;
+  "binpoly: 0x8000000000000000000000000000000000000000000000bb; binproj: 1, 1"
+    6
+    0605c672a9eba4a4f5ab94bf732c230789b0bfc2537b44f6996771e747ff1a99be39ab8267b30645b8cc1b66dbd6de5212238b7c
+    "0x5c672a9eba4a4f5ab94bf732c230789b0bfc2537b44f699, 0x6771e747ff1a99be39ab8267b30645b8cc1b66dbd6de5212"
+    3;
+  "binpoly: 0x8000000000000000000000000000000000000000000000bb; binproj: 1, 1"
+    6
+    0705c672a9eba4a4f5ab94bf732c230789b0bfc2537b44f6996771e747ff1a99be39ab8267b30645b8cc1b66dbd6de52128ca8ed35b054ccdefcbf
+    FAIL
+    10;
+  "binpoly: 0x8000000000000000000000000000000000000000000000bb; binproj: 1, 1"
+    8
+    0b05c672a9eba4a4f5ab94bf732c230789b0bfc2537b44f699b06c138c2f638621f0ab9b
+    "0x5c672a9eba4a4f5ab94bf732c230789b0bfc2537b44f699, 0x6771e747ff1a99be39ab8267b30645b8cc1b66dbd6de5212"
+    11;
+  "binpoly: 0x8000000000000000000000000000000000000000000000bb; binproj: 1, 1"
+    12
+    0f05c672a9eba4a4f5ab94bf732c230789b0bfc2537b44f6996771e747ff1a99be39ab8267b30645b8cc1b66dbd6de5212
+    "0x5c672a9eba4a4f5ab94bf732c230789b0bfc2537b44f699, 0x6771e747ff1a99be39ab8267b30645b8cc1b66dbd6de5212"
+    0;
+  "binpoly: 0x8000000000000000000000000000000000000000000000bb; binproj: 1, 1"
+    12
+    0e05c672a9eba4a4f5ab94bf732c230789b0bfc2537b44f6996771e747ff1a99be39ab8267b30645b8cc1b66dbd6de52122d496023de9fa5
+    FAIL
+    7;
+  "binpoly: 0x8000000000000000000000000000000000000000000000bb; binproj: 1, 1"
+    1
+    0126ca222daf14d8b20a6084ed63851be9658c64282c57df3cfc
+    "0x26ca222daf14d8b20a6084ed63851be9658c64282c57df3c, 0x67f4b57ecbaee65dba12396016339b1c542e58eb226d2e26"
+    1;
+  "binpoly: 0x8000000000000000000000000000000000000000000000bb; binproj: 1, 1"
+    4
+    0426ca222daf14d8b20a6084ed63851be9658c64282c57df3c67f4b57ecbaee65dba12396016339b1c542e58eb226d2e264371
+    "0x26ca222daf14d8b20a6084ed63851be9658c64282c57df3c, 0x67f4b57ecbaee65dba12396016339b1c542e58eb226d2e26"
+    2;
+  "binpoly: 0x8000000000000000000000000000000000000000000000bb; binproj: 1, 1"
+    2
+    0226ca222daf14d8b20a6084ed63851be9658c64282c57df3c896ca9fd69a0d41ba5bfd877
+    "0x26ca222daf14d8b20a6084ed63851be9658c64282c57df3c, 0x67f4b57ecbaee65dba12396016339b1c542e58eb226d2e26"
+    12;
+  "binpoly: 0x8000000000000000000000000000000000000000000000bb; binproj: 1, 1"
+    6
+    0626ca222daf14d8b20a6084ed63851be9658c64282c57df3c67f4b57ecbaee65dba12396016339b1c542e58eb226d2e261c70
+    "0x26ca222daf14d8b20a6084ed63851be9658c64282c57df3c, 0x67f4b57ecbaee65dba12396016339b1c542e58eb226d2e26"
+    2;
+  "binpoly: 0x8000000000000000000000000000000000000000000000bb; binproj: 1, 1"
+    6
+    0726ca222daf14d8b20a6084ed63851be9658c64282c57df3c67f4b57ecbaee65dba12396016339b1c542e58eb226d2e266870
+    FAIL
+    2;
+  "binpoly: 0x8000000000000000000000000000000000000000000000bb; binproj: 1, 1"
+    8
+    0b26ca222daf14d8b20a6084ed63851be9658c64282c57df3ca517e0
+    "0x26ca222daf14d8b20a6084ed63851be9658c64282c57df3c, 0x67f4b57ecbaee65dba12396016339b1c542e58eb226d2e26"
+    3;
+  "binpoly: 0x8000000000000000000000000000000000000000000000bb; binproj: 1, 1"
+    12
+    0f26ca222daf14d8b20a6084ed63851be9658c64282c57df3c67f4b57ecbaee65dba12396016339b1c542e58eb226d2e26b822360e1c783a23948d5b578c6c51
+    "0x26ca222daf14d8b20a6084ed63851be9658c64282c57df3c, 0x67f4b57ecbaee65dba12396016339b1c542e58eb226d2e26"
+    15;
+  "binpoly: 0x8000000000000000000000000000000000000000000000bb; binproj: 1, 1"
+    12
+    0e26ca222daf14d8b20a6084ed63851be9658c64282c57df3c67f4b57ecbaee65dba12396016339b1c542e58eb226d2e2601599300801b78daf2af0608cf0a
+    FAIL
+    14;
+  "binpoly: 0x8000000000000000000000000000000000000000000000bb; bin: 1, 1"
+    1
+    014764c6b6c9c25e7cf62a2cb3c9bc35f0673f097295e7b7efb6d12b819eed
+    "0x4764c6b6c9c25e7cf62a2cb3c9bc35f0673f097295e7b7ef, 0x90f3cdb22f80cfe9ec90a481e02628c1157e7fb2f1cd3a8"
+    6;
+  "binpoly: 0x8000000000000000000000000000000000000000000000bb; bin: 1, 1"
+    4
+    044764c6b6c9c25e7cf62a2cb3c9bc35f0673f097295e7b7ef4e6bfa6deb3a528268e326fbd7be577c7668ee89bafb64470a181c91eff8
+    "0x4764c6b6c9c25e7cf62a2cb3c9bc35f0673f097295e7b7ef, 0x4e6bfa6deb3a528268e326fbd7be577c7668ee89bafb6447"
+    6;
+  "binpoly: 0x8000000000000000000000000000000000000000000000bb; bin: 1, 1"
+    2
+    034764c6b6c9c25e7cf62a2cb3c9bc35f0673f097295e7b7ef474e87ebdb2472db13d972255490
+    "0x4764c6b6c9c25e7cf62a2cb3c9bc35f0673f097295e7b7ef, 0x4e6bfa6deb3a528268e326fbd7be577c7668ee89bafb6447"
+    14;
+  "binpoly: 0x8000000000000000000000000000000000000000000000bb; bin: 1, 1"
+    6
+    074764c6b6c9c25e7cf62a2cb3c9bc35f0673f097295e7b7ef4e6bfa6deb3a528268e326fbd7be577c7668ee89bafb6447a70a4bd2e3f7
+    "0x4764c6b6c9c25e7cf62a2cb3c9bc35f0673f097295e7b7ef, 0x4e6bfa6deb3a528268e326fbd7be577c7668ee89bafb6447"
+    6;
+  "binpoly: 0x8000000000000000000000000000000000000000000000bb; bin: 1, 1"
+    6
+    064764c6b6c9c25e7cf62a2cb3c9bc35f0673f097295e7b7ef4e6bfa6deb3a528268e326fbd7be577c7668ee89bafb644707
+    FAIL
+    1;
+  "binpoly: 0x8000000000000000000000000000000000000000000000bb; bin: 1, 1"
+    8
+    0b4764c6b6c9c25e7cf62a2cb3c9bc35f0673f097295e7b7efc8
+    "0x4764c6b6c9c25e7cf62a2cb3c9bc35f0673f097295e7b7ef, 0x4e6bfa6deb3a528268e326fbd7be577c7668ee89bafb6447"
+    1;
+  "binpoly: 0x8000000000000000000000000000000000000000000000bb; bin: 1, 1"
+    12
+    0f4764c6b6c9c25e7cf62a2cb3c9bc35f0673f097295e7b7ef4e6bfa6deb3a528268e326fbd7be577c7668ee89bafb64473d7bcd98d9
+    "0x4764c6b6c9c25e7cf62a2cb3c9bc35f0673f097295e7b7ef, 0x4e6bfa6deb3a528268e326fbd7be577c7668ee89bafb6447"
+    5;
+  "binpoly: 0x8000000000000000000000000000000000000000000000bb; bin: 1, 1"
+    12
+    0e4764c6b6c9c25e7cf62a2cb3c9bc35f0673f097295e7b7ef4e6bfa6deb3a528268e326fbd7be577c7668ee89bafb64479a8e5686ea1efd44632a1781
+    FAIL
+    12;
+  "binpoly: 0x8000000000000000000000000000000000000000000000bb; bin: 1, 1"
+    1
+    01221d6ff334169a924b143bdf6fdfafbfaa83b5ba8d09d1534101d3c1fad2751f5b3062364a
+    "0x221d6ff334169a924b143bdf6fdfafbfaa83b5ba8d09d153, 0xb602674c9327bb95316921aea623174f1f20b3338484b7a"
+    13;
+  "binpoly: 0x8000000000000000000000000000000000000000000000bb; bin: 1, 1"
+    4
+    04221d6ff334169a924b143bdf6fdfafbfaa83b5ba8d09d1530b602674c9327bb95316921aea623174f1f20b3338484b7af1ec592dd09371
+    "0x221d6ff334169a924b143bdf6fdfafbfaa83b5ba8d09d153, 0xb602674c9327bb95316921aea623174f1f20b3338484b7a"
+    7;
+  "binpoly: 0x8000000000000000000000000000000000000000000000bb; bin: 1, 1"
+    2
+    02221d6ff334169a924b143bdf6fdfafbfaa83b5ba8d09d15303276ba9fe7175ce163b98e2cd
+    "0x221d6ff334169a924b143bdf6fdfafbfaa83b5ba8d09d153, 0xb602674c9327bb95316921aea623174f1f20b3338484b7a"
+    13;
+  "binpoly: 0x8000000000000000000000000000000000000000000000bb; bin: 1, 1"
+    6
+    06221d6ff334169a924b143bdf6fdfafbfaa83b5ba8d09d1530b602674c9327bb95316921aea623174f1f20b3338484b7a704abda8bfca391b7ef8d74b
+    "0x221d6ff334169a924b143bdf6fdfafbfaa83b5ba8d09d153, 0xb602674c9327bb95316921aea623174f1f20b3338484b7a"
+    12;
+  "binpoly: 0x8000000000000000000000000000000000000000000000bb; bin: 1, 1"
+    6
+    07221d6ff334169a924b143bdf6fdfafbfaa83b5ba8d09d1530b602674c9327bb95316921aea623174f1f20b3338484b7acc90cd
+    FAIL
+    3;
+  "binpoly: 0x8000000000000000000000000000000000000000000000bb; bin: 1, 1"
+    8
+    0a221d6ff334169a924b143bdf6fdfafbfaa83b5ba8d09d1537e6fec16e568c552de9dc3
+    "0x221d6ff334169a924b143bdf6fdfafbfaa83b5ba8d09d153, 0xb602674c9327bb95316921aea623174f1f20b3338484b7a"
+    11;
+  "binpoly: 0x8000000000000000000000000000000000000000000000bb; bin: 1, 1"
+    12
+    0e221d6ff334169a924b143bdf6fdfafbfaa83b5ba8d09d1530b602674c9327bb95316921aea623174f1f20b3338484b7ab528
+    "0x221d6ff334169a924b143bdf6fdfafbfaa83b5ba8d09d153, 0xb602674c9327bb95316921aea623174f1f20b3338484b7a"
+    2;
+  "binpoly: 0x8000000000000000000000000000000000000000000000bb; bin: 1, 1"
+    12
+    0f221d6ff334169a924b143bdf6fdfafbfaa83b5ba8d09d1530b602674c9327bb95316921aea623174f1f20b3338484b7a367d87af747f47f8baa943
+    FAIL
+    11;
+  "binpoly: 0x8000000000000000000000000000000000000000000000bb; binproj: 1, 1"
+    1
+    010f83e072c75f0ee7d39fec8340d64bdb8c83cd4546492fc3921bf5205d034225417a9cda8d
+    "0xf83e072c75f0ee7d39fec8340d64bdb8c83cd4546492fc3, 0x323d1d0a1e45908dfbfe62254b4f86b0df175389b5b6f222"
+    13;
+  "binpoly: 0x8000000000000000000000000000000000000000000000bb; binproj: 1, 1"
+    4
+    040f83e072c75f0ee7d39fec8340d64bdb8c83cd4546492fc3323d1d0a1e45908dfbfe62254b4f86b0df175389b5b6f222740c72d3997951b543ad
+    "0xf83e072c75f0ee7d39fec8340d64bdb8c83cd4546492fc3, 0x323d1d0a1e45908dfbfe62254b4f86b0df175389b5b6f222"
+    10;
+  "binpoly: 0x8000000000000000000000000000000000000000000000bb; binproj: 1, 1"
+    2
+    020f83e072c75f0ee7d39fec8340d64bdb8c83cd4546492fc3f2b3a0d5c04e1b6a18
+    "0xf83e072c75f0ee7d39fec8340d64bdb8c83cd4546492fc3, 0x323d1d0a1e45908dfbfe62254b4f86b0df175389b5b6f222"
+    9;
+  "binpoly: 0x8000000000000000000000000000000000000000000000bb; binproj: 1, 1"
+    6
+    060f83e072c75f0ee7d39fec8340d64bdb8c83cd4546492fc3323d1d0a1e45908dfbfe62254b4f86b0df175389b5b6f222f6c29092934952b9b039238e3a3c52
+    "0xf83e072c75f0ee7d39fec8340d64bdb8c83cd4546492fc3, 0x323d1d0a1e45908dfbfe62254b4f86b0df175389b5b6f222"
+    15;
+  "binpoly: 0x8000000000000000000000000000000000000000000000bb; binproj: 1, 1"
+    6
+    070f83e072c75f0ee7d39fec8340d64bdb8c83cd4546492fc3323d1d0a1e45908dfbfe62254b4f86b0df175389b5b6f2229c010dc5e90e8793911b048285
+    FAIL
+    13;
+  "binpoly: 0x8000000000000000000000000000000000000000000000bb; binproj: 1, 1"
+    8
+    0a0f83e072c75f0ee7d39fec8340d64bdb8c83cd4546492fc3e8ab4bdbe0db5ae79f51fcb69c
+    "0xf83e072c75f0ee7d39fec8340d64bdb8c83cd4546492fc3, 0x323d1d0a1e45908dfbfe62254b4f86b0df175389b5b6f222"
+    13;
+  "binpoly: 0x8000000000000000000000000000000000000000000000bb; binproj: 1, 1"
+    12
+    0e0f83e072c75f0ee7d39fec8340d64bdb8c83cd4546492fc3323d1d0a1e45908dfbfe62254b4f86b0df175389b5b6f2224cad
+    "0xf83e072c75f0ee7d39fec8340d64bdb8c83cd4546492fc3, 0x323d1d0a1e45908dfbfe62254b4f86b0df175389b5b6f222"
+    2;
+  "binpoly: 0x8000000000000000000000000000000000000000000000bb; binproj: 1, 1"
+    12
+    0f0f83e072c75f0ee7d39fec8340d64bdb8c83cd4546492fc3323d1d0a1e45908dfbfe62254b4f86b0df175389b5b6f222db2cbc
+    FAIL
+    3;
+  "binpoly: 0x8000000000000000000000000000000000000000000000bb; binproj: 1, 1"
+    1
+    013d48eaeb8f7a9a37e65544f2be47d91c9cacd9774dab3bf771ef29ed1ad295b15d870db977
+    "0x3d48eaeb8f7a9a37e65544f2be47d91c9cacd9774dab3bf7, 0x6a0dd4b1cc1df9ccd9da5f55ccb79e9136b70aa70a7f521c"
+    13;
+  "binpoly: 0x8000000000000000000000000000000000000000000000bb; binproj: 1, 1"
+    4
+    043d48eaeb8f7a9a37e65544f2be47d91c9cacd9774dab3bf757453e5a436763fb3f8f1ba772f0478daa1bd3d047d469eb460e
+    "0x3d48eaeb8f7a9a37e65544f2be47d91c9cacd9774dab3bf7, 0x57453e5a436763fb3f8f1ba772f0478daa1bd3d047d469eb"
+    2;
+  "binpoly: 0x8000000000000000000000000000000000000000000000bb; binproj: 1, 1"
+    2
+    033d48eaeb8f7a9a37e65544f2be47d91c9cacd9774dab3bf7
+    "0x3d48eaeb8f7a9a37e65544f2be47d91c9cacd9774dab3bf7, 0x57453e5a436763fb3f8f1ba772f0478daa1bd3d047d469eb"
+    0;
+  "binpoly: 0x8000000000000000000000000000000000000000000000bb; binproj: 1, 1"
+    6
+    073d48eaeb8f7a9a37e65544f2be47d91c9cacd9774dab3bf757453e5a436763fb3f8f1ba772f0478daa1bd3d047d469ebfe3c510223cefe01e05f09200cd5
+    "0x3d48eaeb8f7a9a37e65544f2be47d91c9cacd9774dab3bf7, 0x57453e5a436763fb3f8f1ba772f0478daa1bd3d047d469eb"
+    14;
+  "binpoly: 0x8000000000000000000000000000000000000000000000bb; binproj: 1, 1"
+    6
+    063d48eaeb8f7a9a37e65544f2be47d91c9cacd9774dab3bf757453e5a436763fb3f8f1ba772f0478daa1bd3d047d469eb4283ab7b1b98a2b331
+    FAIL
+    9;
+  "binpoly: 0x8000000000000000000000000000000000000000000000bb; binproj: 1, 1"
+    8
+    0a3d48eaeb8f7a9a37e65544f2be47d91c9cacd9774dab3bf79f0cd6e0f31b196f7a6630c519
+    "0x3d48eaeb8f7a9a37e65544f2be47d91c9cacd9774dab3bf7, 0x57453e5a436763fb3f8f1ba772f0478daa1bd3d047d469eb"
+    13;
+  "binpoly: 0x8000000000000000000000000000000000000000000000bb; binproj: 1, 1"
+    12
+    0e3d48eaeb8f7a9a37e65544f2be47d91c9cacd9774dab3bf757453e5a436763fb3f8f1ba772f0478daa1bd3d047d469ebd39b43143d6bc056339abbf7bc2e
+    "0x3d48eaeb8f7a9a37e65544f2be47d91c9cacd9774dab3bf7, 0x57453e5a436763fb3f8f1ba772f0478daa1bd3d047d469eb"
+    14;
+  "binpoly: 0x8000000000000000000000000000000000000000000000bb; binproj: 1, 1"
+    12
+    0f3d48eaeb8f7a9a37e65544f2be47d91c9cacd9774dab3bf757453e5a436763fb3f8f1ba772f0478daa1bd3d047d469eb964e5da7f2ef0457
+    FAIL
+    8;
+  "binpoly: 0x8000000000000000000000000000000000000000000000bb; binproj: 1, 1"
+    2
+    02000000000000000000000000000000000000000000000000810eab33
+    "0, 1"
+    4;
+  "binpoly: 0x8000000000000000000000000000000000000000000000bb; binproj: 1, 1"
+    2
+    0300000000000000000000000000000000000000000000000006
+    FAIL
+    1;
+  "binpoly: 0x8000000000000000000000000000000000000000000000bb; binproj: 1, 1"
+    8
+    0a000000000000000000000000000000000000000000000000cf6d860e9f2ca63958f0c4
+    "0, 1"
+    11;
+  "binpoly: 0x8000000000000000000000000000000000000000000000bb; binproj: 1, 1"
+    8
+    0b000000000000000000000000000000000000000000000000aeabdb38a6382d
+    FAIL
+    7;
+  "binpoly: 0x8000000000000000000000000000000000000000000000bb; binproj: 1, 1"
+    1
+    014972f0274733411c8f7ab6a348dd4789c2125faa86f3d956
+    FAIL
+    0;
+  "binpoly: 0x8000000000000000000000000000000000000000000000bb; binproj: 1, 1"
+    2
+    024972f0274733411c8f7ab6a348dd4789c2125faa86f3d956
+    FAIL
+    0;
+  "binpoly: 0x8000000000000000000000000000000000000000000000bb; binproj: 1, 1"
+    8
+    0a4972f0274733411c8f7ab6a348dd4789c2125faa86f3d956
+    FAIL
+    0;
+}
diff --git a/utils/.gitignore b/utils/.gitignore
new file mode 100644 (file)
index 0000000..cc9cc67
--- /dev/null
@@ -0,0 +1 @@
+ec-compr-test.py
diff --git a/utils/ec-compr-test.sage b/utils/ec-compr-test.sage
new file mode 100644 (file)
index 0000000..08ba525
--- /dev/null
@@ -0,0 +1,220 @@
+#! /usr/local/bin/sage
+### -*-python-*-
+
+from itertools import count, izip
+from random import randrange
+
+## Constants.
+EC_YBIT = EC_XONLY = 1
+EC_CMPR = EC_LSB = 2
+EC_EXPLY = 4
+EC_SORT = 8
+
+## Conversion primitives.
+def poly_to_int(x, p):
+  return ZZ(sum([ZZ(a)*p**i for a, i in izip(x.list(), count())]))
+def int_to_poly(n, p, t):
+  return sum([a*t**i for a, i in izip(n.digits(p), count())])
+
+def fe2ip(x):
+  return poly_to_int(x.polynomial(), x.parent().characteristic())
+def i2fep(n, k):
+  return int_to_poly(n, k.characteristic(), k.gen())
+
+def fe2osp(x):
+  k = x.parent()
+  n = fe2ip(x)
+  nb = ceil((k.cardinality() - 1).nbits()/8)
+  v = n.digits(256, padto = nb); v.reverse(); return v
+
+def os2sp(v):
+  return ''.join('%02x' % i for i in v)
+
+def fe2sp(x):
+  if x == 0 or x == 1:
+    return '%d' % x
+  if x.parent().degree() > 1:
+    return '0x%x' % fe2ip(x)
+  else:
+    n = ZZ(x + 99)
+    if n < 199: return '%d' % (n - 99)
+    else: return '0x%x' % x
+
+def os_to_hex(v):
+  return ''.join('%02x' % b for b in v)
+
+## Other utilities.
+def find_2torsion_point(E, n):
+  while is_even(n): n //= 2
+  while True:
+    Q = E.random_point()
+    R = n*Q
+    if R: break
+  while True:
+    S = 2*R
+    if not S: break
+    R = S
+  return R
+
+def pick_at_random(choices):
+  return choices[randrange(len(choices))]
+
+## Output an elliptic curve description.
+def ecdescr(E):
+  k = E.base_ring()
+  m = k.degree()
+  if m == 1:
+    fdesc = '%s: %d' % (pick_at_random(['prime', 'niceprime']),
+                        k.characteristic())
+    cdesc = '%s: %s, %s' % (pick_at_random(['prime', 'primeproj']),
+                            fe2sp(E.a4()), fe2sp(E.a6()))
+  elif k.characteristic() == 2:
+    fdesc = '%s: 0x%x' % ('binpoly', poly_to_int(k.polynomial(), 2))
+    cdesc = '%s: %s, %s' % (pick_at_random(['bin', 'binproj']),
+                            fe2sp(E.a2()), fe2sp(E.a6()))
+  else:
+    raise ValueError, 'only prime or binary fields supported'
+  return '"%s; %s"' % (fdesc, cdesc)
+
+## Output a point description.
+def ecpt(Q):
+  if Q is None: return 'FAIL'
+  elif not Q: return 'inf'
+  else: return '"%s, %s"' % (fe2sp(Q[0]), fe2sp(Q[1]))
+
+## Compress a point.
+def ptcompr_lsb(Q):
+  x, y = Q[0], Q[1]
+  if Q.curve().base_ring().characteristic() != 2:
+    return is_odd(fe2ip(y)) and EC_YBIT or 0
+  elif x == 0:
+    return 0
+  else:
+    return (y/x).polynomial()[0] == 1 and EC_YBIT or 0
+
+def ptcompr_sort(Q):
+  y = fe2ip(Q[1]); yy = fe2ip((-Q)[1])
+  return y > yy and EC_YBIT or 0
+
+## Some elliptic curves.  Chosen to have 2-torsion, so as to test edge cases
+## where Q = -Q; in particular, 2-torsion points can't have their
+## y-coordinates compressed to 1.
+p = previous_prime(2^192); k_p = GF(p)
+E_p = EllipticCurve(k_p, [-3, 6])
+n_p = 6277101735386680763835789423293484020607766684840576538738
+T_p = find_2torsion_point(E_p, n_p)
+
+k_2.<t> = GF(2^191)
+E_2 = EllipticCurve(k_2, [1, 1, 0, 0, 1])
+n_2 = 3138550867693340381917894711593325610042432240066118385966
+T_2 = find_2torsion_point(E_2, n_2)
+
+def test_ec2osp(E, Q):
+  ec = ecdescr(E)
+  pt = ecpt(Q)
+  xs, ys = fe2osp(Q[0]), fe2osp(Q[1])
+  ybit_lsb = ptcompr_lsb(Q)
+  ybit_sort = ptcompr_sort(Q)
+
+  def out(f, s):
+    print '  %s\n    %d %s\n    %s;' % (ec, f, pt, os_to_hex(s))
+
+  out(EC_XONLY, [EC_XONLY] + xs)
+  out(EC_CMPR, [EC_CMPR | ybit_lsb] + xs)
+  out(EC_CMPR | EC_SORT, [EC_CMPR | EC_SORT | ybit_sort] + xs)
+  out(EC_EXPLY, [EC_EXPLY] + xs + ys)
+  out(EC_CMPR | EC_EXPLY, [EC_CMPR | EC_EXPLY | ybit_lsb] + xs + ys)
+  out(EC_CMPR | EC_SORT | EC_EXPLY,
+      [EC_CMPR | EC_SORT | EC_EXPLY | ybit_sort] + xs + ys)
+
+print 'ec2osp {'
+for i in xrange(20): test_ec2osp(E_p, E_p.random_point())
+test_ec2osp(E_p, T_p)
+for i in xrange(20): test_ec2osp(E_2, E_2.random_point())
+test_ec2osp(E_2, T_2)
+print '}'
+
+def test_os2ecp(E, Q):
+  ec = ecdescr(E)
+  k = E.base_ring()
+  m = k.degree()
+  x, y = Q[0], Q[1]
+  xs, ys = fe2osp(Q[0]), fe2osp(Q[1])
+  ybit_lsb = ptcompr_lsb(Q)
+  ybit_sort = ptcompr_sort(Q)
+
+  def out(f, s, Q):
+    sufflen = randrange(16)
+    suff = [randrange(256) for i in xrange(sufflen)]
+    print '  %s\n    %d\n    %s\n    %s\n    %d;' % (
+      ec, f, os_to_hex(s + suff), ecpt(Q), sufflen)
+
+  ## This is the algorithm from `gfreduce_quadsolve'.
+  B = x^3 + E.a2()*x^2 + E.a4()*x + E.a6()
+  A = E.a1()*x + E.a3()
+  if A == 0:
+    yy = sqrt(B)
+  else:
+    xx = B/A^2
+    while True:
+      rho = k.random_element()
+      if rho.trace() == 1: break
+    z = sum(rho^(2^i)*sum(xx^(2^j) for j in xrange(i)) for i in xrange(m))
+    if z.polynomial()[0]: z -= 1
+    yy = A*z
+
+  out(EC_XONLY, [EC_XONLY] + xs, E(x, yy))
+  out(EC_EXPLY, [EC_EXPLY] + xs + ys, Q)
+
+  out(EC_LSB, [EC_CMPR | ybit_lsb] + xs, Q)
+  out(EC_LSB | EC_EXPLY, [EC_EXPLY | EC_CMPR | ybit_lsb] + xs + ys, Q)
+  out(EC_LSB | EC_EXPLY,
+      [EC_EXPLY | EC_CMPR | (not ybit_lsb)] + xs + ys, None)
+
+  out(EC_SORT, [EC_CMPR | EC_SORT | ybit_sort] + xs, Q)
+  out(EC_SORT | EC_EXPLY,
+      [EC_EXPLY | EC_CMPR | EC_SORT | ybit_sort] + xs + ys, Q)
+  out(EC_SORT | EC_EXPLY,
+      [EC_EXPLY | EC_CMPR | EC_SORT | (not ybit_sort)] + xs + ys, None)
+
+def test_os2ecp_2torsion(E, Q):
+  ec = ecdescr(E)
+  k = E.base_ring()
+  m = k.degree()
+  x, y = Q[0], Q[1]
+  xs, ys = fe2osp(Q[0]), fe2osp(Q[1])
+
+  def out(f, s, Q):
+    sufflen = randrange(16)
+    suff = [randrange(256) for i in xrange(sufflen)]
+    print '  %s\n    %d\n    %s\n    %s\n    %d;' % (
+      ec, f, os_to_hex(s + suff), ecpt(Q), sufflen)
+
+  out(EC_LSB, [EC_CMPR] + xs, Q)
+  out(EC_LSB, [EC_CMPR | EC_YBIT] + xs, None)
+  out(EC_SORT, [EC_SORT | EC_CMPR] + xs, Q)
+  out(EC_SORT, [EC_SORT | EC_CMPR | EC_YBIT] + xs, None)
+
+def test_os2ecp_notpoints(E):
+  ec = ecdescr(E)
+  k = E.base_ring()
+
+  def out(f, s):
+    print '  %s\n    %d\n    %s\n    FAIL\n    0;' % (ec, f, os_to_hex(s))
+
+  while True:
+    x = k.random_element()
+    if not E.is_x_coord(x): break
+  xs = fe2osp(x)
+  out(EC_XONLY, [EC_XONLY] + xs)
+  out(EC_LSB, [EC_CMPR] + xs)
+  out(EC_SORT, [EC_CMPR | EC_SORT] + xs)
+
+print 'os2ecp {'
+for i in xrange(20): test_os2ecp(E_p, E_p.random_point())
+test_os2ecp_2torsion(E_p, T_p)
+test_os2ecp_notpoints(E_p)
+for i in xrange(20): test_os2ecp(E_2, E_2.random_point())
+test_os2ecp_2torsion(E_2, T_2)
+test_os2ecp_notpoints(E_2)
+print '}'