Browse Source

Correction of formula to restore q-modular hints

master
Thibauld Feneuil 4 years ago
parent
commit
e0394e60f6
3 changed files with 29 additions and 21 deletions
  1. 17
    17
      Sec5.2_validation/prediction_verifications.sage
  2. 10
    4
      framework/DBDD.sage
  3. 2
    0
      framework/DBDD_generic.sage

+ 17
- 17
Sec5.2_validation/prediction_verifications.sage View File

if T_hints == "Q-Modular": if T_hints == "Q-Modular":
dbdd.integrate_q_modular_hint(vv, dbdd.leak(vv) % q, dbdd.integrate_q_modular_hint(vv, dbdd.leak(vv) % q,
q, estimate=False) q, estimate=False)
dbdd_p.integrate_q_modular_hint(vv, dbdd_p.leak(vv) % modulus,
dbdd_p.integrate_q_modular_hint(vv, dbdd_p.leak(vv) % q,
q, estimate=False) q, estimate=False)


dbdd_p.integrate_q_vectors(q, indices=range(20)) dbdd_p.integrate_q_vectors(q, indices=range(20))


dic = {" ": None} dic = {" ": None}


def get_stats(data, N_tests):
avg = RR(sum(data)) / N_tests
var = abs(RR(sum([r**2 for r in data])) / N_tests - avg**2)
return (avg, var)


def validation_prediction(N_tests, N_hints, T_hints): def validation_prediction(N_tests, N_hints, T_hints):
# Estimation # Estimation
import datetime import datetime
ttt = datetime.datetime.now() ttt = datetime.datetime.now()
res = map_drop(N_tests, threads, one_experiment, (N_hints, T_hints)) res = map_drop(N_tests, threads, one_experiment, (N_hints, T_hints))
beta_real = RR(sum([r[0] for r in res])) / N_tests
beta_pred_full = RR(sum([r[1] for r in res])) / N_tests
beta_pred_light = RR(sum([r[2] for r in res])) / N_tests
beta_real, vbeta_real = get_stats([r[0] for r in res], N_tests)
beta_pred_full, vbeta_pred_full = get_stats([r[1] for r in res], N_tests)
beta_pred_light, vbeta_pred_light = get_stats([r[2] for r in res], N_tests)


print("%d,\t %.3f,\t %.3f,\t %.3f \t\t" % print("%d,\t %.3f,\t %.3f,\t %.3f \t\t" %
(N_hints, beta_real, beta_pred_full, beta_pred_light), end=" \t") (N_hints, beta_real, beta_pred_full, beta_pred_light), end=" \t")
print("Time:", datetime.datetime.now() - ttt) print("Time:", datetime.datetime.now() - ttt)
if saving_results: if saving_results:
vbeta_real = RR(sum([r[0]**2 for r in res])) / N_tests - beta_real
beta_pred_full = RR(sum([r[0]**2 for r in res])) / N_tests - beta_pred_full
beta_pred_light = RR(sum([r[0]**2 for r in res])) / N_tests - beta_pred_light
with open('results.csv') as _file:
with open('results.csv', 'a') as _file:
_file.write(f'{T_hints};{N_hints};{N_tests};{datetime.datetime.now() - ttt};') _file.write(f'{T_hints};{N_hints};{N_tests};{datetime.datetime.now() - ttt};')
_file.write(f'{beta_real};{beta_pred_full};{beta_pred_light};') _file.write(f'{beta_real};{beta_pred_full};{beta_pred_light};')
_file.write(f'{vbeta_real};{vbeta_pred_full};{vbeta_pred_light};') _file.write(f'{vbeta_real};{vbeta_pred_full};{vbeta_pred_light};')
beta_pred = validation_prediction(N_tests, h, "Modular") # Line 0 beta_pred = validation_prediction(N_tests, h, "Modular") # Line 0
if beta_pred < 3: if beta_pred < 3:
break break

print("\n \n Approx")

print("hints,\t real,\t pred_full, \t pred_light,")
for h in range(4, 200, 4):
beta_pred = validation_prediction(N_tests, h, "Approx") # Line 0
if beta_pred < 3:
break
print("\n \n Q-Modular") print("\n \n Q-Modular")


beta_pred = validation_prediction(N_tests, h, "Q-Modular") # Line 0 beta_pred = validation_prediction(N_tests, h, "Q-Modular") # Line 0
if beta_pred < 3: if beta_pred < 3:
break break

print("\n \n Approx")

print("hints,\t real,\t pred_full, \t pred_light,")
for h in range(4, 200, 4):
beta_pred = validation_prediction(N_tests, h, "Approx") # Line 0
if beta_pred < 3:
break

+ 10
- 4
framework/DBDD.sage View File

def integrate_short_vector_hint(self, v): def integrate_short_vector_hint(self, v):
V = concatenate(v, 0) V = concatenate(v, 0)


if V.dimensions()[1] > self._dim:
if V.dimensions()[1] > self.Pi.nrows(): # Cannot use self._dim here
V = V * self.Pi.T # Reduction V = V * self.Pi.T # Reduction
assert V.dimensions()[1] == self._dim
assert V.dimensions()[1] == self.Pi.nrows()
V -= V * self.PP V -= V * self.PP


if scal((V * self.S) * V.T) == 0: if scal((V * self.S) * V.T) == 0:
if instruc_type == SUBSTITUTION: if instruc_type == SUBSTITUTION:
pass pass
elif instruc_type == QMODULUS_SUBSTITUTION: elif instruc_type == QMODULUS_SUBSTITUTION:
solution += data['w'] * round(solution[0].inner_product(data['v'][0])/data['q'])
w, v, q = data['w'], data['v'], data['q']
w_norm2 = w[0].inner_product(w[0])
projection_of_s = solution - w * (solution[0].inner_product(w[0]) / w_norm2)
solution += w * round(projection_of_s[0].inner_product(v[0])/q)
else: else:
solution += data['w'] * data['func'](solution)
w, func = data['w'], data['func']
w_norm2 = w[0].inner_product(w[0])
projection_of_s = solution - w * (solution[0].inner_product(w[0]) / w_norm2)
solution += w * func(projection_of_s)
if not self.check_solution(solution): if not self.check_solution(solution):
continue continue

+ 2
- 0
framework/DBDD_generic.sage View File

self.logging("[...%d]" % report_every, newline=False) self.logging("[...%d]" % report_every, newline=False)
Sd = self.S_diag() Sd = self.S_diag()
L = [(Sd[i], i) for i in indices if i not in I] L = [(Sd[i], i) for i in indices if i not in I]
if len(L) == 0:
break
_, i = max(L) _, i = max(L)
I += [i] I += [i]
try: try:

Loading…
Cancel
Save