A) У меня есть проблемы, чтобы понять отношения между этими настройками:
parms.set_poly_modulus("1x^2048 + 1");
parms.set_coeff_modulus(coeff_modulus_128(2048));
parms.set_plain_modulus(1 << 8);
и эта таблица из УПРАВЛЕНИЕ ПЕЧАТЬЮ.
Меня интересует, в частности, число 54 и как оно было рассчитано в отношении parms.set_poly_modulus("1x^2048 + 1")
а также parms.set_coeff_modulus(coeff_modulus_128(2048))
,
B) Я пытаюсь найти правильные параметры для моего варианта использования.
Допустим, у меня есть 10000 дробных чисел от -180 до +180, и я хочу кодировать каждое из этих чисел, используя FractionalEncoder
, Предварительно выполненные операции будут: вычесть, сложить, умножить, возвести в квадрат и возвести в степень. Результат будет сохранен в отдельном Ciphertext
переменная.
Итак, что касается моего варианта использования, каковы оптимальные параметры для:
n, q, t
в
parms.set_poly_modulus("1x^n + 1");
parms.set_coeff_modulus(coeff_modulus_128(q));
parms.set_plain_modulus(t);
a
а также b
в seal::FractionalEncoder encoder(context.plain_modulus(), context.poly_modulus(), a, b, 2)
, я использую а = 512 а также б = 128, что слишком высоко для моего варианта использования.
Как я могу рассчитать эти параметры самостоятельно, если мой вариант использования изменится?
A) В вашем примере вы используете полиномиальный модуль измерения 2048 и 128-битный уровень безопасности по умолчанию для модуля коэффициента. Чтобы увидеть, что именно это значение, посмотрите на SEAL/seal/util/globals.cpp
, Коэффициент модуля является вектором SmallModulus
объекты, которые являются положительными целыми числами, представляющими до 60-битных факторов Всего коэффициент модуля. Например, для ваших параметров модуль коэффициента состоит только из одного простого множителя 0x3fffffff000001
, но вы увидите, что для больших параметров это может иметь гораздо больше факторов.
Уровень безопасности зависит как от степени модуля полинома (чем выше, тем выше безопасность), так и от длины в битах Всего коэффициент модуля (меньше — высокий уровень безопасности). Таким образом, для фиксированного модуля полинома должен быть максимально допустимый коэффициент модуля, обеспечивающий фиксированный уровень безопасности. Поскольку совсем не легко узнать, какова эта верхняя граница для модуля коэффициента, SEAL предоставляет его в качестве значения по умолчанию через coeff_modulus_128
(а также coeff_modulus_192
а также coeff_modulus_256
для более высоких уровней безопасности). В некоторых случаях вы можете использовать меньший модуль коэффициента, чем по умолчанию, но вы никогда не должны использовать больший модуль коэффициента, если вы действительно не знаете, что делаете (и, вероятно, даже тогда). Длина в 54 бита получается с использованием оценки Мартина Альбрехта LWE: https://bitbucket.org/malb/lwe-estimator.
B) Типичный рабочий процесс при определении параметров в такой ситуации — сначала определить достаточно большой plain_modulus
так что вы получите правильность для вашего вычисления. Если вы исчерпали бюджет шума, просто настройте свой coeff_modulus
пока это не работает.
Как только вы нашли достаточно большой plain_modulus
попробуйте оптимизировать coeff_modulus
установив его наименьшее значение, оставляя вас с ненулевым шумовым бюджетом. Для простоты вы можете просто попробовать разные значения по умолчанию, полученные через coeff_modulus_128
, Если вы действительно заботитесь о производительности, вы можете выбрать coeff_modulus
простые числа, чтобы действительно найти наименьшее значение, которое работает.
Далее выберите свой poly_modulus
быть достаточно большим, чтобы ваш общий модуль коэффициента был максимально равен значению по умолчанию для этого poly_modulus
степень.
Наконец, вы можете вручную настроить decomposition_bit_count
используется в перелинеаризации. По умолчанию вы должны использовать значение 60, которое приводит к лучшей вычислительной производительности, но к большему росту шума. В некоторых случаях вы можете оставить это, например, на 30, если вы оказались в ситуации, когда некоторый дополнительный сэкономленный бюджет шума позволил бы вам переключиться на меньшие параметры шифрования. В большинстве случаев такой уровень тонкой настройки не требуется.
Какими будут в конечном итоге оптимальные параметры, полностью зависит от ваших вычислений, поэтому без конкретных деталей невозможно дать прямой ответ здесь.
Параметризация FractionalEncoder
это другое дело. Я бы порекомендовал поэкспериментировать с разными значениями, чтобы понять, как эти варианты влияют на точность. Что не так с выбором a = 512, b = 128?
Других решений пока нет …