Math 有限域中乘法逆的计算
我写了一个函数 对于非零有限域元a,b∈ (pm),计算s和t,使sa+tb=1是否有一种方法可以使用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 (^
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)