1
1
use std:: ops:: { Add , Sub , Mul , Div , Rem } ;
2
2
3
+ use polynomial_arithmetic:: Polynomial ;
4
+
3
5
#[ derive( Debug , PartialEq ) ]
4
- pub struct PolyModPoly < Polynomial >
5
- where Polynomial : PartialEq
6
+ pub struct PolyModPoly < Polynomial : PartialEq >
6
7
{
7
8
pub poly : Polynomial ,
8
- primitive : Polynomial
9
+ prime : Polynomial
9
10
}
10
11
11
12
impl < Polynomial > Add for & PolyModPoly < Polynomial >
12
- where Polynomial : Clone + PartialEq ,
13
+ where Polynomial : Add + Clone + PartialEq ,
13
14
for < ' a > & ' a Polynomial : Add < Output = Polynomial > {
14
15
type Output = PolyModPoly < Polynomial > ;
15
16
16
17
fn add ( self , other : & PolyModPoly < Polynomial > ) -> PolyModPoly < Polynomial > {
17
18
PolyModPoly :: < Polynomial > {
18
19
poly : & self . poly + & other. poly ,
19
- primitive : self . primitive . clone ( )
20
+ prime : self . prime . clone ( )
20
21
}
21
22
}
22
23
}
@@ -28,25 +29,26 @@ where Polynomial: Clone + PartialEq,
28
29
29
30
fn mul ( self , other : & PolyModPoly < Polynomial > ) -> PolyModPoly < Polynomial > {
30
31
PolyModPoly :: < Polynomial > {
31
- poly : & ( & self . poly * & other. poly ) % & self . primitive ,
32
- primitive : self . primitive . clone ( )
32
+ poly : & ( & self . poly * & other. poly ) % & self . prime ,
33
+ prime : self . prime . clone ( )
33
34
}
34
35
}
35
36
}
36
37
37
38
pub struct GaloisField < Polynomial >
38
39
where Polynomial : PartialEq + Clone
39
40
{
40
- primitive : Polynomial
41
+ pub primitive : Polynomial ,
42
+ pub prime : Polynomial
41
43
}
42
44
impl < Polynomial > GaloisField < Polynomial >
43
45
where Polynomial : Clone + PartialEq ,
44
46
for < ' a > & ' a Polynomial : Rem < Output = Polynomial >
45
47
{
46
48
pub fn make_polynomial ( & self , poly : Polynomial ) -> PolyModPoly < Polynomial > {
47
49
PolyModPoly {
48
- poly : & poly % & self . primitive ,
49
- primitive : self . primitive . clone ( )
50
+ poly : & poly % & self . prime ,
51
+ prime : self . prime . clone ( )
50
52
}
51
53
}
52
54
}
@@ -60,18 +62,18 @@ mod tests {
60
62
fn test_addition_in_GF9 ( ) {
61
63
// Test that (x + 2) + (x + 1) = 2x
62
64
type Element = Polynomial < IntMod < 3 > > ;
63
- let primitive = Element :: from ( [ 2 , 2 , 1 ] . iter ( ) . map ( |& c| IntMod :: < 3 > :: from ( c) ) . collect :: < Vec < IntMod < 3 > > > ( ) ) ;
65
+ let prime = Element :: from ( [ 2 , 2 , 1 ] . iter ( ) . map ( |& c| IntMod :: < 3 > :: from ( c) ) . collect :: < Vec < IntMod < 3 > > > ( ) ) ;
64
66
let lhs = PolyModPoly :: < Element > {
65
67
poly : Element :: from ( [ 2 , 1 ] . iter ( ) . map ( |& c| IntMod :: < 3 > :: from ( c) ) . collect :: < Vec < IntMod < 3 > > > ( ) ) ,
66
- primitive : primitive . clone ( )
68
+ prime : prime . clone ( )
67
69
} ;
68
70
let rhs = PolyModPoly :: < Element > {
69
71
poly : Element :: from ( [ 1 , 1 ] . iter ( ) . map ( |& c| IntMod :: < 3 > :: from ( c) ) . collect :: < Vec < IntMod < 3 > > > ( ) ) ,
70
- primitive : primitive . clone ( )
72
+ prime : prime . clone ( )
71
73
} ;
72
74
let result = PolyModPoly :: < Element > {
73
75
poly : Element :: from ( [ 0 , 2 ] . iter ( ) . map ( |& c| IntMod :: < 3 > :: from ( c) ) . collect :: < Vec < IntMod < 3 > > > ( ) ) ,
74
- primitive : primitive . clone ( )
76
+ prime : prime . clone ( )
75
77
} ;
76
78
assert_eq ! ( & lhs + & rhs, result) ;
77
79
}
@@ -80,8 +82,10 @@ mod tests {
80
82
fn test_multiplication_in_GF9 ( ) {
81
83
// Test that (x + 2)(x + 1) = x
82
84
type Element = Polynomial < IntMod < 3 > > ;
83
- let primitive = Element :: from ( [ 2 , 2 , 1 ] . iter ( ) . map ( |& c| IntMod :: < 3 > :: from ( c) ) . collect :: < Vec < IntMod < 3 > > > ( ) ) ;
84
- let gf9 = GaloisField :: < Polynomial < IntMod < 3 > > > {
85
+ let prime = Element :: from ( [ 2 , 2 , 1 ] . iter ( ) . map ( |& c| IntMod :: < 3 > :: from ( c) ) . collect :: < Vec < IntMod < 3 > > > ( ) ) ;
86
+ let primitive = Element :: from ( vec ! [ IntMod :: <3 >:: from( 0 ) , IntMod :: <3 >:: from( 1 ) ] ) ;
87
+ let gf9 = GaloisField :: < Element > {
88
+ prime,
85
89
primitive
86
90
} ;
87
91
let lhs = gf9. make_polynomial ( Element :: from ( [ 2 , 1 ] . iter ( ) . map ( |& c| IntMod :: < 3 > :: from ( c) ) . collect :: < Vec < IntMod < 3 > > > ( ) ) ) ;
0 commit comments