diff --git a/apps/scheme.c b/apps/scheme.c
index 2346cc9365f64e5eb398206b61edfcc879118275..59ee1d56d5222cb1d5307da5fe6c4c9c5c1b9a27 100644
--- a/apps/scheme.c
+++ b/apps/scheme.c
@@ -20,8 +20,8 @@ struct ct {
 
 void initialize_relic() {
     core_init();
-    fp_prime_init();
     pc_param_set_any();
+
 }
 
 struct key setup(int size) {
@@ -69,25 +69,6 @@ struct ct enc(struct key key, int *message, int size) {
     zp_vec sxATsAAT10_Bi = matrix_multiply(sxATsAAT10, key.Bi, 1, B_SIZE, B_SIZE);
     ct.ctk = vector_raise(key.base, sxATsAAT10_Bi, B_SIZE);
 
-    // Testing.
-    int temp[] = {1, 1, 1, 1, 1, 1};
-    zp_vec temp_zp = vector_zp_from_int(temp, B_SIZE);
-    zp_vec vec_1 = matrix_multiply(temp_zp, key.B, 1, B_SIZE, B_SIZE);
-    zp_vec vec_2 = matrix_multiply(temp_zp, key.Bi, 1, B_SIZE, B_SIZE);
-
-    g_vec vec_11 = vector_raise(key.base, vec_1, B_SIZE);
-    g_vec vec_22 = vector_raise(key.base, vec_2, B_SIZE);
-
-    gt z;
-    pc_map_sim(z, vec_11, vec_22, B_SIZE);
-
-    // Check correctness.
-    gt desired_output;
-    gt_exp_dig(desired_output, key.t_base, 6);
-
-    if (gt_cmp(desired_output, z) == RLC_EQ) printf("Magic happened.");
-    else printf("Fuck my life.");
-
     return ct;
 }
 
@@ -112,12 +93,26 @@ void eval(struct key key, struct ct x, struct ct y, int size) {
 int main() {
     initialize_relic();
 
-    int x[] = {1, 1, 1, 1, 1, 1, 1, 1, 1, 1};
-
+//    int x[] = {1, 1, 1, 1, 1, 1, 1, 1, 1, 1};
     struct key key = setup(10);
+//    struct ct ct_x = enc(key, x, 10);
+//    eval(key, ct_x, ct_x, 10);
 
-    struct ct ct_x = enc(key, x, 10);
+    bn_t a, b, c, n;
+    pc_get_ord(n);
 
-//    eval(key, ct_x, ct_x, 10);
+    bn_rand_mod(a, n);
+    bn_rand_mod(b, n);
+    bn_mul(c, a, a);
+    bn_mod(c, c, n);
+
+    g g1, g2;
+    g1_mul(g1, key.base, a);
+    g1_mul(g2, key.base, b);
+
+    gt gt1, gt2;pc_map(gt1, g1, g2);
+    gt_exp(gt2, key.t_base, c);
+
+    printf("Works if 1: %i", gt_cmp(gt1, gt2) == RLC_EQ);
     return 0;
-}
\ No newline at end of file
+}
diff --git a/include/vector.h b/include/vector.h
index 24a72dd7f06c2bd0b4e3f8a9e0bc3f125a15b440..f55dd9ccc3dec6f496c3ccbeb75d43f43b65c8a0 100644
--- a/include/vector.h
+++ b/include/vector.h
@@ -15,6 +15,8 @@ zp_vec vector_merge(zp_vec a, zp_vec b, int size_a, int size_b);
 
 zp_vec vector_add(zp_vec a, zp_vec b, int size);
 
+void zp_inner_product(zp r, zp_vec a, zp_vec b, int size);
+
 g_vec vector_raise(g base, zp_vec x, int size);
 
 void inner_product(gt r, g_vec a, g_vec b, int size);
diff --git a/src/vector.c b/src/vector.c
index ed48b177caa92ea26b8ab132f81ece3b3c988125..8aa18bcf7f4ade68f1108f72ba1d01c3dd4b8ffc 100644
--- a/src/vector.c
+++ b/src/vector.c
@@ -29,6 +29,15 @@ zp_vec vector_add(zp_vec a, zp_vec b, int size) {
     return r;
 }
 
+void zp_inner_product(dig_t *r, zp_vec a, zp_vec b, int size) {
+    zp_zero(r);
+    zp temp;
+    for (int i = 0; i < size; i++) {
+        zp_multiply(temp, a[i], b[i]);
+        zp_add(r, r, temp);
+    }
+}
+
 g_vec vector_raise(g base, zp_vec x, int size) {
     g_vec r;
     r = (g_vec) malloc(sizeof(g) * size);
@@ -37,7 +46,12 @@ g_vec vector_raise(g base, zp_vec x, int size) {
 }
 
 void inner_product(gt r, g_vec a, g_vec b, int size) {
-    pc_map_sim(r, a, b, size);
+    gt temp;
+    gt_set_unity(r);
+    for (int i = 0; i < size; i++) {
+        pc_map(temp, a[i], b[i]);
+        gt_mul(r, r, temp);
+    }
 }
 
 
@@ -45,3 +59,6 @@ void inner_product(gt r, g_vec a, g_vec b, int size) {
 
 
 
+
+
+
diff --git a/tests/test_vector.c b/tests/test_vector.c
index f38abb4d09cac4c2f84c43e645d39eecd685df75..767660ec6cc7e8c5aa372acd912352f84feb333f 100644
--- a/tests/test_vector.c
+++ b/tests/test_vector.c
@@ -27,6 +27,18 @@ int test_add_vector() {
     return zp_is_int(z[2], 36);
 }
 
+int test_zp_inner_product() {
+    zp_vec x, y;
+    int int_vec_x[3] = {1, 2, 3};
+    int int_vec_y[3] = {11, 22, 33};
+    x = vector_zp_from_int(int_vec_x, 3);
+    y = vector_zp_from_int(int_vec_y, 3);
+
+    zp r;
+    zp_inner_product(r, x, y, 3);
+    return zp_is_int(r, 154);
+}
+
 int test_inner_product() {
     zp_vec x, y;
     int int_vec_x[3] = {1, 2, 3};
@@ -58,6 +70,7 @@ int main() {
     if (test_zp_from_int() != 1) return 1;
     if (test_merge_vector() != 1) return 1;
     if (test_add_vector() != 1) return 1;
+    if (test_zp_inner_product() != 1) return 1;
     if (test_inner_product() != RLC_EQ) return 1;
 
     return 0;