Skip to content

Commit 4e78a45

Browse files
authored
added binary instances (#3)
1 parent b0867ff commit 4e78a45

File tree

6 files changed

+35
-2
lines changed

6 files changed

+35
-2
lines changed

.github/workflows/ormolu.yml

+16
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
name: Ormolu CI
2+
3+
on:
4+
push:
5+
branches: [main, master]
6+
pull_request:
7+
branches: [main, master]
8+
9+
jobs:
10+
ormolu:
11+
runs-on: ubuntu-latest
12+
steps:
13+
- uses: actions/checkout@v4
14+
- uses: haskell-actions/run-ormolu@v15
15+
with:
16+
version: "0.7.2.0"

galois-field.cabal

+1
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ common warnings
2222
common deps
2323
build-depends:
2424
, base >=4.18 && <5
25+
, binary >=0.8.9 && <0.9
2526
, bitvec ^>=1.1.3
2627
, groups >=0.4.1 && <0.6
2728
, integer-gmp ^>=1.1

src/Data/Field/Galois/Base.hs

+3-1
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ module Data.Field.Galois.Base
44
where
55

66
import Control.Monad.Random (Random)
7+
import Data.Binary (Binary)
78
import Data.Field (Field)
89
import Data.Group qualified as G (Group (..))
910
import Data.Propagator (PropagatedNum)
@@ -28,7 +29,8 @@ class
2829
Random k,
2930
Show k,
3031
NFData k,
31-
PropagatedNum k
32+
PropagatedNum k,
33+
Binary k
3234
) =>
3335
GaloisField k
3436
where

src/Data/Field/Galois/Binary.hs

+5
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ module Data.Field.Galois.Binary
88
where
99

1010
import Control.Monad.Random (Random (..))
11+
import Data.Binary qualified as B
1112
import Data.Bit (Bit, F2Poly, gcdExt, toF2Poly, unF2Poly)
1213
import Data.Euclidean as S (Euclidean (..), GcdDomain)
1314
import Data.Field (Field)
@@ -48,6 +49,10 @@ instance Propagated (Binary p)
4849

4950
instance (KnownNat p) => PropagatedNum (Binary p)
5051

52+
instance B.Binary (Binary p) where
53+
put (B x) = B.put (toInteger <$> V.toList (unF2Poly x))
54+
get = B . toF2Poly . V.fromList . map (fromInteger @Bit) <$> B.get
55+
5156
-- Binary fields are Galois fields.
5257
instance (KnownNat p) => GaloisField (Binary p) where
5358
char = const 2

src/Data/Field/Galois/Extension.hs

+5
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ module Data.Field.Galois.Extension
1818
where
1919

2020
import Control.Monad.Random (Random (..))
21+
import Data.Binary qualified as B
2122
import Data.Euclidean (Euclidean (..), GcdDomain, gcdExt)
2223
import Data.Field (Field)
2324
import Data.Field.Galois.Base (GaloisField (..))
@@ -54,6 +55,10 @@ class (GaloisField k) => ExtensionField k where
5455
newtype Extension p k = E (VPoly k)
5556
deriving (Eq, Generic, NFData, Ord, Show)
5657

58+
instance (GaloisField k) => B.Binary (Extension p k) where
59+
put (E x) = B.put (toList x)
60+
get = E . fromList <$> B.get
61+
5762
-- Extension fields are convertible.
5863
instance (IrreducibleMonic p k) => ExtensionField (Extension p k) where
5964
fromE = toList

src/Data/Field/Galois/Prime.hs

+5-1
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ module Data.Field.Galois.Prime
77
where
88

99
import Control.Monad.Random (Random (..))
10+
import Data.Binary qualified as B
1011
import Data.Euclidean as S (Euclidean (..), GcdDomain)
1112
import Data.Field (Field)
1213
import Data.Field.Galois.Base (GaloisField (..))
@@ -42,6 +43,10 @@ instance (KnownNat p) => PropagatedNum (Prime p)
4243
instance Hashable (Prime p) where
4344
hashWithSalt s (P x) = hashWithSalt s (unMod x)
4445

46+
instance (KnownNat p) => B.Binary (Prime p) where
47+
put = B.put . fromP
48+
get = P . fromInteger <$> B.get
49+
4550
-- Prime fields are convertible.
4651
instance (KnownNat p) => PrimeField (Prime p) where
4752
fromP (P x) = naturalToInteger (unMod x)
@@ -111,7 +116,6 @@ instance (KnownNat p) => Pretty (Prime p) where
111116
then pretty x
112117
else text "-" <> pretty (abs (x - p))
113118

114-
115119
-- Prime fields are random.
116120
instance (KnownNat p) => Random (Prime p) where
117121
random = randomR (minBound, maxBound)

0 commit comments

Comments
 (0)