Is there a cheap method to do zero-one masking?
lifematrix opened this issue · 3 comments
Hello, everyone,
I am new to Homomorphic Encryption and try to use HElib to implement a complex neural convolutional network. Retrieving an
entry on the certain position of the cipher text vectoris a very common and useful operation. It can be implemented by multiplying a zero-one vector, but very expensive.
I read Shai Halevi's paper Algorithms in HElib which discussed zero-fill shift. The paper gave me the feeling that the shift operation can be achived with a lower cost.
I found HElib really provided zero-fill shift
operation, so a masking can be achieved by two shifts and one rotation, i.e., suppose position is i
(zero-based), shift left i
, shift right n-1
, and rotate right n-1-i
. However, the experimental code I wrote showed the shift operation is more expensive both in noise budget (like multipication) and speed (like rotation).
So, is there a cheap method to do zero-one masking in HElib? Or do I have any misunderstanding?
Thank you very much,
Steven
zero-filling is noting but just multiplying zero-one vectors then rotation.
@fionser Thank you very much for your reply.
I could understand the approach you described. But multiplication will cost the noise budget. So I want to find a cheaper one.
I just read the source code of HELib. It really did mask vector multiplying with type zzX
type in rotate
function of EncryptedArray.cpp
. I guess maybe it is cheaper rather than multiplying a plaintext mask vector that is encoded from a mask vector of float?
i found that multiply ctxt in a zeroed ptxt where ptxt[i]=1 is the best way to create masking for all slots!=i
cause except in a very low security levels contexts or m init var is power of 2, you have a large number of slots, and the amounts of shifts needed generates much more noise than one multiplication, but thats base on trail and error so i dont have mathematics to backup this routine