Template Class HEOperator< Scheme::BFV >

Inheritance Relationships

Derived Types

Class Documentation

template<>
class HEOperator<Scheme::BFV>

HEOperator is responsible for performing homomorphic operations on encrypted data, such as addition, subtraction, multiplication, and other functions.

The HEOperator class is initialized with encryption parameters and provides various functions for performing operations on ciphertexts, including BFV scheme. It supports both in-place and out-of-place operations, as well as asynchronous processing using CUDA streams.

Subclassed by heongpu::HEArithmeticOperator< Scheme::BFV >, heongpu::HELogicOperator< Scheme::BFV >

Public Functions

void add(Ciphertext<Scheme::BFV> &input1, Ciphertext<Scheme::BFV> &input2, Ciphertext<Scheme::BFV> &output, const ExecutionOptions &options = ExecutionOptions())

Adds two ciphertexts and stores the result in the output.

Parameters:
  • input1 – First input ciphertext to be added.

  • input2 – Second input ciphertext to be added.

  • outputCiphertext where the result of the addition is stored.

inline void add_inplace(Ciphertext<Scheme::BFV> &input1, Ciphertext<Scheme::BFV> &input2, const ExecutionOptions &options = ExecutionOptions())

Adds the second ciphertext to the first ciphertext, modifying the first ciphertext with the result.

Parameters:
  • input1 – The ciphertext to which the value of input2 will be added.

  • input2 – The ciphertext to be added to input1.

void sub(Ciphertext<Scheme::BFV> &input1, Ciphertext<Scheme::BFV> &input2, Ciphertext<Scheme::BFV> &output, const ExecutionOptions &options = ExecutionOptions())

Subtracts the second ciphertext from the first and stores the result in the output.

Parameters:
  • input1 – First input ciphertext (minuend).

  • input2 – Second input ciphertext (subtrahend).

  • outputCiphertext where the result of the subtraction is stored.

inline void sub_inplace(Ciphertext<Scheme::BFV> &input1, Ciphertext<Scheme::BFV> &input2, const ExecutionOptions &options = ExecutionOptions())

Subtracts the second ciphertext from the first, modifying the first ciphertext with the result.

Parameters:
  • input1 – The ciphertext from which input2 will be subtracted.

  • input2 – The ciphertext to subtract from input1.

void negate(Ciphertext<Scheme::BFV> &input1, Ciphertext<Scheme::BFV> &output, const ExecutionOptions &options = ExecutionOptions())

Negates a ciphertext and stores the result in the output.

Parameters:
  • input1 – Input ciphertext to be negated.

  • outputCiphertext where the result of the negation is stored.

inline void negate_inplace(Ciphertext<Scheme::BFV> &input1, const ExecutionOptions &options = ExecutionOptions())

Negates a ciphertext in-place, modifying the input ciphertext.

Parameters:

input1Ciphertext to be negated.

inline void add_plain(Ciphertext<Scheme::BFV> &input1, Plaintext<Scheme::BFV> &input2, Ciphertext<Scheme::BFV> &output, const ExecutionOptions &options = ExecutionOptions())

Adds a ciphertext and a plaintext and stores the result in the output.

Parameters:
  • input1 – Input ciphertext to be added.

  • input2 – Input plaintext to be added.

  • outputCiphertext where the result of the addition is stored.

inline void add_plain_inplace(Ciphertext<Scheme::BFV> &input1, Plaintext<Scheme::BFV> &input2, const ExecutionOptions &options = ExecutionOptions())

Adds a plaintext to a ciphertext in-place, modifying the input ciphertext.

Parameters:
  • input1Ciphertext to which the plaintext will be added.

  • input2Plaintext to be added to the ciphertext.

inline void sub_plain(Ciphertext<Scheme::BFV> &input1, Plaintext<Scheme::BFV> &input2, Ciphertext<Scheme::BFV> &output, const ExecutionOptions &options = ExecutionOptions())

Subtracts a plaintext from a ciphertext and stores the result in the output.

Parameters:
  • input1 – Input ciphertext (minuend).

  • input2 – Input plaintext (subtrahend).

  • outputCiphertext where the result of the subtraction is stored.

