Folosesc HElib CKKS pentru a face experimente și mă întreb dacă este posibil să controlez limitarea erorii în fiecare operație de bază, cum ar fi înmulțirea, codificarea și rotația.
Am această întrebare pentru că am constatat că se pare că creșterea legată de eroare în HElib este mai rapidă decât implementarea HEAAN.
Iată un exemplu de verificare a limitei erorii după fiecare operație de pătrat din HElib:
// c *= c;
c.capacitate=328.497 c.errorBound=1.28242e-06
c.capacitate=289,748 c.errorBound=2,69423e-06
c.capacitate=252,063 c.errorBound=5,71405e-06
c.capacitate=213.502 c.errorBound=1.1591e-05
c.capacitate=176,579 c.errorBound=2,37053e-05
c.capacitate=139,634 c.errorBound=4,79147e-05
distanta=1,84256e-05
Putem vedea că eroarea Bound crește cu aproximativ un factor de 2 (adică pierdem un pic de precizie).
Pentru o aplicație de înmulțire a matricei (inclusiv rotație, codificare și înmulțire, aici, nu a elaborat detalii), implementarea în HEAAN funcționează bine, dar limita de eroare depășește 200
iar adâncimea nu este suficientă când rescriu aplicația folosind HElib.
În general, aceeași aplicație (adică are același număr de înmulțiri și sloturi) în HElib necesită mai mulți biți decât cea din HEAAN și, în final, are ca rezultat un nivel de securitate mai mic de 80 de biți
Întrebare
În CKKS al HElib, dacă trebuie să controlăm cu exactitate (și cum) limitarea erorii atunci când facem înmulțirea (sau rotația)?
Parametrii
Iată un exemplu de parametri pe care i-am folosit:
param(/*m=*/16 * 1024, /*bits=*/235, /*precision=*/20, /*c=*/2);
Eroarea legată după o operație de pătrat (înmulțire):
ct_Ck[0].capacitate=256.968 ct_Ck[0].isCorrect=1 ct_Ck[0].errorBound=8.6898e-08
ct_Ck[0].capacitate=207,74 ct_Ck[0].isCorrect=1 ct_Ck[0].errorBound=8,6348e-06
Datele de text simplu sunt ca:
-0.23801321 0.30014116 -0.0636206 0.21583742
ACTUALIZAȚI
Am găsit o funcție în HElib pentru a reduce limita de eroare, dar nu știu motivele despre cum funcționează
// rezultat înainte de a invoca bumpNoiseBound ()
ct_F.capacity=38.4047 ct_F.isCorrect=1 ct_F.errorBound=201.848
ct_F.bumpNoiseBound(0,5);
ct_F.capacity=38,4047 ct_F.isCorrect=1 ct_F.errorBound=100,884
ct_F.bumpNoiseBound(0,00001);
ct_F.capacity=38,4047 ct_F.isCorrect=1 ct_F.errorBound=0,00202069
Rezultat decriptat:
[1.04830407 -3.209778495 -2.074653964 -1.684939538 -1.000400425 -4.124713608 -0.3628963567 -3.134082967 -3.801171699 -1.00385792 -1.472975371 -1.121783172 -5.484577652 -1.89848471 -1.517289034 -0.228743587 -1.226775781 3.901777677 1.575880583 -2.008799017 -1.980024549 3.465674733 -1.105679235 -3.594262482 0.1332798533 -7.012550198 0.5623979679 -4.254105028 -0.9447986134 -0.3755929384 -0.906013134 0.5607877395 -2.309902189 -4.112943726 -4.208302789 -2.742109602 -3.230622867 0.6365211006 -1.909193898 -1.761926501 0.07531637181 0.5945984313 -2.727958762 -2.45710736 -2.225926303 0.2915942006 -0.5207882104 -1.719778064 -3.581110672 0.9300763124 1.395581211 0.7434900004 -3.202471826 1.109593845 -5.68517439 0.2502367768 0.6176019573 -1.632018488 -0.3558288489 -1.87408586 3.322116753 -3.055094277 -1.437400739 -3.61812068]
Rezultat text simplu:
[1.048074533 -3.209868922 -2.075044009 -1.683690789 -0.9997621728 -4.124967495 -0.3629476429 -3.1339527 -3.801350955 -1.003947321 -1.473256614 -1.121510668 -5.484447105 -1.89821005 -1.517648893 -0.2295971341 -1.227429856 3.90224666 1.576020144 -2.008567349 -1.98010648 3.464794098 -1.105909147 -3.595045121 0.1335162434 -7.012703056 0.5623665673 -4.2541547 -0.9454690736 -0.3750930498 -0.9075913974 0.5602374826 -2.30977449 -4.11252574 -4.208385862 -2.742450262 -3.230891732 0.6371578519 -1.909217106 -1.76218525 0.07590385029 0.5945647743 -2.727895366 -2.457126412 -2.225143547 0.2917448084 -0.5201044894 -1.719980727 -3.580159571 0.9294232572 1.396138592 0.7433848735 -3.202827843 1.108926304 -5.68442001 0.2495510754 0.6176213132 -1.630955343 -0.35625627 -1.874107776 3.321633929 -3.054599105 -1.438421851 -3.618478743]
Rezultatul după utilizare bumpNoiseBound ()
este aproape egal cu rezultatul textului simplu. Deci această funcție ne ajută să recuperăm precizia corectă?