factorization algorithm
zhuny opened this issue · comments
Jihun Yang commented
let's implement this! https://en.m.wikipedia.org/wiki/Quadratic_sieve
Jihun Yang commented
algebra/algebra/polynomial/polynomial.py
Lines 168 to 201 in 1b92cc2
def factorize(self) -> List['Polynomial']: | |
if self.degree < 2: | |
return [self] | |
degree = max(self.body, default=0) | |
many = degree // 2 | |
value = [ | |
( | |
i, | |
(v := int(self(i))), | |
divisor_function(abs(v)) * 2 if v != 0 else 1 | |
) | |
for i in range(-100, 100) | |
] | |
value.sort(key=itemgetter(2, 1, 0)) | |
picked = value[:many] | |
picked_factor = [self._num_factor(v[1]) for v in picked] | |
checker = value[many] | |
for each_value in itertools.product(*picked_factor): | |
poly: Polynomial = Polynomial.from_map({ | |
x[0]: z | |
for x, z in zip(picked, each_value) | |
}) | |
if poly.degree > 0 and poly.is_integer_coefficient(): | |
if poly[poly.degree] < 0: | |
poly = -poly | |
if self._check_this_value(checker[1], poly(checker[0])): | |
q, r = divmod(self, poly) | |
if r == 0: | |
return poly.factorize() + q.factorize() | |
return [self] |
- 일단 지금은 classic한 방법을 사용해서 구현..
- https://en.wikipedia.org/wiki/Factorization_of_polynomials#Classical_methods