zhuny / algebra

대수학을 기반으로 algebraic mathematical object에 대한 특징을 계산합니다. (feat. Galois)

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

factorization algorithm

zhuny opened this issue · comments

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]