如果F:= GF(p ^ n)是具有p ^ n个元素的有限域,其中p是素数和na自然数,是否有任何有效的算法来计算F中两个元素的乘积?
到目前为止,我的想法是:
我知道F的标准结构是在GF(p)中采用n次的不可约多项式f,然后在商GF(p)[X] /(f)中将F的元素视为多项式,并且我有一种感觉,这可能已经是正确的方法,因为多项式乘法和加法应该很容易实现,但我不知道怎么看不出这是如何实际完成的。例如,如何选择合适的f,以及如何获得任意多项式的等价类?
答案 0 :(得分:3)
是否有一种有效的算法来乘法GF(p ^ n)中的元素取决于你如何表示GF(p ^ n)的元素。
正如你所说,确实有一种方法可以在GF(p)(X)/(f)中工作。这里的加法和乘法相对简单。然而,确定合适的不可约多项式f并不容易 - 据我所知,没有一种有效的算法来计算合适的f。
另一种方法是使用所谓的Zech's logarithms。 Magma使用 用于处理小有限域的预先计算的表。 GAP可能会这样做 虽然它的文档不太清楚,但也是如此。
使用数学结构进行计算通常非常棘手。你肯定不会错过任何明显的东西。
答案 1 :(得分:3)
这取决于您的需求和您的领域。
当你乘以时,你必须选择一个F x 的发电机。当你添加时,你必须使用F是一个较小的F p m 上的向量空间这一事实。在实践中,你做了很多时间是一些混合的方法。例如。如果你在F 256 上工作,取一个F 256 x 的生成器X,让G为F 上的最小多项式16 子>。你现在有了
(sum i小于16 a i X i )(sum j小于16 b < sub> j X j )= sum_k sum i + j = k a i b j X I + J
要使乘法有效,你需要做的就是存储F 16 的乘法表,并且(使用G)根据X的较低幂和F中的元素构造X ^ m子> 16 子>
在极少数情况下,在p n = 2 2 n 的情况下,你会获得Conways领域的nimbers(看看Conways“获胜)方法“,或在Knuth的第4A卷第7.1.3节中),其中有非常有效的算法。
答案 2 :(得分:3)
首先选择GF [p]上的n次不可约多项式。只需生成随机数,随机多项式为irreducible with probability ~1/n。
要测试随机多项式,您需要一些代码来对GF [p]上的多项式进行分解,有些算法请参见the wikipedia page。
然后GF [p ^ n]中的元素只是GF [p]上的n次多项式。只需进行正规多项式算术,并确保计算余数为不可约多项式的模数。
编写此方案的简单版本非常容易。你可以在实现模数操作方面任意复杂化。请参阅modular exponentiation,Montgomery multiplication,并使用FFT进行乘法。
答案 3 :(得分:2)
Galois Field Arithmetic Library(C ++,mod 2,看起来不支持其他素数元素)
LinBox(C ++)
MPFQ(C ++)
我没有这些的个人经验(但是已经为31级或更少的Galois字段制作了我自己的原始C ++类,没有太奇特或值得复制)。就像上面提到的一位评论者一样,你可以查看mathoverflow.net - 只要好好问一下,确保你先做完作业。有人应该知道哪种数学软件适合于操纵有限域,并且它与mathoverflow的感兴趣区域足够接近,以至于一个明确的问题不应该被关闭。
答案 4 :(得分:1)
假设这是一个在有限域中执行乘法的算法的问题,当确定一个 monic 不可约多项式 f(X) 时(否则考虑 Rabin's Test for Irreducibility)
你有两个 n-1 次多项式
A(X) = a_0 + a_1*X + a_2*X^2 + ... + a_(n-1)*X^(n-1) and
B(X) = b_0 + b_1*X + b_2*X^2 + ... + b_(n-1)*X^(n-1)
系数a_k, b_k是Z/pZ的代表{0,1,...,p-1}。
产品定义为
C(X) = A(X)*B(X) % f(X),
其中模运算符“%”是多项式除法的余数A(X)*B(X) / f(X)。
以下是复杂度为 O(n^2)
1.) 根据分配律,产品可以分解为
B(X) * X^(n-1) * a_(n-1)
+ B(X) * X^(n-2) * a_(n-2)
+ ...
+ B(X) * a_0
=
(...(a_(n-1) * B(X) * X
+ a_(n-2) * B(X)) * X
+ a_(n-3) * B(X)) * X
...
+ a_1 * B(X)) * X
+ a_0 * B(X)
2.) 对于 %-operator 是从 Z/pZ[X] 到 GF(p^n) 的环同态,它可以应用于上述迭代的每一步。
A(X)*B(X) % f(X) =
(...(a_(n-1) * B(X) * X % f(X)
+ a_(n-2) * B(X)) * X % f(X)
+ a_(n-3) * B(X)) * X % f(X)
...
+ a_1 * B(X)) * X % f(X)
+ a_0 * B(X)
3.) 在每次与 X 相乘后,即系数空间中的一个移位,你有一个 n次的多项式 T_k(X) i> 带有元素 t_kn * X^n。归约模 f(X) 由
完成T_k(X) % f(X) = T_k(X) - t_kn*f(X),
这是一个 n-1 次多项式。
最后,用归约多项式
r(x) := f(x) - X^n and
T_k(X) =: t_kn * X^n + U_(n-1)(X)
T_k(X) % f(X) = t_kn * X^n + U_(n-1)(X) - t_kn*( r(x) + X^n)
= U_(n-1)(X) - t_kn*r(x)
即所有步骤都可以用最大次数为 n-1 的多项式完成。