Sage:有限域上的多项式环 - 反转多项式非素数

时间:2018-02-13 23:26:35

标签: field sage polynomials ring inverse

我试图重新创建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)的正确倒数的任何建议都将非常感激。

1 个答案:

答案 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

不公正,这并不理想。