aboutsummaryrefslogtreecommitdiffstats
path: root/moon-abe/pbc-0.5.14/guru/ternary_extension_field_test.c
diff options
context:
space:
mode:
Diffstat (limited to 'moon-abe/pbc-0.5.14/guru/ternary_extension_field_test.c')
-rw-r--r--moon-abe/pbc-0.5.14/guru/ternary_extension_field_test.c240
1 files changed, 240 insertions, 0 deletions
diff --git a/moon-abe/pbc-0.5.14/guru/ternary_extension_field_test.c b/moon-abe/pbc-0.5.14/guru/ternary_extension_field_test.c
new file mode 100644
index 00000000..b431e4fa
--- /dev/null
+++ b/moon-abe/pbc-0.5.14/guru/ternary_extension_field_test.c
@@ -0,0 +1,240 @@
+/* test ternary extension fields $GF(3^m)$, $GF(3^{2*m})$, $GF(3^{3*m})$ and $GF(3^{6*m})$
+ Outputing nothing if everything is good. */
+
+#include "pbc.h"
+#include "pbc_ternary_extension_field.h"
+#include "pbc_test.h"
+#include <string.h>
+#include <stdio.h>
+
+typedef struct {
+ unsigned int len;
+ unsigned int m;
+ unsigned int t;
+ element_ptr p;
+} params;
+
+#define data(x) ((unsigned long*)x->data)
+#define params(x) ((params *)x->field->data)
+#define print(e) {printf(#e": "); element_out_str(stdout, 0, e); printf("\n");}
+
+static field_t f97, f97_2, f97_3, f97_6;
+static element_t e0, e1, e2, a, b, a2, b2, a3, b3, a6, b6;
+static unsigned char *data;
+
+static void test_gf3m_param(void) {
+ params *pa = (params *) f97->data;
+ element_to_bytes(data, pa->p);
+ unsigned i;
+ unsigned char w;
+ for (i = 0; i < pa->len * 2 * sizeof(unsigned long); i++) {
+ switch (i) {
+ case 1:
+ w = 1;
+ break; // 2
+ case 2:
+ w = 16;
+ break; // x^12
+ case 24:
+ w = 2;
+ break; // x^97
+ default:
+ w = 0;
+ }
+ EXPECT(data[i] == w);
+ }
+}
+
+static void test_gf3m_to_bytes(void) {
+ element_random(a);
+ element_to_bytes(data, a);
+ element_from_bytes(b, data);
+ EXPECT(0 == element_cmp(a, b));
+}
+
+static void test_gf3m_add(void) {
+ element_random(a);
+ element_add(b, a, a);
+ element_add(b, b, b);
+ element_sub(b, b, a);
+ element_sub(b, b, a);
+ element_sub(b, b, a);
+ EXPECT(!element_cmp(a, b));
+
+ element_add(b, params(a)->p, a);
+ element_sub(b, b, params(a)->p);
+ EXPECT(!element_cmp(a, b));
+}
+
+static void test_gf3m_neg(void) {
+ element_random(a);
+ element_neg(b, a);
+ element_add(b, a, b);
+ EXPECT(!element_cmp(b, e0));
+}
+
+static void test_gf3m_mult(void) {
+ element_random(a);
+ element_mul(a, a, e0);
+ EXPECT(!element_cmp(a, e0));
+
+ element_random(a);
+ element_mul(b, a, e1);
+ EXPECT(!element_cmp(a, b));
+
+ element_random(a);
+ element_mul(b, a, e2);
+ element_add(a, a, b);
+ EXPECT(!element_cmp(a, e0));
+}
+
+static void test_gf3m_cubic(void) {
+ element_random(a);
+ element_mul(b, a, a);
+ element_mul(b, a, b);
+ element_cubic(a, a);
+ EXPECT(!element_cmp(a, b));
+}
+
+static void test_gf3m_cubic2(void) {
+ unsigned long x[] = {1153286547535200267ul, 6715371622ul, 4990694927524257316ul, 210763913ul};
+ unsigned long y[] = {8145587063258678275ul, 6451025920ul, 9976895054123379152ul, 1275593166ul};
+ memcpy(a->data, x, sizeof(x));
+ memcpy(b->data, y, sizeof(y));
+ element_cubic(a, a);
+ EXPECT(!element_cmp(a, b));
+}
+
+static void test_gf3m_inverse(void) {
+ element_set1(a);
+ element_invert(b, a);
+ EXPECT(!element_cmp(b, e1));
+
+ element_set(a, e2);
+ element_invert(b, a);
+ EXPECT(!element_cmp(b, e2));
+
+ element_random(a);
+ element_invert(b, a);
+ element_mul(a, a, b);
+ EXPECT(!element_cmp(a, e1));
+}
+
+static void test_gf3m_sqrt(void) {
+ mpz_t t;
+ mpz_init(t);
+ mpz_sub_ui(t, a->field->order, 1); // t == field_order - 1
+ element_random(a);
+ element_pow_mpz(a, a, t);
+ EXPECT(!element_cmp(a, e1));
+
+ while(1){
+ element_random(a);
+ element_mul(b, a, a);
+ element_sqrt(b, b);
+ if(element_cmp(a, b)) {// a != b
+ element_neg(b, b);
+ if(!element_cmp(a, b)) break;
+ }
+ }
+ mpz_clear(t);
+}
+
+static void test_gf32m_cubic(void) {
+ element_random(a2);
+ element_mul(b2, a2, a2);
+ element_mul(b2, b2, a2);
+ element_cubic(a2, a2);
+ EXPECT(!element_cmp(a2, b2));
+}
+
+static void test_gf33m_cubic(void) {
+ element_random(a3);
+ element_mul(b3, a3, a3);
+ element_mul(b3, b3, a3);
+ element_cubic(a3, a3);
+ EXPECT(!element_cmp(a3, b3));
+}
+
+static void test_gf33m_inverse(void) {
+ element_random(a3);
+ element_invert(b3, a3);
+ element_mul(a3, a3, b3);
+ element_ptr a0 = element_item(a3, 0);
+ EXPECT(!element_cmp(a0, e1));
+}
+
+static void test_gf36m_cubic(void) {
+ element_random(a6);
+ element_mul(b6, a6, a6);
+ element_mul(b6, b6, a6);
+ element_cubic(a6, a6);
+ EXPECT(!element_cmp(a6, b6));
+}
+
+void setup(void) {
+ field_init_gf3m(f97, 97, 12);
+ element_init(a, f97);
+ element_init(b, f97);
+ element_init(e0, f97);
+ element_init(e1, f97);
+ element_init(e2, f97);
+ element_set1(e1);
+ element_neg(e2, e1);
+
+ field_init_gf32m(f97_2, f97);
+ element_init(a2, f97_2);
+ element_init(b2, f97_2);
+
+ field_init_gf33m(f97_3, f97);
+ element_init(a3, f97_3);
+ element_init(b3, f97_3);
+
+ field_init_gf33m(f97_6, f97_2);
+ element_init(a6, f97_6);
+ element_init(b6, f97_6);
+
+ data = pbc_malloc(f97->fixed_length_in_bytes);
+}
+
+void tear_down(void) {
+ pbc_free(data);
+
+ element_clear(e0);
+ element_clear(e1);
+ element_clear(e2);
+ element_clear(a);
+ element_clear(b);
+ element_clear(a2);
+ element_clear(b2);
+ element_clear(a3);
+ element_clear(b3);
+ element_clear(a6);
+ element_clear(b6);
+
+ field_clear(f97_6);
+ field_clear(f97_3);
+ field_clear(f97_2);
+ field_clear(f97);
+}
+
+int main(void) {
+ setup();
+
+ test_gf3m_param();
+ test_gf3m_to_bytes();
+ test_gf3m_add();
+ test_gf3m_neg();
+ test_gf3m_mult();
+ test_gf3m_cubic();
+ test_gf3m_cubic2();
+ test_gf3m_inverse();
+ test_gf3m_sqrt();
+ test_gf32m_cubic();
+ test_gf33m_cubic();
+ test_gf33m_inverse();
+ test_gf36m_cubic();
+
+ tear_down();
+ return 0;
+}