def testPrimeAndPolynomial(self): """Checking correct transtyping int to Polynomial for + and == in F2 """ f2 = PrimeField(2) p = f2.polynomial(1, 1, 1) self.assertTrue(p + 1 == f2.polynomial(0, 1, 1)) self.assertTrue(p.monic(0) + 1 == 0)
def test3(self): """Check: irreducibility over F3, medium degree (>2) """ f3 = PrimeField(3) p = f3.polynomial(-1, -1, -1, 1) self.assertIsIrreducible(p) p = f3.polynomial(1, 1, 1, 1) self.assertIsNotIrreducible(p)
def test2(self): """Check: irreducibility over F3, low degree (<3) """ f3 = PrimeField(3) p = f3.polynomial(-1, 1, 1) self.assertIsIrreducible(p) p = f3.polynomial(1, 1, 1) self.assertIsNotIrreducible(p)
def test6(self): """Check: irreduciblity over F3, performances for very high degree (>800) """ f3 = PrimeField(3) p0 = f3.polynomial(1, 0, 1, 0, 1, 0, 0, 0, 1) p1 = f3.polynomial(-1, 0, 0, 0, 1, 0, 0, -1, 1) p2 = f3.polynomial(1, 0, 0, 0, 1, -1, 0, 0, 0, 0, 0, 0, 0, 1) p = p0 * p1 * p2 self.assertIsNotIrreducible(p)
def test3(self): """Check distinct degree factorization of a square free equal degree polynomial over F3 """ f3 = PrimeField(3) p1 = f3.polynomial(1, 1) p2 = f3.polynomial(-1, 1) p = p1 * p2 # square free equal degree factors = factorize(p).distinct_degree() self.assertTrue(len(factors) == 1) self.assertTrue(factors[0].value == p)
def test7(self): """Check square free factorization of a quadratic polynomial over F2 """ f5 = PrimeField(5) p = f5.polynomial(1, 1)**2 * f5.polynomial(2, 1) sqf, factors = factorize(p).square_free() self.assertTrue(sqf == f5.polynomial(2, 1)) self.assertTrue(len(factors) == 1) fact = factors[0] self.assertTrue(fact.multiplicity == 2) self.assertTrue(fact.value == f5.polynomial(1, 1))
def test8(self): """Check square free factorization of a cubic polynomial over F3 """ f3 = PrimeField(3) p = f3.polynomial(1, 1)**3 * f3.polynomial(-1, 1) sqf, factors = factorize(p).square_free() self.assertTrue(sqf == f3.polynomial(-1, 1)) self.assertTrue(len(factors) == 1) fact = factors[0] self.assertTrue(fact.multiplicity == 3) self.assertTrue(fact.value == f3.polynomial(1, 1))
def test2(self): """Check square free factorization over F2 """ f2 = PrimeField(2) p1 = f2.polynomial(1, 0, 1, 0, 1) sqf, factors = factorize(p1).square_free() self.assertTrue(sqf.is_unit) self.assertTrue(len(factors) == 1) self.assertTrue(factors[0].multiplicity == 2) self.assertTrue(factors[0].value == f2.polynomial(1, 1, 1))
def test6(self): """Check distinct degree factorization over F5 """ f5 = PrimeField(5) p1 = f5.polynomial(2, 0, 1) p2 = f5.polynomial(1, 1, 0, 1) p = p1 * p2 factors = factorize(p).distinct_degree() self.assertTrue(len(factors) == 2) self.assertTrue(factors[0].max_degree == factors[0].value.degree) self.assertTrue(factors[1].max_degree == factors[1].value.degree)
def test1(self): """Check distinct degree factorization over F2 """ f2 = PrimeField(2) p0 = f2.polynomial(1, 1) p1 = f2.polynomial(1, 1, 1) p = p0 * p1 factors = factorize(p).distinct_degree() self.assertTrue(all([f.is_irreducible for f in factors])) self.assertTrue(len(factors) == 2) self.assertTrue(p == factors[0].value * factors[1].value)
def test5(self): """Check square free factorization over F3 """ f3 = PrimeField(3) p0 = f3.polynomial(1, -1, 0, 0, -1, 0, 0, 1, 1) p1 = f3.polynomial(-1, 1, -1, -1, 1) self.assertTrue(p0.is_irreducible and p1.is_irreducible) p = p0 * p1 sqf, factors = factorize(p).square_free() self.assertTrue(len(factors) == 0) self.assertTrue(sqf == p)
def test4(self): """Check: irreducibility over F3, high degree (>6) """ f3 = PrimeField(3) p1 = f3.polynomial(1, 0, 1) p2 = f3.polynomial(-1, 1, 1) p3 = f3.polynomial(-1, -1, 1) p = p1 * p2 * p3 self.assertIsNotIrreducible(p) p = p**4 self.assertIsNotIrreducible(p)
def test3(self): """Check square free factorization of a quadratic polynomial over F2 """ f2 = PrimeField(2) p1 = f2.polynomial(1, 1, 1, 1, 1, 1) sqf, factors = factorize(p1).square_free() self.assertTrue(sqf == f2.polynomial(1, 1)) self.assertTrue(len(factors) == 1) self.assertTrue(factors[0].value.is_irreducible) self.assertTrue(factors[0].multiplicity == 2) self.assertTrue(factors[0].value**2 * sqf == p1)
def test4(self): """Check distinct degree factorization over F3 """ f3 = PrimeField(3) p1 = f3.polynomial(1, 1) p2 = f3.polynomial(-1, 1, 1) p = p1 * p2 factors = factorize(p).distinct_degree() self.assertTrue(len(factors) == 2) self.assertTrue(all([f.is_irreducible for f in factors])) self.assertTrue(factors[0].value * factors[1].value == p) self.assertTrue(factors[0].value.degree != factors[1].value.degree)
def test1(self): """Check: irreducibility over F2 """ f2 = PrimeField(2) p = f2.polynomial(1, 1, 1) self.assertIsIrreducible(p) p = f2.polynomial(1, 1) self.assertIsIrreducible(p) p = f2.polynomial(1, 0, 1) self.assertEqual(p, f2.polynomial(1, 1)**2) self.assertIsNotIrreducible(p)
def test4(self): """Check equal degree factorization over F3: parameter mismatch """ f3 = PrimeField(3) p1 = f3.polynomial(-1, 1, 1) p2 = f3.polynomial(1, 0, 1) p = p1 * p2 with self.assertRaises(AssertionError) as a_exc: _ = factorize(p).equal_degree(nb_factors=3, max_degree=2) self.assertEqual( str(a_exc.exception), f'Degree of {str(p)} mismatches input parameters 3, 2')
def test1(self): """Check equal degree factorization over F5 (non-deterministic, might be skipped) """ f5 = PrimeField(5) p = f5.polynomial(1, 1) * f5.polynomial(2, 1) try: factors = factorize(p).equal_degree(nb_factors=2, max_degree=1) self.assertTrue(len(factors) == 2) self.assertTrue(all([f.value.degree == 1 for f in factors])) self.assertTrue(factors[0].value * factors[1].value == p) except RuntimeError as e: self.skipTest(f'Non-deterministic factorization failed: {e}')
def test4(self): """Check square free factorization of a cubic polynomial over F2 """ f2 = PrimeField(2) p0 = f2.polynomial(1, 1, 1) p0 **= 3 p0 *= f2.polynomial(1, 1) p1 = p0.copy sqf, factors = factorize(p1).square_free() self.assertTrue(sqf == f2.polynomial(1, 1)) self.assertTrue(sqf.is_irreducible) self.assertTrue(len(factors) == 1) self.assertTrue(factors[0].value == f2.polynomial(1, 1, 1) and factors[0].multiplicity == 3)
def test1(self): """Check full factorization over F3 """ f3 = PrimeField(3) c0 = f3.polynomial(1, 1) # irred deg 1 c1 = f3.polynomial(0, 0, 1) # trivial square c2 = f3.polynomial(-1, 1)**3 c3 = f3.polynomial(-1, 1, 1) p = c0 * c1 * c2 * c3 factors, c = factorize(p).cantor_zassenhaus() self.assertTrue(c == 1) self.assertTrue(len(factors) == 4) self.assertEqual(factorize(p).factors_product(factors), p)
def test6(self): """Check square free factorization over F5 """ f5 = PrimeField(5) p = f5.polynomial(-1, 2, 1, 1) sqf, factors = factorize(p).square_free() self.assertTrue(sqf == p)
def test3(self): """Check equal degree factorization over F3 (non-deterministic, might be skipped) """ f3 = PrimeField(3) p1 = f3.polynomial(-1, 1, 1) p2 = f3.polynomial(1, 0, 1) p = p1 * p2 try: factors = factorize(p).equal_degree(nb_factors=2, max_degree=2) self.assertTrue(len(factors) == 2) self.assertTrue(all([f.value.degree == 2 for f in factors])) self.assertTrue(factors[0].value * factors[1].value == p) except RuntimeError as e: self.skipTest(f'Non-deterministic factorization failed: {e}')
def test5(self): """Check: printable representation over a prime field """ f2 = PrimeField(2) p = f2.polynomial(1) p += p.monic(3) p += p.monic(32) self.assertEqual(str(p), '1 + X^3 + X^32') self.assertIsNotIrreducible(p)
def test2(self): """Check distinct degree factorization of a non square free polynomial over F2 """ f2 = PrimeField(2) p = f2.polynomial(1, 0, 1) # non square free factors = factorize(p).distinct_degree() self.assertTrue(all([f.is_irreducible for f in factors])) self.assertTrue(len(factors) == 2) self.assertTrue(p == factors[0].value * factors[1].value) self.assertTrue(factors[0].value == factors[1].value)
def test1(self): """Parser test over F4 """ f2 = PrimeField(2) f4 = FiniteField(2, 2, f2.polynomial(1, 1, 1)) expr = '+(j+1)X + (1+j)X^2 + (j)' p = symbolic_polynomial(expr, f4) self.assertTrue(p == f4.polynomial(f4(0, 1), f4(1, 1), f4(1, 1)))
def test4(self): """Parser test for a linear polynomial over the finite field of order 8 """ expr = '-(1+w+w^2) + X' f2 = PrimeField(2) g = f2.polynomial(1, 1, 0, 1) f8 = FiniteField(2, 3, g, root_symbol='w') p = symbolic_polynomial(expr, f8) self.assertTrue(p == f8.polynomial(f8(1, 1, 1), 1))
def testF25Repr(self): """Check equivalence of symbolic representation and printable representation of a polynomial over F25 """ f5 = PrimeField(5) f25 = FiniteField(5, 2, f5.polynomial(2, 0, 1)) p = symbolic_polynomial('(1+j)X^2 + (j)X^5 + X + 2X^3 + (2+j)', f25) self.assertEqual( p, eval(repr(f25.polynomial(f25(2, 1), 1, f25(1, 1), 2, 0, f25(0, 1)))))
def test7(self): """Check equal degree factorization over F3: non equal degree Raises most of the time but due to the non-deterministic nature of the Cantor-Zassenhaus algorithm, it might find a factor anyway """ f3 = PrimeField(3) p1 = f3.polynomial(1, 1) p2 = f3.polynomial(1, -1, 0, 1) p = p1 * p2 try: factors = factorize(p).equal_degree(2, 2) self.assertTrue(len(factors) == 2) self.assertTrue(factors[0].value.degree + factors[1].value.degree == p.degree) except RuntimeError as exc: self.assertEqual( str(exc), 'unable to find 2 degree 2 factors for 1 - X^2 + X^3 + X^4')
def testF16gcd(self): """Check GCD of polynomials over F16 """ f2 = PrimeField(2) p = f2.polynomial(1, 1, 0, 0, 1) f16 = FiniteField(2, 4, p) a = symbolic_polynomial('X^6 + X^3 + 1', f16) b = symbolic_polynomial('X^3 + 1', f16) self.assertEqual(gcd(a, b), f16.polynomial(1))
def testF9Product(self): """Check product of polynomials over F9 """ f3 = PrimeField(3) p = f3.polynomial(1, 0, 1) f9 = FiniteField(3, 2, p) a = symbolic_polynomial('-1 + X - (1+j)X^2', f9) b = symbolic_polynomial('1 + X^2 + (j)X', f9) self.assertTrue( a * b == f9.polynomial(-1, f9(1, -1), 1, f9(-1, -1), f9(-1, -1)))
def test1(self): """Check square free factorization of an irreducible polynomial over F2 """ f2 = PrimeField(2) p1 = f2.polynomial(1, 0, 1, 1) sqf, factors = factorize(p1).square_free() self.assertTrue(len(factors) == 0) self.assertTrue(sqf.is_irreducible) self.assertTrue(sqf == p1)