我已经写了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中。)
答案 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度的多项式投影到其基础字段。因此,如果您知道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
这将有一些简单的实例(素数字段,可以用数据类型表示)
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
。