计算有限域中的乘法逆

时间:2013-12-09 08:26:27

标签: math haskell cryptography abstract-algebra

我已经写了extended Euclidean algorithm函数

xgcd :: FFElem -> FFElem -> (FFElem, FFElem)

对于非零有限域元素 a,b GF p m ),计算 s t ,使 sa + tb = 1. 有没有办法我可以使用xgcd来计算字段中的乘法逆?也就是说,给定 a ∈GF( p m ),我想计算 b ,使 ab =1∈GF( p m )。


我也实现了这些功能

(+)       :: FFElem -> FFElem -> FFElem
(-)       :: FFElem -> FFElem -> FFElem
(*)       :: FFElem -> FFElem -> FFElem
(^)       :: FFElem -> Integer -> FFElem
ffQuotRem :: FFElem -> FFElem -> (FFElem, FFElem)
degree    :: FFElem -> Integer

(+)(-)(*)(^)ffQuotRem的行为正如您所期望的那样degree是通常的{{ 3}}用于有限域(场元素的多项式表示的程度)。

(答案不一定需要在Haskell中。)

2 个答案:

答案 0 :(得分:6)

以下是回答的一些步骤。首先,考虑环Z/nZ,如果n是素数,则为{}。我们可以给出一个简单的例程来计算元素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)

其类型为inverse :: Integral a => a -> a -> Maybe a,因为当不存在乘法逆时,它允许非素数n

如果某个字段不是素数字段,则它是某个素数K = Z/nZ的素数域n的字段扩展名,并且对于某些多项式K[x]/p是同构的p 1}}。特别是,我们要求有一个功能

degree :: Polynomial -> Integer

告诉我们多项式的次数和部分函数

project :: Integral a => Polynomial -> Maybe a

以明显的方式将0度的多项式投影到其基础字段。因此,如果您知道np,那么

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

这将有一些简单的实例(素数字段,可以用数据类型表示)

data PrimeField = PF { size :: Integer, element :: Integer }

和非素数有限域的更复杂的实例,其元素是多项式,可能用Map -

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

答案 1 :(得分:3)

一种更理论化的方法来增强克里斯的惊人答案:

在F [x]中给定F = Z /(p),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)

其中r -1 是F中r的乘法逆。

因此,{[1}}的同余类的乘法逆是F [x] /(f)中的u