inline void sub_plain_inplace(Ciphertext<Scheme::BFV> &input1, Plaintext<Scheme::BFV> &input2, const ExecutionOptions &options = ExecutionOptions())

Subtracts a plaintext from a ciphertext in-place, modifying the input ciphertext.

Parameters:
  • input1Ciphertext from which the plaintext will be subtracted.

  • input2Plaintext to be subtracted from the ciphertext.

inline void multiply(Ciphertext<Scheme::BFV> &input1, Ciphertext<Scheme::BFV> &input2, Ciphertext<Scheme::BFV> &output, const ExecutionOptions &options = ExecutionOptions())

Multiplies two ciphertexts and stores the result in the output.

Parameters:
  • input1 – First input ciphertext to be multiplied.

  • input2 – Second input ciphertext to be multiplied.

  • outputCiphertext where the result of the multiplication is stored.

inline void multiply_inplace(Ciphertext<Scheme::BFV> &input1, Ciphertext<Scheme::BFV> &input2, const ExecutionOptions &options = ExecutionOptions())

Multiplies two ciphertexts in-place, modifying the first ciphertext.

Parameters:
  • input1Ciphertext to be multiplied, and where the result will be stored.

  • input2 – Second input ciphertext to be multiplied.

inline void multiply_plain(Ciphertext<Scheme::BFV> &input1, Plaintext<Scheme::BFV> &input2, Ciphertext<Scheme::BFV> &output, const ExecutionOptions &options = ExecutionOptions())

Multiplies a ciphertext and a plaintext and stores the result in the output.

Parameters:
  • input1 – Input ciphertext to be multiplied.

  • input2 – Input plaintext to be multiplied.

  • outputCiphertext where the result of the multiplication is stored.

inline void multiply_plain_inplace(Ciphertext<Scheme::BFV> &input1, Plaintext<Scheme::BFV> &input2, const ExecutionOptions &options = ExecutionOptions())

Multiplies a plaintext with a ciphertext in-place, modifying the input ciphertext.

Parameters:
  • input1Ciphertext to be multiplied by the plaintext, and where the result will be stored.

  • input2Plaintext to be multiplied with the ciphertext.

inline void relinearize_inplace(Ciphertext<Scheme::BFV> &input1, Relinkey<Scheme::BFV> &relin_key, const ExecutionOptions &options = ExecutionOptions())

Performs in-place relinearization of the given ciphertext using the provided relin key.

Parameters:
  • input1Ciphertext to be relinearized.

  • relin_key – The Relinkey object used for relinearization.

inline void rotate_rows(Ciphertext<Scheme::BFV> &input1, Ciphertext<Scheme::BFV> &output, Galoiskey<Scheme::BFV> &galois_key, int shift, const ExecutionOptions &options = ExecutionOptions())

Rotates the rows of a ciphertext by a given shift value and stores the result in the output.

Parameters:
  • input1 – Input ciphertext to be rotated.

  • outputCiphertext where the result of the rotation is stored.

  • galois_key – Galois key used for the rotation operation.

  • shift – Number of positions to shift the rows.

inline void rotate_rows_inplace(Ciphertext<Scheme::BFV> &input1, Galoiskey<Scheme::BFV> &galois_key, int shift, const ExecutionOptions &options = ExecutionOptions())

Rotates the rows of a ciphertext in-place by a given shift value, modifying the input ciphertext.

Parameters:
  • input1Ciphertext to be rotated.

  • galois_key – Galois key used for the rotation operation.

  • shift – Number of positions to shift the rows.

inline void rotate_columns(Ciphertext<Scheme::BFV> &input1, Ciphertext<Scheme::BFV> &output, Galoiskey<Scheme::BFV> &galois_key, const ExecutionOptions &options = ExecutionOptions())

Rotates the columns of a ciphertext and stores the result in the output.

Parameters:
  • input1 – Input ciphertext to be rotated.

  • outputCiphertext where the result of the rotation is stored.

  • galois_key – Galois key used for the rotation operation.

inline void apply_galois(Ciphertext<Scheme::BFV> &input1, Ciphertext<Scheme::BFV> &output, Galoiskey<Scheme::BFV> &galois_key, int galois_elt, const ExecutionOptions &options = ExecutionOptions())

