def test_eisenstein(self): criterion = EisensteinCriterion() result, context = criterion.check(create_polynomial("x^2+2x+2")) self.assertEqual(IRREDUCIBLE, result) self.assertEqual({"p": 2}, context) result, _ = criterion.check(create_polynomial("x^2+2x+1")) self.assertNotEqual(IRREDUCIBLE, result)
def test_perron(self): criterion = PerronCriterion() result, context = criterion.check(create_polynomial("x^2+3x+1")) self.assertEqual(IRREDUCIBLE, result) self.assertEqual(None, context) result, _ = criterion.check(create_polynomial("x^2+2x+1")) self.assertNotEqual(IRREDUCIBLE, result)
from irreduc_types import IRREDUCIBLE, UNKNOWN class MurtyCriterion: def __init__(self, max_p=None): self.name = "Murty's irreducibility criterion" self.max_p = max_p def name(self): return self.name def check(self, f): # http://cms.dm.uba.ar/academico/materias/2docuat2011/teoria_de_numeros/Irreducible.pdf # Theorem 1 h = 0 for exp, coeff in poly_non_zero_exps(f): if exp != f.degree(): h = max(h, abs(coeff / f.LC())) nmin = int(math.ceil(h + 2)) for n in range(nmin, nmin + 5): val = f.eval(n) if sympy.isprime(val) and (not self.max_p or val < self.max_p): return IRREDUCIBLE, {'n': n, 'p': val} return UNKNOWN, None if __name__ == '__main__': poly = create_polynomial(sys.argv[1]) check_common(poly, sys.argv[1], MurtyCriterion())
from criteria.galois_fields import GaloisFieldsCriterion from criteria.complex_roots import ComplexRootsCriterion, ComplexRootsCriterion2, ComplexRootsCriterion3 from criteria.levit import LevitCriterion from irreduc_utils import check_common # TODO: find On the irreducibility of polynomials taking small values by Tverberg H., 1973, should have nice criteria # TODO: checking if polynomial is attain just enough of (small) primes if __name__ == '__main__': import sys from irreduc_utils import create_polynomial input = sys.argv[1] poly = create_polynomial(input) polys = list() subs = True polys.append((poly, 1, 0, False)) if subs: # generate list of polynomials (including substitutions) to check on poly_reverted = sympy.Poly(reversed(poly.all_coeffs()), VAR_X) polys.append((poly_reverted, 1, 0, True)) #for a in (1,): for a in (-1, 1,): # we need to substitute only units... which in Z are just -1, +1 #for b in range(0,): for b in range(-5, 5 + 1): if a == 0 or (a == 1 and b == 0): continue