NTRU Псевдокод для вычисления полиномиальных инверсий

Мне было интересно, может ли кто-нибудь сказать мне, как реализовать строку 45 следующего псевдокода.

Require: the polynomial to invert a(x), N, and q.
1: k = 0
2: b = 1
3: c = 0
4: f = a
5: g = 0 {Steps 5-7 set g(x) = x^N - 1.}
6: g[0] = -1
7: g[N] = 1
8: loop
9:  while f[0] = 0 do
10:         for i = 1 to N do
11:             f[i - 1] = f[i] {f(x) = f(x)/x}
12:             c[N + 1 - i] = c[N - i] {c(x) = c(x) * x}
13:         end for
14:         f[N] = 0
15:         c[0] = 0
16:         k = k + 1
17:     end while
18:     if deg(f) = 0 then
19:         goto Step 32
20:     end if
21:     if deg(f) < deg(g) then
22:         temp = f {Exchange f and g}
23:         f = g
24:         g = temp
25:         temp = b {Exchange b and c}
26:         b = c
27:         c = temp
28:     end if
29:     f = f XOR g
30:     b = b XOR c
31: end loop
32: j = 0
33: k = k mod N
34: for i = N - 1 downto 0 do
35:     j = i - k
36:     if j < 0 then
37:         j = j + N
38:     end if
39:     Fq[j] = b[i]
40: end for
41: v = 2
42: while v < q do
43:     v = v * 2
44:     StarMultiply(a; Fq; temp;N; v)
45:     temp = 2 - temp mod v
46:     StarMultiply(Fq; temp; Fq;N; v)
47: end while
48: for i = N - 1 downto 0 do
49:     if Fq[i] < 0 then
50:         Fq[i] = Fq[i] + q
51:     end if
52: end for
53: {Inverse Poly Fq returns the inverse polynomial, Fq, through the argument list.}

Функция StarMultiply возвращает многочлен (массив), хранящийся в переменной temp. По сути, temp - это многочлен (я представляю его как массив), а v - целое число (скажем, 4 или 8), так что же именно temp = 2-temp mod v на нормальном языке? Как мне реализовать эту строку в моем коде. Может кто-нибудь привести мне пример.

Вышеупомянутый алгоритм предназначен для вычисления обратных полиномов для генерации ключа NTRUEncrypt. Псевдокод можно найти на странице 28 в этот документ. Заранее спасибо.


person Mohammad Sepahvand    schedule 17.03.2010    source источник
comment
Я также пытаюсь реализовать NTRUEncrypt, и, поскольку вы это сделали, и учитывая, что ваш метод хранения коэффициентов очень похож на мой, я был бы очень признателен, если бы вы помогли мне с обратной функцией. Есть ли шанс связаться с вами по электронной почте?   -  person FljpFl0p    schedule 12.05.2012
comment
Большое спасибо, я постараюсь реализовать это сейчас. Я скачал опубликованный вами документ и работаю над ним. Возможно, вам придется побеспокоить вас в ближайшие несколько дней.   -  person FljpFl0p    schedule 12.05.2012
comment
Я послал Вам письмо. Просто хочу знать, получили ли вы его, на случай, если я ошибся адресом.   -  person FljpFl0p    schedule 12.05.2012


Ответы (1)


Для каждой записи в temp, temp [i], установите temp [i] = 2-temp [i] mod v.

Это должно соответствовать разделу «Обратный в Z_p ^ n» моего ответа на Алгоритм вычисления обратного многочлена.

Когда я смотрю на это сейчас, я думаю, что мой ответ может не соответствовать тому, что он говорит - он говорит «Обратный в Z_p ^ n», но он больше похож на обратный в Z_2 ^ n. Таким образом, он должен работать для p = 2, но, возможно, ни для чего другого.

person William Whyte    schedule 17.03.2010
comment
Большое спасибо Уильям, еще один быстрый вопрос, в: 2-temp [i] mod v, модуль применяется к 2-temp [i], а не только к temp [i], правильно? Так что я должен вычислить (2-temp [i])% 2, а не 2- (temp [i]% 2), верно? - person Mohammad Sepahvand; 18.03.2010
comment
Привет, Уильям, я пытаюсь найти обратное к (X) по модулю 32, после запуска первых 31 строки алгоритма для многочлена a (X) = [- 1,1,1,0, -1,0 , 1,0,0,1, -1] моя программа возвращает: b (X) = [1,1,0,0,0,1] и c (X) = [0,0,0,0,0 , 0,0,0,1,1] и k = 11; Я уже знаю из учебника NTRU, что обратный (X) mod 32 равен [5,9,6,16,4,15,16,22,20,18,30], однако, когда я продолжу с остальной частью код, я получаю другой ответ. Мне было интересно, можете ли вы проверить правильность моего значения b (X), которое я получаю после первой 31 строки? Если бы вы могли это сделать, я был бы чрезвычайно признателен. Спасибо. - person Mohammad Sepahvand; 21.03.2010
comment
Привет, Невилл, моя реализация алгоритма инверсии не соответствует точно вашему псевдокоду, поэтому мне может потребоваться несколько дней, чтобы разобраться с этим. Надеюсь, это нормально. - person William Whyte; 22.03.2010
comment
Привет, Уильям, спасибо, мне наконец удалось успешно реализовать псевдокод, однако у меня возник небольшой вопрос. Чтобы иметь возможность сгенерировать многочлен с инверсиями для генерации ключа, учебник NTRU советует использовать многочлен f = 1 + p * F, где p = (2 + x), а F - небольшой многочлен, который теперь включен в N = 11, рекомендуется выбирать F таким образом, чтобы у него были коэффициенты dF, равные 1, а остальные равны 0, для N = 11 использовалось dF = 4, мне было интересно, какая связь между N и dF было, скажем, для полинома N = 251, какое значение для dF мне нужно использовать? Заранее спасибо. - person Mohammad Sepahvand; 24.03.2010