我试图通过编写一小组用于计算有限(伽罗瓦)域的函数来学习一点 Haskell。几年前,我为计算机代数系统 GNU Maxima(参见此处)编写了一个类似库的第一个版本,我想我会尝试用 Haskell 做同样的事情。
但是,我对数据类型感到困惑。对于有限域,您需要一个基素数 q(该域的特征)和一个不可约模 q 的多项式 p(x)。如果 p(x) 的次数为 n,则该域的阶数为 q^n,并且其元素都是次数为 n-1 或更小的多项式(模 q)。
我们可以将多项式表示为其系数的列表,因此该字段的元素只是 Z_q 和长度为 n 的元素的列表(或向量,如果您愿意)。加法是按分量模 q 完成的,乘法是模 p(x) 完成的。
我想如果我能得到数据类型和加法,剩下的就很简单了。我的第一次尝试是这样的:
import Data.List
data GF = GF {characteristic::Int
,power::Int
,poly::[Int]
,irreducible::[Int]
} deriving(Eq, Show)
幂元素是不必要的 - 毕竟它只是比不可约多项式的长度小一 - 但拥有它而不是必须计算它很方便。
然后我有我的附加功能:
addGF :: GF -> GF -> GF
addGF x y = GF q n zp p
where
q = characteristic x
n = power x
zp = zipWith (\i j -> rem (i+j) q) xp yp
where
xp = poly x
yp = poly y
p = irreducible x
这行得通,但不优雅,我敢肯定非常“非哈斯克尔式”。部分问题是我不知道如何将 Galois 字段的定义(或类型)与其元素分离。
我需要做的是为一个字段提供一个通用类型,并在此之上定义它的元素。毕竟,我可能想要对一个独立于其元素的字段做一些事情,例如生成标准基、查找原始元素、为原始元素生成对数表、生成随机元素等。
所以我想我的问题是:如何定义伽罗瓦域的泛型类型,使其元素的操作尽可能自然?
我已经阅读了许多关于定义数据类型、类等的页面,毫无疑问,其中之一包含了我的问题的解决方案。但我读得越多,我就越困惑。我想要的只是有人轻轻但坚定地指出我正确的方向。谢谢!