Applies a Galois automorphism to the ciphertext and stores the result in the output.

Parameters:
  • input1 – Input ciphertext to which the Galois operation will be applied.

  • outputCiphertext where the result of the Galois operation is stored.

  • galois_key – Galois key used for the operation.

  • galois_elt – The Galois element to apply.

inline void apply_galois_inplace(Ciphertext<Scheme::BFV> &input1, Galoiskey<Scheme::BFV> &galois_key, int galois_elt, const ExecutionOptions &options = ExecutionOptions())

Applies a Galois automorphism to the ciphertext in-place, modifying the input ciphertext.

Parameters:
  • input1Ciphertext to which the Galois operation will be applied.

  • galois_key – Galois key used for the operation.

  • galois_elt – The Galois element to apply.

inline void keyswitch(Ciphertext<Scheme::BFV> &input1, Ciphertext<Scheme::BFV> &output, Switchkey<Scheme::BFV> &switch_key, const ExecutionOptions &options = ExecutionOptions())

Performs key switching on the ciphertext and stores the result in the output.

Parameters:
  • input1 – Input ciphertext to be key-switched.

  • outputCiphertext where the result of the key switching is stored.

  • switch_key – Switch key used for the key switching operation.

inline void multiply_power_of_X(Ciphertext<Scheme::BFV> &input1, Ciphertext<Scheme::BFV> &output, int index, const ExecutionOptions &options = ExecutionOptions())
inline void transform_to_ntt(Plaintext<Scheme::BFV> &input1, Plaintext<Scheme::BFV> &output, const ExecutionOptions &options = ExecutionOptions())

Transforms a plaintext to the NTT domain and stores the result in the output.

Parameters:
  • input1 – Input plaintext to be transformed.

  • outputPlaintext where the result of the transformation is stored.

inline void transform_to_ntt_inplace(Plaintext<Scheme::BFV> &input1, const ExecutionOptions &options = ExecutionOptions())

Transforms a plaintext to the NTT domain in-place, modifying the input plaintext.

Parameters:

input1Plaintext to be transformed.

inline void transform_to_ntt(Ciphertext<Scheme::BFV> &input1, Ciphertext<Scheme::BFV> &output, const ExecutionOptions &options = ExecutionOptions())

Transforms a ciphertext to the NTT domain and stores the result in the output.

Parameters:
  • input1 – Input ciphertext to be transformed.

  • outputCiphertext where the result of the transformation is stored.

inline void transform_to_ntt_inplace(Ciphertext<Scheme::BFV> &input1, const ExecutionOptions &options = ExecutionOptions())

Transforms a ciphertext to the NTT domain in-place, modifying the input ciphertext.

Parameters:

input1Ciphertext to be transformed.

inline void transform_from_ntt(Ciphertext<Scheme::BFV> &input1, Ciphertext<Scheme::BFV> &output, const ExecutionOptions &options = ExecutionOptions())

Transforms a ciphertext from the NTT domain and stores the result in the output.

Parameters:
  • input1 – Input ciphertext to be transformed from the NTT domain.

  • outputCiphertext where the result of the transformation is stored.

inline void transform_from_ntt_inplace(Ciphertext<Scheme::BFV> &input1, const ExecutionOptions &options = ExecutionOptions())

Transforms a ciphertext from the NTT domain in-place, modifying the input ciphertext.

Parameters:

input1Ciphertext to be transformed from the NTT domain.

HEOperator() = default
HEOperator(const HEOperator &copy) = default
HEOperator(HEOperator &&source) = default
HEOperator &operator=(const HEOperator &assign) = default
HEOperator &operator=(HEOperator &&assign) = default

Protected Functions

HEOperator(HEContext<Scheme::BFV> context, HEEncoder<Scheme::BFV> &encoder)

Construct a new HEOperator object with the given parameters.

Parameters:

context – Reference to the Parameters object that sets the encryption parameters for the operator.

