模數實例(SEAL/smallmodulus.h 2.3.0)


文件原位置SEAL/smallmodulus.h

介紹

加密參數plain_modulus和coeff_modulus中的素數由SmallModulus的實例表示。 整數模數的表示高達62位。 此類的目的是執行和存儲Barrett約簡(Barrett reduction)所需的預計算。

@par 線程安全
通常,只要沒有其他線程同時改變它,從SmallModulus讀取就是線程安全的。

@see EncryptionParameters用於描述加密參數。

overview

overview

private

成員

SmallModulus(std::uint64_t value, std::array<std::uint64_t, 3> const_ratio, int bit_count, int uint64_count) :
            value_(value), const_ratio_(const_ratio), bit_count_(bit_count), uint64_count_(uint64_count)
        {
        }
std::uint64_t value_ = 0;

// C++11 compatibility
std::array<std::uint64_t, 3> const_ratio_{ { 0 } };

int bit_count_ = 0;

int uint64_count_ = 0;

set_value

void SmallModulus::set_value(uint64_t value)
{
  if (value == 0)
  {
      // Zero settings
      bit_count_ = 0;
      uint64_count_ = 1;
      value_ = 0;

      // C++11 compatibility
      const_ratio_ = { { 0 } };
  }
  else if (value >> 62 != 0 || value == 0x4000000000000000 || value == 1)
  {
      throw invalid_argument("value can be at most 62 bits and cannot be 1");
  }
  else
  {
      // All normal, compute const_ratio and set everything
      value_ = value;
      bit_count_ = get_significant_bit_count(value_);

      // Compute Barrett ratios for 64-bit words (barrett_reduce_128)
      uint64_t numerator[3]{ 0, 0, 1 };
      uint64_t quotient[3]{ 0 };

      // Use a special method to avoid using memory pool
      divide_uint192_uint64_inplace(numerator, value_, quotient);

      const_ratio_[0] = quotient[0];
      const_ratio_[1] = quotient[1];

      // We store also the remainder
      const_ratio_[2] = numerator[0];

      uint64_count_ = 1;
  }
}

public

構造函數1

/**
創建一個SmallModulus實例。 SmallModulus的值設置爲
給定值,或默認爲零。

@param [in] value整數模數
@throws std :: invalid_argument如果value爲1或大於62位
*/
SmallModulus(std::uint64_t value = 0)
{
    set_value(value);
}

構造函數2

/**
通過複製給定的一個SmallModulus來創建一個新的SmallModulus。

@param [in] copy要複製的SmallModulus
*/
SmallModulus(const SmallModulus &copy) = default;

構造函數3

/**
通過複製給定的一個SmallModulus來創建一個新的SmallModulus。

@param [in] source SmallModulus來自
*/
SmallModulus(SmallModulus &&source) = default;

運算符重載1(=)

/**
將給定的SmallModulus複製到當前的SmallModulus。

@param [in]assign SmallModulus從中複製
*/
SmallModulus &operator =(const SmallModulus &assign) = default;

運算符重載2(=)

/**
將給定的SmallModulus移動到當前的SmallModulus。

@param [in]assign SmallModulus移動
*/
SmallModulus &operator =(SmallModulus &&assign) = default;

運算符重載3(=)

/**
設置SmallModulus的值。

@param [in] value新的整數模數
@throws std :: invalid_argument如果value爲1或大於62位
*/
inline SmallModulus &operator =(std::uint64_t value)
{
    set_value(value);
    return *this;
}

bit_count()

/**
返回當前SmallModulus值的有效位數。
*/
inline int bit_count() const
{
    return bit_count_;
}

uint64_count()

/**
返回當前SmallModulus值的大小(以64位字爲單位)。
*/
inline int uint64_count() const
{
    return uint64_count_;
}

*pointer()

/**
返回指向當前SmallModulus值的常量指針。
*/
inline const uint64_t *pointer() const
{
    return &value_;
}

value()

/**
返回當前SmallModulus的值。
*/
inline std::uint64_t value() const
{
    return value_;
}

const_ratio()

/**
返回爲當前SmallModulus的值計算的Barrett比率。 
Barrett比率的前兩個分量是2 ^ 128 /值的底限,第三個分量是餘數。
*/
inline const std::array<std::uint64_t, 3> &const_ratio() const
{
    return const_ratio_;
}

is_zero()

/**
返回當前SmallModulus的值是否爲零。
*/
inline bool is_zero() const
{
    return value_ == 0;
}

運算符重載4(==)

/**
比較兩個SmallModulus實例。

@param[in] compare The SmallModulus to compare against
*/
inline bool operator ==(const SmallModulus &compare) const
{
    return value_ == compare.value_;
}

運算符重載5(==)

/**
將當前SmallModulus的值與給定值進行比較。

@param[in] compare The value to compare against
*/
inline bool operator ==(std::uint64_t compare) const
{
    return value_ == compare;
}

運算符重載6(!=)

/**
比較兩個SmallModulus實例。

@param[in] compare The SmallModulus to compare against
*/
inline bool operator !=(const SmallModulus &compare) const
{
    return !(value_ == compare.value_);
}

運算符重載7(!=)

/**
將當前SmallModulus的值與給定值進行比較。

@param[in] compare The value to compare against
*/
inline bool operator !=(std::uint64_t compare) const
{
    return !(value_ == compare);
}

save()

/**
將SmallModulus保存到輸出流。 模數的完整狀態是序列化的。
輸出是二進制格式,不是人類可讀的。 輸出流必須設置“二進制”標誌。

@param [in] stream 將SmallModulus保存到的流
*/
void SmallModulus::save(ostream &stream) const
{
    int bit_count32 = bit_count_;
    stream.write(reinterpret_cast<const char*>(&bit_count32), sizeof(int32_t));
    int uint64_count32 = uint64_count_;
    stream.write(reinterpret_cast<const char*>(&uint64_count32), sizeof(int32_t));
    stream.write(reinterpret_cast<const char*>(&value_), bytes_per_uint64);
    stream.write(reinterpret_cast<const char*>(const_ratio_.data()), 3 * bytes_per_uint64);
}

load()

/**
從輸入流加載SmallModulus,覆蓋當前的SmallModulus。

@param [in] stream從中加載SmallModulus的流
*/
void SmallModulus::load(istream &stream)
{
    int bit_count32;
    stream.read(reinterpret_cast<char*>(&bit_count32), sizeof(int32_t));
    bit_count_ = bit_count32;
    int uint64_count32;
    stream.read(reinterpret_cast<char*>(&uint64_count32), sizeof(int32_t));
    uint64_count_ = uint64_count32;
    stream.read(reinterpret_cast<char*>(&value_), bytes_per_uint64);
    stream.read(reinterpret_cast<char*>(const_ratio_.data()), 3 * bytes_per_uint64);
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章