我试图重新创建wiki的示例程序,可在此处获取:
https://en.wikipedia.org/wiki/NTRUEncrypt
我在尝试反转多项式时遇到了一个问题。
下面的SAGE代码似乎适用于给定的 p = 3 ,这是一个素数。
然而, q = 32生成的字段中多项式的表示结果是错误的,因为它的行为就好像模数 2 。
这里有正在使用的代码:
F = PolynomialRing(GF(32),'a')
a = F.gen()
Ring = F.quotient(a^11 - 1, 'x')
x = Ring.gen()
pollist = [-1, 1, 1, 0, -1, 0, 1, 0, 0, 1, -1]
fq = Ring(pollist)
print(fq)
print(fq^(-1))
戒指描述如下:
Univariate Quotient Polynomial Ring in x over Finite Field in z5 of size 2^5 with modulus a^11 + 1
结果:
x^10 + x^9 + x^6 + x^4 + x^2 + x + 1
x^5 + x + 1
我试图用IntegerModRing替换有限域(32),但是反转最终需要一个字段,如消息所示:
NotImplementedError: The base ring (=Ring of integers modulo 32) is not a field
关于如何获得f(mod q)的正确倒数的任何建议都将非常感激。
答案 0 :(得分:1)
GF(32)
是包含32个元素的有限字段,而不是模32的整数。您必须使用Zmod(32)
(或IntegerModRing(32)
,如您所建议的那样)。
正如你所指出的,Sage精神上禁止你在ℤ/32ℤ[a] /(a¹¹-1)中计算逆,因为那不是一个场,甚至不是一个因子环。但是,当它们存在时,它可以计算那些反转,只有你必须更友善地提出要求:
sage: F.<a> = Zmod(32)[]
sage: fq = F([-1, 1, 1, 0, -1, 0, 1, 0, 0, 1, -1])
sage: print(fq)
31*a^10 + a^9 + a^6 + 31*a^4 + a^2 + a + 31
sage: print(fq.inverse_mod(a^11 - 1))
16*a^8 + 4*a^7 + 10*a^5 + 28*a^4 + 9*a^3 + 13*a^2 + 21*a + 1
不公正,这并不理想。