diff --git a/bin/ckks.o b/bin/ckks.o
index a9db71f2c10d6a4cb920d45aa5c634611f8d0cf5..581a997abe79b44212a9fde32de6aa3f4085a637 100644
Binary files a/bin/ckks.o and b/bin/ckks.o differ
diff --git a/bin/encoder.o b/bin/encoder.o
index ef7f57bf2f19eb83b8f800e61d192892fa7a4f53..204d296b9567fbaaa8580d64efee32a46fcccf15 100644
Binary files a/bin/encoder.o and b/bin/encoder.o differ
diff --git a/bin/evalkey.o b/bin/evalkey.o
index 11ee60d8cd8461b178700bb1bec57d0f8b23cf57..d611734c4173a13cec8287d32567469ca02170d4 100644
Binary files a/bin/evalkey.o and b/bin/evalkey.o differ
diff --git a/bin/pubkey.o b/bin/pubkey.o
index deacc305c00ea25f96ee5f79ffbfd14374b63887..5ef768e30378c447d4432460dc79f144d93ac71a 100644
Binary files a/bin/pubkey.o and b/bin/pubkey.o differ
diff --git a/run b/run
index 33d2612199897b9cc421709da90bbe9a19ce84c9..f543ad7ed63fc9674d3a174649740b63efdbf26e 100755
Binary files a/run and b/run differ
diff --git a/src/ckks.cpp b/src/ckks.cpp
index e57c21c276115b4622361bb31ed8917dd497d0d6..30e7d9d826eae96b9eb38a34047ae6e434d2e191 100644
--- a/src/ckks.cpp
+++ b/src/ckks.cpp
@@ -29,7 +29,7 @@ Polynomial CKKS::genE(int degree, double var){
     errCoeffs[i] = (double) round(dis(gen));
   }
 
-  Polynomial err(4, errCoeffs);
+  Polynomial err(degree, errCoeffs);
   return err;
 }
 
