GSoC First Week
Previously, I was working on the PR for FiniteSet
implementation.
I managed to get it merged this week. So, now we have UniversalSet
, EmptySet
, Interval
and FiniteSet
implementation in SymEngine.
Where in FiniteSet
we have a set_basic
which can contain any Basic
object. That is apart from Number
objects we can have Symbol
objects as well, and even an Expression
.
Then I started working on implementing FiniteField
. I have sent this PR. Initially I was using std::map<unsigned, int>
as the type
for dict_
and int
type for modulo_
, but I realized that there are already inverse
function written for integer_class
/mpz
, so I changed the dict_
to std::map<unsigned, integer_class>
and modulo_
to integer_class
.
While implementing this, I thought of writing tests after doing the whole implementation. And when I wrote the tests, I realized how badly I had done the implementation, like missing corner cases and all. It is always a better practice to write tests parallely with your implementation.
So, As of now I have implemented the following functions:
gf_add_ground(const integer_class a)
gf_sub_ground(const integer_class a)
gf_mul_ground(const integer_class a)
gf_quo_ground(const integer_class a)
gf_add(const RCP<const GaloisField> &o)
gf_sub(const RCP<const GaloisField> &o)
gf_mul(const RCP<const GaloisField> &o)
Where gf_*_ground
does the operation represented by *
by the integer a
to the polynomaial in the given field.
And gf_add
, gf_sub
, gf_mul
do their respective operation with another polynomial in the finite field.
I will be implementing gf_div
this weekend.