blob: 8146711de5afed2a2ae42c728ab9a9f52d970354 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
|
data FieldElement =
FieldElement
{ number :: Int
, prime :: Int
}
deriving (Eq)
instance Show FieldElement where
show a = "FieldElement_" ++ show (prime a) ++ " " ++ show (number a)
assert :: Bool -> Bool
assert False = error "WRONG"
assert x = x
instance Num FieldElement where
(FieldElement a b) + (FieldElement c d)
| b /= d = error "Distinct Fields"
| otherwise = FieldElement (mod (a + c) b) b
(FieldElement a b) * (FieldElement c d)
| b /= d = error "Distinct Fields"
| otherwise = FieldElement (mod (a * c) b) b
abs a = a
signum _ = 1
negate (FieldElement a b) = FieldElement (mod (b - a) b) b
fromInteger _ = error "can't transform"
aa =
let a = FieldElement 2 31
b = FieldElement 15 31
in assert
(and
[ a + b == FieldElement 17 31
, a /= b
, a - b == FieldElement 18 31
])
bb =
let a = FieldElement 19 31
b = FieldElement 24 31
in a * b
|