@@ -49,7 +49,7 @@ Polynomial CKKS::genZO(){
 }
 
 Ciphertext CKKS::encrypt(Polynomial pt){
-  Polynomial e = genE(4, 1.0);
+  Polynomial e = genE(pt.degree, 1.0);
   Polynomial c0 = (pt) + pk.b;
   Polynomial c1 = pk.a;
 
diff --git a/src/evalkey.cpp b/src/evalkey.cpp
index a71b07bf9f5d6d5819abe126810ccb1fe5f5b2bf..a8288cf2a4d8846e3127c51df88984f65d99ce0c 100644
--- a/src/evalkey.cpp
+++ b/src/evalkey.cpp
@@ -6,16 +6,31 @@
 
 using namespace std;
 
-EvalKey::EvalKey(Polynomial _s, int q){
-    a = Polynomial(4);
-    b = Polynomial(4);
+EvalKey::EvalKey(Polynomial _s, int degree, int q){
+    a = Polynomial(degree);
+    b = Polynomial(degree);
     p = 1000;
     s = _s;
-    cout << q << endl;
-    generateA(4, 4);
+
+    generateA(4, 1000);
     computeB(q);
 }
 
+Polynomial EvalKey::genE(int degree, double var){
+  double errCoeffs[degree];
+  
+  random_device rd;
+  mt19937 gen(rd());
+  normal_distribution<double> dis(0, var);
+  
+  for(int i=0; i<degree; i++){
+    errCoeffs[i] = (double) round(dis(gen));
+  }
+
+  Polynomial err(degree, errCoeffs);
+  return err;
+}
+
 void EvalKey::generateA(int degree, int q){
     int half_q = (p*q)/2;
     random_device rd;
@@ -30,11 +45,9 @@ void EvalKey::generateA(int degree, int q){
 }
 
 void EvalKey::computeB(int q){
-    cout << "eval" << endl;
-    double e[4] = {0.0, 0.0, 0.0, 0.0};
-    Polynomial err(4, e);
+    Polynomial err = genE(a.degree, 1.0);
     Polynomial ev = (s * s).scaleCoeff(p);
-    Polynomial temp = ((a.scaleCoeff(-1.0)) * s) + ev;
+    Polynomial temp = ((a.scaleCoeff(-1.0)) * s) + ev + err;
     Polynomial res = temp.modCoeff(q * p);
 
     b.setDegree(res.degree);
diff --git a/src/evalkey.h b/src/evalkey.h
index a1fbcf303bb1699a73be563383373b0683a99c3d..eeb4f8bc2e3892fb80e88f8561944a08af9236c0 100644
--- a/src/evalkey.h
+++ b/src/evalkey.h
@@ -11,7 +11,8 @@ class EvalKey{
     int p;
 
     EvalKey() = default;
-    EvalKey(Polynomial _s, int q);
+    EvalKey(Polynomial _s, int degree, int q);
+    Polynomial genE(int degree, double var);
     void generateA(int degree, int q);
     void computeB(int q);
 };
diff --git a/src/pubkey.cpp b/src/pubkey.cpp
index 7835cf26ca0065cfa0475503c899a0da12921b50..e52c1314fc0d2b675d64db2f02a5f28efc41ad36 100644
--- a/src/pubkey.cpp
+++ b/src/pubkey.cpp
@@ -6,15 +6,30 @@
 
 using namespace std;
 
-PubKey::PubKey(Polynomial _s, int q){
-    a = Polynomial(4);
-    b = Polynomial(4);
+PubKey::PubKey(Polynomial _s, int degree, int q){
+    a = Polynomial(degree);
+    b = Polynomial(degree);
     s = _s;
 
-    generateA(4, 4);
+    generateA(4, 100);
     computeB(q);
 }
 
+Polynomial PubKey::genE(int degree, double var){
+  double errCoeffs[degree];
+  
+  random_device rd;
+  mt19937 gen(rd());
+  normal_distribution<double> dis(0, var);
+  
+  for(int i=0; i<degree; i++){
+    errCoeffs[i] = (double) round(dis(gen));
+  }
+
+  Polynomial err(degree, errCoeffs);
+  return err;
+}
+
 void PubKey::generateA(int degree, int q){
     int half_q = q/2;
     random_device rd;
@@ -29,8 +44,7 @@ void PubKey::generateA(int degree, int q){
 }
 
 void PubKey::computeB(int q){
-    double e[4] = {0.0, 0.0, 0.0, 0.0};
-    Polynomial err(4, e);
+    Polynomial err = genE(a.degree, 1.0);
     Polynomial temp = (a.scaleCoeff(-1.0)) * s + err;
     Polynomial res = temp.modCoeff(q);
 
diff --git a/src/pubkey.h b/src/pubkey.h
index 4ab3dfaf52a203182bc19cd3af3e0c248a70f97c..1c12e4c76cf4a8a836520d6e2dcf96d81f0abf86 100644
--- a/src/pubkey.h
+++ b/src/pubkey.h
@@ -10,7 +10,8 @@ class PubKey{
     Polynomial s;
 
     PubKey() = default;
-    PubKey(Polynomial _s, int q);
+    PubKey(Polynomial _s, int degree, int q);
+    Polynomial genE(int degree, double var);
     void generateA(int degree, int q);
     void computeB(int q);
 };
diff --git a/test.cpp b/test.cpp
index bea18461eba5c3cb754010535a3b7029afb4ff7e..2df90f3d1918ebc88b2aa27a6d1a443121116b93 100644
--- a/test.cpp
+++ b/test.cpp
@@ -23,8 +23,8 @@ int main(){
     }
 
     SecKey sk = SecKey();
-    PubKey pk(sk.s, ql);
-    EvalKey evk(sk.s, ql);
+    PubKey pk(sk.s, 4, ql);
+    EvalKey evk(sk.s, 4, ql);
     
     Polynomial pt2 = pt * pt;
     pt2.printPol();
@@ -33,20 +33,18 @@ int main(){
     Ciphertext ct = ckks.encrypt(pt);
     Ciphertext ctadd = ckks.mult(ct, ct);
     
-
     Polynomial ptOut = ckks.decrypt(ctadd);
     
     //problem
     dcomparr output = enc.decode(ptOut);
     cout << "test" << endl;
-    
     cout << endl;
 
     cout << "Experiment" << endl;
     cout << "polynomial: ";
     ptOut.printPol();
     for(int i=0; i<4; i++){
-         cout << output.arr[i] << " ";
+         cout << output.arr[i]/1.0 << " ";
     }
     cout << endl;
 
diff --git a/test.o b/test.o
index 5b27ef5b001a4ae14d9d78a528189aa90779265f..0e498838f94daa08e019afa313471f617252a30f 100644
Binary files a/test.o and b/test.o differ