Tôi đang sử dụng HElib CKKS để thực hiện các thử nghiệm và tự hỏi liệu có thể kiểm soát lỗi bị ràng buộc trong từng thao tác cơ bản như phép nhân, mã hóa và xoay hay không.
Tôi có câu hỏi này là vì tôi nhận thấy rằng có vẻ như sự gia tăng lỗi liên kết trong HElib nhanh hơn so với việc triển khai HEAAN.
Dưới đây là ví dụ về kiểm tra lỗi bị ràng buộc sau mỗi thao tác vuông từ HElib:
// c *= c;
c.dung lượng=328.497 c.errorBound=1.28242e-06
c.dung lượng=289.748 c.errorBound=2.69423e-06
c.dung lượng=252.063 c.errorBound=5.71405e-06
c.dung lượng=213.502 c.errorBound=1.1591e-05
c.dung lượng=176.579 c.errorBound=2.37053e-05
c.dung lượng=139.634 c.errorBound=4.79147e-05
khoảng cách=1.84256e-05
Chúng ta có thể thấy rằng Error Bound tăng khoảng 2 lần (nghĩa là chúng ta mất đi một chút độ chính xác).
Đối với một ứng dụng của phép nhân ma trận (bao gồm phép quay, mã hóa và phép nhân, ở đây, không giải thích chi tiết), việc triển khai trong HEAAN hoạt động tốt, nhưng giới hạn lỗi vượt quá 200
và độ sâu không đủ khi tôi viết lại ứng dụng bằng HElib.
Nhìn chung, cùng một ứng dụng (tức là có cùng số lượng phép nhân và vị trí) trong HElib yêu cầu nhiều bit hơn trong HEAAN và cuối cùng dẫn đến mức bảo mật nhỏ hơn 80 bit
Câu hỏi
Trong CKKS của HElib, nếu chúng ta cần kiểm soát chính xác (và làm thế nào) ràng buộc lỗi khi thực hiện phép nhân (hoặc phép quay)?
Thông số
Đây là một ví dụ thông số tôi đã sử dụng:
tham số(/*m=*/16 * 1024, /*bits=*/235, /*precision=*/20, /*c=*/2);
Lỗi bị ràng buộc sau thao tác một ô vuông (nhân):
ct_Ck[0].dung lượng=256.968 ct_Ck[0].isCorrect=1 ct_Ck[0].errorBound=8.6898e-08
ct_Ck[0].dung lượng=207,74 ct_Ck[0].isCorrect=1 ct_Ck[0].errorBound=8.6348e-06
Dữ liệu văn bản gốc giống như:
-0.23801321 0.30014116 -0.0636206 0.21583742
CẬP NHẬT
Tôi đã tìm thấy một chức năng trong HElib để giảm giới hạn lỗi nhưng tôi không biết lý do về cách thức hoạt động của nó
// kết quả trước khi gọi 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
Kết quả giải mã:
[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]
Kết quả bản rõ:
[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]
Kết quả sau khi sử dụng bumpNoiseBound ()
gần bằng với kết quả bản rõ. Vì vậy, chức năng này giúp chúng tôi lấy lại độ chính xác chính xác?