[SCM] Fast arithmetic with dense matrices over F_{2^e} branch, upstream, updated. 9faf6ece9a183a703670566609063ab274b1c544

Martin Albrecht martinralbrecht at googlemail.com
Mon Sep 10 12:24:26 UTC 2012


The following commit has been merged in the upstream branch:
commit 59e79b4d68c65d89bb820afce628b5eaef930b2f
Author: Martin Albrecht <martinralbrecht at googlemail.com>
Date:   Wed Aug 15 11:25:50 2012 +0100

    added first tests for degrees > 10

diff --git a/src/gf2e.h b/src/gf2e.h
index 13193bf..741bd20 100644
--- a/src/gf2e.h
+++ b/src/gf2e.h
@@ -31,7 +31,7 @@
 #include <m4ri/m4ri.h>
 #include <m4rie/gf2x.h>
 
-#define M4RIE_MAX_DEGREE 10
+#define M4RIE_MAX_DEGREE 16
 
 /**
  * \brief \GF2E
diff --git a/src/mzd_poly.h b/src/mzd_poly.h
index 1546d1a..4bfd932 100644
--- a/src/mzd_poly.h
+++ b/src/mzd_poly.h
@@ -29,6 +29,22 @@
 
 static inline void _poly_add(mzd_t **c, const mzd_t **a, const mzd_t **b,const unsigned int length) {
   switch(length) {
+  case 32: mzd_add(c[31], a[31], b[31]);
+  case 31: mzd_add(c[30], a[30], b[30]);
+  case 30: mzd_add(c[29], a[29], b[29]);
+  case 29: mzd_add(c[28], a[28], b[28]);
+  case 28: mzd_add(c[27], a[27], b[27]);
+  case 27: mzd_add(c[26], a[26], b[26]);
+  case 26: mzd_add(c[25], a[25], b[25]);
+  case 25: mzd_add(c[24], a[24], b[24]);
+  case 24: mzd_add(c[23], a[23], b[23]);
+  case 23: mzd_add(c[22], a[22], b[22]);
+  case 22: mzd_add(c[21], a[21], b[21]);
+  case 21: mzd_add(c[20], a[20], b[20]);
+  case 20: mzd_add(c[19], a[19], b[19]);
+  case 19: mzd_add(c[18], a[18], b[18]);
+  case 18: mzd_add(c[17], a[17], b[17]);
+  case 17: mzd_add(c[16], a[16], b[16]);
   case 16: mzd_add(c[15], a[15], b[15]);
   case 15: mzd_add(c[14], a[14], b[14]);
   case 14: mzd_add(c[13], a[13], b[13]);
diff --git a/tests/test_elimination.cc b/tests/test_elimination.cc
index 4b41b4f..02a46fd 100644
--- a/tests/test_elimination.cc
+++ b/tests/test_elimination.cc
@@ -75,7 +75,7 @@ int test_equality(gf2e *ff, rci_t m, rci_t n) {
 
 int test_batch(gf2e *ff, rci_t m, rci_t n) {
   int fail_ret = 0;
-  printf("elim: k: %2d, minpoly: 0x%03x m: %5d, n: %5d ",(int)ff->degree, (unsigned int)ff->minpoly, (int)m, (int)n);
+  printf("elim: k: %2d, minpoly: 0x%05x m: %5d, n: %5d ",(int)ff->degree, (unsigned int)ff->minpoly, (int)m, (int)n);
 
   if(m == n) {
     m4rie_check(   test_equality(ff, m, n) == 0); printf("."); fflush(0);
@@ -96,14 +96,14 @@ int test_batch(gf2e *ff, rci_t m, rci_t n) {
 int main(int argc, char **argv) {
   srandom(17);
 
-  gf2e *ff[11];
+  gf2e *ff[17];
   int fail_ret = 0;
 
-  for(int k=2; k<=10; k++) {
+  for(int k=2; k<=16; k++) {
     ff[k] = gf2e_init(irreducible_polynomials[k][1]);
   }
 
-  for(int k=2; k<=10; k++) {
+  for(int k=2; k<=16; k++) {
     fail_ret += test_batch(ff[k],   2,   5);
     fail_ret += test_batch(ff[k],   5,  10);
     fail_ret += test_batch(ff[k],   1,   1);
@@ -127,7 +127,7 @@ int main(int argc, char **argv) {
     fail_ret += test_batch(ff[k],  10, 200);
   };
 
-  for(int k=2; k<=10; k++) {
+  for(int k=2; k<=16; k++) {
     gf2e_free(ff[k]);
   }
 
diff --git a/tests/test_multiplication.cc b/tests/test_multiplication.cc
index 7ed2a8b..8fc3008 100644
--- a/tests/test_multiplication.cc
+++ b/tests/test_multiplication.cc
@@ -25,6 +25,7 @@
 ******************************************************************************/
 
 #include "testing.h"
