-
Notifications
You must be signed in to change notification settings - Fork 4
/
FFElement.hpp
115 lines (102 loc) · 2.83 KB
/
FFElement.hpp
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
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
#ifndef FFELEMENT_HPP
#define FFELEMENT_HPP
#include <ostream>
using namespace std;
template<int P>
class FFElement
{
public:
FFElement() : val(0){};
FFElement(const FFElement<P>& elem) : val(elem.val){};
explicit FFElement(int v)
{
setValue(v);
}
// Negation and Equivalency Operators
FFElement operator-() const
{
return FFElement(-val);
}
FFElement& operator=(int i)
{
setValue(i);
return *this;
}
FFElement<P>& operator=(const FFElement<P>& rhs)
{
val = rhs.val;
return *this;
}
FFElement<P>& operator*=(const FFElement<P>& rhs)
{
val = (val * rhs.val) % P;
return *this;
}
friend bool operator==(const FFElement<P>& lhs, const FFElement<P>& rhs)
{
return (lhs.val == rhs.val);
}
friend bool operator==(const FFElement<P>& lhs, int rhs)
{
return (lhs.val == rhs);
}
friend bool operator!=(const FFElement<P>& lhs, int rhs)
{
return (lhs.val != rhs);
}
// Arithmetic Operators
//Subtraction
friend FFElement<P> operator-(const FFElement<P>& lhs, const FFElement<P>& rhs)
{
return FFElement<P>(lhs.val - rhs.val);
}
// Addition
friend FFElement<P> operator+(const FFElement<P>& lhs, const FFElement<P>& rhs)
{
return FFElement<P>(lhs.val + rhs.val);
}
friend FFElement<P> operator+(const FFElement<P>& lhs, int i)
{
return FFElement<P>(lhs.val + i);
}
friend FFElement<P> operator+(int i, const FFElement<P>& rhs)
{
return FFElement<P>(rhs.val + i);
}
// Multiplication
friend FFElement<P> operator*(int n, const FFElement<P>& rhs)
{
return FFElement<P>(n * rhs.val);
}
friend FFElement<P> operator*(const FFElement<P>& lhs, const FFElement<P>& rhs)
{
return FFElement<P>(lhs.val * rhs.val);
}
// Division
friend FFElement<P> operator/(const FFElement<P>& lhs, const FFElement<P>& rhs)
{
return FFElement<P>(lhs.val * FFUtil::modInverse(rhs.val, P));
}
int value() const
{
return val;
}
// Stream Handler
template<int T>
friend ostream& operator<<(ostream& o, const FFElement<T>& e)
{
return o << e.val;
}
private:
int val;
void setValue(int v)
{
val = v;
if(v < 0)
{
val = (v % P) + 2 * P;
}
val = val % P;
}
};
#endif // FFELEMENT_HPP