GSoC Ninth Week
Previous week I had implemented the Shoup’s Algorithm in this PR. During the review we came to realise that it is better to use unsigned int
instead of integer_class
because we didn’t need big numbers.
Working on the same PR, I found a bug in negate
and similar function where we were doing:
for (auto &a : dict_) {
a *= -1;
a += modulo_;
Here: if the dict_
is [0, 0, 10]
, it will negate to [11, 11, 1]
in GF(11)
. So, it was needed to add a check when the value is 0
. So, the method was changed to:
for (auto &a : dict_) {
a *= -1;
if (a != 0_z)
a += modulo_;
}
Along with it I was working on the gf_factor
PR and it eventually got merged. It introduced Zassenhaus’s algorithm and gf_factor()
function. In coming days, we will have to change gf_factor
to switch between gf_zassenhaus
and gf_shoup
according to the degree of polynomial.
We made one more design change, we changed the factor container from std::pair<GaloisFieldDict, integer_class>
to std::pair<GaloisFieldDict, unsigned>
because we didn’t need large numbers as power.
Then I started working on change of base class of GaloisField
class from UPolyBase
to UIntPolyBase
, this needed implementation of eval
and multi_eval
method, then I implemented the iterator for GaloisField
class and the pow
method. The PR is under review.