void add_plain_bfv(Ciphertext<Scheme::BFV> &input1, Plaintext<Scheme::BFV> &input2, Ciphertext<Scheme::BFV> &output, const cudaStream_t stream)
void add_plain_bfv_inplace(Ciphertext<Scheme::BFV> &input1, Plaintext<Scheme::BFV> &input2, const cudaStream_t stream)
void sub_plain_bfv(Ciphertext<Scheme::BFV> &input1, Plaintext<Scheme::BFV> &input2, Ciphertext<Scheme::BFV> &output, const cudaStream_t stream)
void sub_plain_bfv_inplace(Ciphertext<Scheme::BFV> &input1, Plaintext<Scheme::BFV> &input2, const cudaStream_t stream)
void multiply_bfv(Ciphertext<Scheme::BFV> &input1, Ciphertext<Scheme::BFV> &input2, Ciphertext<Scheme::BFV> &output, const cudaStream_t stream)
void multiply_plain_bfv(Ciphertext<Scheme::BFV> &input1, Plaintext<Scheme::BFV> &input2, Ciphertext<Scheme::BFV> &output, const cudaStream_t stream)
void relinearize_seal_method_inplace(Ciphertext<Scheme::BFV> &input1, Relinkey<Scheme::BFV> &relin_key, const cudaStream_t stream)
void relinearize_external_product_method2_inplace(Ciphertext<Scheme::BFV> &input1, Relinkey<Scheme::BFV> &relin_key, const cudaStream_t stream)
void rotate_method_I(Ciphertext<Scheme::BFV> &input1, Ciphertext<Scheme::BFV> &output, Galoiskey<Scheme::BFV> &galois_key, int shift, const cudaStream_t stream)
void rotate_method_II(Ciphertext<Scheme::BFV> &input1, Ciphertext<Scheme::BFV> &output, Galoiskey<Scheme::BFV> &galois_key, int shift, const cudaStream_t stream)
void apply_galois_method_I(Ciphertext<Scheme::BFV> &input1, Ciphertext<Scheme::BFV> &output, Galoiskey<Scheme::BFV> &galois_key, int galois_elt, const cudaStream_t stream)
void apply_galois_method_II(Ciphertext<Scheme::BFV> &input1, Ciphertext<Scheme::BFV> &output, Galoiskey<Scheme::BFV> &galois_key, int galois_elt, const cudaStream_t stream)
void rotate_columns_method_I(Ciphertext<Scheme::BFV> &input1, Ciphertext<Scheme::BFV> &output, Galoiskey<Scheme::BFV> &galois_key, const cudaStream_t stream)
void rotate_columns_method_II(Ciphertext<Scheme::BFV> &input1, Ciphertext<Scheme::BFV> &output, Galoiskey<Scheme::BFV> &galois_key, const cudaStream_t stream)
void switchkey_method_I(Ciphertext<Scheme::BFV> &input1, Ciphertext<Scheme::BFV> &output, Switchkey<Scheme::BFV> &switch_key, const cudaStream_t stream)
void switchkey_method_II(Ciphertext<Scheme::BFV> &input1, Ciphertext<Scheme::BFV> &output, Switchkey<Scheme::BFV> &switch_key, const cudaStream_t stream)
void negacyclic_shift_poly_coeffmod(Ciphertext<Scheme::BFV> &input1, Ciphertext<Scheme::BFV> &output, int index, const cudaStream_t stream)
void transform_to_ntt_bfv_plain(Plaintext<Scheme::BFV> &input1, Plaintext<Scheme::BFV> &output, const cudaStream_t stream)
void transform_to_ntt_bfv_cipher(Ciphertext<Scheme::BFV> &input1, Ciphertext<Scheme::BFV> &output, const cudaStream_t stream)
void transform_from_ntt_bfv_cipher(Ciphertext<Scheme::BFV> &input1, Ciphertext<Scheme::BFV> &output, const cudaStream_t stream)
Ciphertext<Scheme::BFV> operator_from_ciphertext(Ciphertext<Scheme::BFV> &input, cudaStream_t stream = cudaStreamDefault)

Protected Attributes

HEContext<Scheme::BFV> context_
std::shared_ptr<DeviceVector<Data64>> encoding_location_
DeviceVector<int> new_prime_locations_
DeviceVector<int> new_input_locations_
int *new_prime_locations = nullptr
int *new_input_locations = nullptr