Math 有限域中乘法逆的计算

Math 有限域中乘法逆的计算,math,haskell,cryptography,abstract-algebra,Math,Haskell,Cryptography,Abstract Algebra,我写了一个函数 对于非零有限域元a,b∈ (pm),计算s和t,使sa+tb=1是否有一种方法可以使用xgcd计算字段中的乘法逆?即,给定∈ GF(pm),我想计算b,使得ab=1∈ GF(下午) 我还实现了这些函数 (+) :: FFElem -> FFElem -> FFElem (-) :: FFElem -> FFElem -> FFElem (*) :: FFElem -> FFElem -> FFElem (^

我写了一个函数

对于非零有限域元a,b∈ (pm),计算s和t,使sa+tb=1是否有一种方法可以使用
xgcd
计算字段中的乘法逆?
即,给定∈ GF(pm),我想计算b,使得ab=1∈ GF(下午)


我还实现了这些函数

(+)       :: FFElem -> FFElem -> FFElem
(-)       :: FFElem -> FFElem -> FFElem
(*)       :: FFElem -> FFElem -> FFElem
(^)       :: FFElem -> Integer -> FFElem
ffQuotRem :: FFElem -> FFElem -> (FFElem, FFElem)
degree    :: FFElem -> Integer
其中,
(+)
(-)
(*)
(^)
,和
ffQuotRem
的行为与您预期的一样,
通常用于有限域(域元素的多项式表示度)


(答案不一定要用哈斯凯尔语。)

以下是找到答案的一些步骤。首先,考虑环<代码> Z/NZ ,这是一个字段,如果<代码> N< /代码>是Prime。我们可以给出一个简单的例程来计算元素
a

-- | Compute the inverse of a in the field Z/nZ.
inverse' a n = let (s, t) = xgcd n a
                   r      = s * n + t * a
                in if r > 1
                    then Nothing
                    else Just (if t < 0 then t + n else t)
这告诉我们多项式的阶数,还有一个部分函数

project :: Integral a => Polynomial -> Maybe a
它以一种显而易见的方式将一个0次多项式投影到它的底层字段。所以如果你知道
n
p
,那么

-- |Compute the inverse of a in the finite field K[x]/p with K=Z/nZ
inverse a (n, p) = let (s, t) = xgcd p a
                       r      = s * p + t * a
                    in if degree r > 0
                         then Nothing
                         else let Just r' = inverse' (project r) n
                               in Just $ r' * t

另外,如果我这样做,我可能会在Haskell中的
Integral
类定义的基础上,定义一个新类

class Integral a => FiniteField a where
    degree  :: a -> Integer
    xgcd    :: a -> a -> (a, a)
    inverse :: a -> a
其中会有一些简单的实例(prime字段,可以用以下数据类型表示)

非素数有限域的更复杂实例,其元素是多项式,可能用
映射表示-

data NonPrimeField = NPF {
    prime     :: Integer
  , maxDegree :: Integer
  , element   :: Map Integer Integer
}

一种更为理论化的方法来补充Chris令人敬畏的答案:

给定F=Z/(p),F[x]中的F和u,可以使用扩展的欧几里德算法来求F[x]中的v和w,从而

uv + fw = gcd(u, f)
现在,如果
f
是不可约的,并且
u
不能被
f
整除,那么它们的最大公约数
r=gcd(u,f)
是一个单位。也就是说,
vu+wf=r
,其中r位于
F\{0}
。从这个等式可以得到同余:

uv = r (mod f)       <=>        uvr⁻¹ = 1 (mod f)
uv=r(模f)uvr⁻⑩=1(f型)
其中r-1是F中r的乘法逆


因此,
u
的同余类的乘法逆是
vr⁻在F[x]/(F)中使用\

您的
xgcd
函数计算什么?你如何定义一个字段中的最大公约数,其中每个非零元素除以每个非零元素?@Joni:我现在明白你的意思了。这不是gcd的正常定义。我更新了问题以反映这一点。
xgcd
真正计算的是什么?给定非零的
a
,对于字段中的每个
t
,您可以找到满足该方程的
s=(1-tb)/a
,因此
xgcd
不能仅由该方程很好地定义…@Joni:我真的把这个问题搞砸了。。。设F=Z/pZ,F(x)在F[x]中不可约,且GF(p^m)=F[x]/(F(x))。我的错误是,
xgcdab
实际上在F[x]中运行,而不是F[x]/(F(x))。也就是说,它计算F[x]中的s和t,使得sa'+tb'=gcd(a',b'),其中a',b'分别是同余类a,b中的最小阶元素。我会更仔细地考虑,并在接下来的几天内设法解决这个问题。我不相信这是正确的。即使输入
u
f
是互质,扩展的欧几里德算法也只能保证生成
v
w
,从而
vu+wf=r
,其中
r
是次多项式
0
——不一定是乘法单位。必须将
v
乘以
1/r
(视为
F
的一个元素),才能得到
u
的乘法逆。克里斯:GCD在乘以一个单位之前是唯一的,所以
GCD(u,f)
可以是
f\{0}
中的任何元素。必须考虑到这一点。
data NonPrimeField = NPF {
    prime     :: Integer
  , maxDegree :: Integer
  , element   :: Map Integer Integer
}
uv + fw = gcd(u, f)
uv = r (mod f)       <=>        uvr⁻¹ = 1 (mod f)