aboutsummaryrefslogtreecommitdiffstats
path: root/ecc.hs
blob: 390bbb319536fd390f3c1c388106b36c80400421 (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
42
43
44
45
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"

instance Fractional FieldElement where
  recip a = a ^ (prime a - 2)
  fromRational _ = 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