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.
