Math 如何在有限域中实现乘法?

Math 如何在有限域中实现乘法?,math,algebra,Math,Algebra,如果F:=GF(p^n)是有p^n个元素的有限域,其中p是素数,n是自然数,有没有有效的算法来计算F中两个元素的乘积 到目前为止,我的想法如下: 我知道F的标准构造是取GF(p)中n次的不可约多项式F,然后将F元素视为商GF(p)[X]/(F)中的多项式,我感觉这可能已经是正确的方法,因为多项式乘法和加法应该很容易实现,但不知何故,我看不出这实际上是如何做到的。例如,如何选择合适的f,以及如何获得任意多项式的等价类?是否有一个有效的算法来乘法GF(p^n)中的元素取决于如何表示GF(p^n)中的

如果F:=GF(p^n)是有p^n个元素的有限域,其中p是素数,n是自然数,有没有有效的算法来计算F中两个元素的乘积

到目前为止,我的想法如下:


我知道F的标准构造是取GF(p)中n次的不可约多项式F,然后将F元素视为商GF(p)[X]/(F)中的多项式,我感觉这可能已经是正确的方法,因为多项式乘法和加法应该很容易实现,但不知何故,我看不出这实际上是如何做到的。例如,如何选择合适的f,以及如何获得任意多项式的等价类?

是否有一个有效的算法来乘法GF(p^n)中的元素取决于如何表示GF(p^n)中的元素

正如你所说,一种方法确实是在GF(p)(X)/(f)中工作。这里的加法和乘法相对简单。然而,确定一个合适的不可约多项式f并不容易——据我所知,没有一个有效的算法来计算合适的f

另一种方法是使用所谓的。使用 用于处理小有限域的预计算表。这是可能的 尽管它的文档不太清楚,但它也是如此

用数学结构进行计算通常是相当棘手的。您肯定没有遗漏任何明显的内容。

(C++,mod 2,看起来不支持其他基本元素)

(C++)

(C++)


我没有个人经验W/[这些],但是(为GaloIS领域31度或更少的我做了自己的原始C++类,没有太异乎寻常或值得复制)。就像上面提到的一位评论员,你可以检查一下——只是友好地问一下,并确保你先完成了作业。那里的人应该知道什么样的数学软件适合于处理有限域,而且它离mathoverflow感兴趣的领域足够近,一个陈述良好的问题不应该被关闭。

这取决于你的需要和你的领域

当你乘你必须选择一个外汇发电机。当你在加法的时候,你必须使用F是一个向量空间在一些更小的Fpm上的事实。实际上,你经常做的是一些混合的方法。例如,如果你在F256上工作,取一个F256的生成器X,让g是F16上的最小多项式。你现在有

(sumi小于16 ai Xi)(sumj小于16 bj Xj)=sum_k sumi+j=k ai bj Xi+j

要使乘法有效,您需要做的就是存储一个F16的乘法表,并(使用G)根据X的次幂和F16中的元素构造X^m


最后,在pn=22n的罕见情况下,你会得到灵巧者的Conways域(参见Conways“winning ways”,或Knuth的第4A卷第7.1.3节),对于这一域,有非常有效的算法。

首先选择一个不可约的n次多项式。只要生成随机数,就可以得到一个随机多项式

要测试随机多项式,您需要一些代码来计算GF[p]上的多项式,请参阅以获取一些算法

那么GF[p^n]中的元素就是GF[p]上的n次多项式。只需做普通多项式运算,并确保计算不可约多项式的余数模


编写这个方案的简单版本非常容易。你可以任意复杂地实现,比如说,模运算。请参阅,并使用FFT乘法。

< P>假定这是一个在有限域中执行乘法的问题,当一个不可约多项式f(x)被识别(否则考虑)

有两个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
=

2.)因为%-算子是从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),元素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)

i、 e.所有步骤都可以用最大次数n-1的多项式完成。

你可能会更幸运地在mathoverflow上问这个问题。Overflow是针对研究数学家的,这个问题的niveau要低得多。它可能只需要你在第三学期学到的知识…我觉得我应该能够回答它,但我只是错过了一些明显的东西,我离成为一名专业数学家还差得很远。事实上,我甚至不是一个数学学家。(继续)传统上,这里的问题更多地与编程有关:从数学上讲,它很清楚发生了什么,我只是无法将这个概念转化为一个实际工作的计算机程序。我投票决定关闭这个问题,因为它属于数学交换。它可能会在MO上很快关闭,这是针对研究生/教学/研究数学的。我不同意。首先,因为它是一种可以被研究数学家使用的工具;第二,我问了一个关于塞奥多洛螺旋的问题,得到了非常礼貌的回答。()思想乘法模不可约多项式是在不知道生成器的情况下定义的。@SamGinrich:defined-yes;效率-不太高。当然是性能!我猜你的方法是“分而治之”的方法。复杂性是什么?是的,它是分而治之的。如果字段中有(p^n)^2=p^(2n)个元素,则保存乘法gro中的完整转换表
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)