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)
Example #3
0
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())
Example #4
0
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