ฉันใช้ HElib CKKS เพื่อทำการทดลองและสงสัยว่าเป็นไปได้ไหมที่จะควบคุมขอบเขตข้อผิดพลาดในการดำเนินการพื้นฐานแต่ละอย่าง เช่น การคูณ การเข้ารหัส และการหมุน
ฉันมีคำถามนี้เพราะฉันพบว่าดูเหมือนว่าการเพิ่มขึ้นของข้อผิดพลาดใน HElib นั้นเร็วกว่าการใช้งาน HEAAN
ต่อไปนี้คือตัวอย่างการตรวจสอบข้อผิดพลาดที่ผูกไว้หลังจากการดำเนินการสแควร์แต่ละรายการจาก HElib:
// ค *= ค;
c.ความจุ=328.497 c.errorBound=1.28242e-06
c.ความจุ=289.748 c.errorBound=2.69423e-06
c.ความจุ=252.063 c.errorBound=5.71405e-06
c.ความจุ=213.502 c.errorBound=1.1591e-05
c.ความจุ=176.579 c.errorBound=2.37053e-05
c.ความจุ=139.634 c.errorBound=4.79147e-05
ระยะทาง=1.84256e-05
เราจะเห็นว่าข้อผิดพลาด Bound เพิ่มขึ้นประมาณ 2 เท่า (เช่น เราสูญเสียความแม่นยำไปหนึ่งบิต)
สำหรับการประยุกต์ใช้การคูณเมทริกซ์ (รวมถึงการหมุน การเข้ารหัส และการคูณ ในที่นี้ ไม่ได้ให้รายละเอียดโดยละเอียด) การใช้งานใน HEAAN ทำงานได้ดี แต่ขอบเขตข้อผิดพลาดเกิน 200
และความลึกไม่เพียงพอเมื่อฉันเขียนแอปพลิเคชันใหม่โดยใช้ HElib
โดยรวมแล้ว แอปพลิเคชันเดียวกัน (เช่น มีจำนวนการคูณและสล็อตเท่ากัน) ใน HElib ต้องการบิตมากกว่าใน HEAAN และสุดท้ายส่งผลให้ระดับความปลอดภัยน้อยกว่า 80 บิต
คำถาม
ใน CKKS ของ HElib หากเราจำเป็นต้องควบคุม (และอย่างไร) ข้อผิดพลาดที่ผูกไว้เมื่อทำการคูณ (หรือหมุน) อย่างแม่นยำ
พารามิเตอร์
นี่คือตัวอย่างพารามิเตอร์ที่ฉันใช้:
พารามิเตอร์(/*m=*/16 * 1024, /*bits=*/235, /*ความแม่นยำ=*/20, /*c=*/2);
ข้อผิดพลาดที่ผูกไว้หลังจากการดำเนินการหนึ่งตาราง (การคูณ):
ct_Ck[0].capacity=256.968 ct_Ck[0].isCorrect=1 ct_Ck[0].errorBound=8.6898e-08
ct_Ck[0].capacity=207.74 ct_Ck[0].isCorrect=1 ct_Ck[0].errorBound=8.6348e-06
ข้อมูลเพลนเท็กซ์มีลักษณะดังนี้:
-0.23801321 0.30014116 -0.0636206 0.21583742
อัปเดต
ฉันพบฟังก์ชันใน HElib เพื่อลดขอบเขตข้อผิดพลาด แต่ฉันไม่ทราบเหตุผลว่ามันทำงานอย่างไร
// ผลลัพธ์ก่อนที่จะเรียกใช้ bumpNoiseBound ()
ct_F.ความจุ=38.4047 ct_F.isCorrect=1 ct_F.errorBound=201.848
ct_F.bumpNoiseBound(0.5);
ct_F.ความจุ=38.4047 ct_F.isCorrect=1 ct_F.errorBound=100.884
ct_F.bumpNoiseBound(0.00001);
ct_F.ความจุ=38.4047 ct_F.isCorrect=1 ct_F.errorBound=0.00202069
ผลการถอดรหัส:
[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]
ผลลัพธ์ข้อความธรรมดา:
[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]
ผลลัพธ์หลังการใช้ ชนเสียงผูกพัน ()
เกือบเท่ากับผลลัพธ์ของข้อความธรรมดา ดังนั้นฟังก์ชั่นนี้จึงช่วยให้เราได้ค่าความแม่นยำกลับคืนมา?