+#include <unistd.h>
 
 int test_addmul(gf2e *ff, rci_t m, rci_t n, rci_t l) {
   int fail_ret = 0;
@@ -177,7 +178,7 @@ int test_scalar(gf2e *ff, rci_t m, rci_t n) {
 
 int test_batch(gf2e *ff, rci_t m, rci_t l, rci_t n) {
   int fail_ret = 0;
-  printf("mul: k: %2d, minpoly: 0x%03x m: %5d, l: %5d, n: %5d ",(int)ff->degree, (unsigned int)ff->minpoly, (int)m, (int)l, (int)n);
+  printf("mul: k: %2d, minpoly: 0x%05x m: %5d, l: %5d, n: %5d ",(int)ff->degree, (unsigned int)ff->minpoly, (int)m, (int)l, (int)n);
 
   m4rie_check(test_scalar(ff, m, m) == 0); printf("."); fflush(0);
   m4rie_check(test_scalar(ff, l, l) == 0); printf("."); fflush(0);
@@ -217,14 +218,30 @@ int test_batch(gf2e *ff, rci_t m, rci_t l, rci_t n) {
 int main(int argc, char **argv) {
   srandom(17);
 
-  gf2e *ff[11];
+  int runlong = 0;
+
+  int c;
+  while ((c = getopt(argc, argv, "l")) != -1) {
+    switch (c) {
+    case 'l':
+      runlong = 1;
+      break;
+    case '?':
+      printf(" -l   run long tests.\n");
+      abort();
+    default:
+      abort();
+    }
+  }
+
+  gf2e *ff[17];
   int fail_ret = 0;
 
-  for(int k=2; k<=10; k++) {
+  for(int k=2; k<=16; k++) {
     ff[k] = gf2e_init(irreducible_polynomials[k][1]);
   }
 
-  for(int k=2; k<=10; k++) {
+  for(int k=2; k<=16; k++) {
     fail_ret += test_batch(ff[k],   1,   1,   1);
     fail_ret += test_batch(ff[k],   1,   2,   3);
     fail_ret += test_batch(ff[k],  11,  12,  13);
@@ -232,11 +249,13 @@ int main(int argc, char **argv) {
     fail_ret += test_batch(ff[k],  13,   2,  90);
     fail_ret += test_batch(ff[k],  32,  33,  34);
     fail_ret += test_batch(ff[k],  63,  64,  65);
-    fail_ret += test_batch(ff[k], 127, 128, 129);
-    fail_ret += test_batch(ff[k], 200,  20, 112);
+    if(k<=12 || runlong) {
+      fail_ret += test_batch(ff[k], 127, 128, 129);
+      fail_ret += test_batch(ff[k], 200,  20, 112);
+    }
   };
 
-  for(int k=2; k<=10; k++) {
+  for(int k=2; k<=16; k++) {
     gf2e_free(ff[k]);
   }
 
diff --git a/tests/test_smallops.cc b/tests/test_smallops.cc
index 52f2c51..01bc0c6 100644
--- a/tests/test_smallops.cc
+++ b/tests/test_smallops.cc
@@ -189,10 +189,10 @@ int test_batch(gf2e *ff, int m, int n) {
 
 int main(int argc, char **argv) {
 
-  gf2e *ff[11];
+  gf2e *ff[17];
   int fail_ret = 0;
 
-  for(int k=2; k<=10; k++) {
+  for(int k=2; k<=16; k++) {
     ff[k] = gf2e_init(irreducible_polynomials[k][1]);
   }
 
@@ -214,7 +214,7 @@ int main(int argc, char **argv) {
     fail_ret += test_batch(ff[k], 217,   2);
   }
 
-  for(int k=2; k<=10; k++) {
+  for(int k=2; k<=16; k++) {
     gf2e_free(ff[k]);
   }
 

-- 
Fast arithmetic with dense matrices over F_{2^e}



More information about the debian-science-commits mailing list