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 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 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: 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 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 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 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 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 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 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 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 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)
def test5(self): """Check distinct degree factorization of a equal degree polynomial over F5 """ f5 = PrimeField(5) p1 = f5.polynomial(2, 0, 1) p2 = f5.polynomial(1, 1, 1) p = p1 * p2 factors = factorize(p).distinct_degree() self.assertTrue(len(factors) == 1) self.assertTrue(factors[0].value == p)
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 test2(self): """Check full factorization over F5 """ f5 = PrimeField(5) p = f5.polynomial(1, 2, 0, 2, -1, 1) try: factors, c = factorize(p).cantor_zassenhaus() self.assertTrue(c == f5(1)) self.assertTrue(factorize(p).factors_product(factors) == p) except RuntimeError as e: self.skipTest(f'Non-deterministic factorization failed: {e}')
def test8(self): """Parser check of internal state automaton '(j+)X' is an invalid expression """ expr = '(j+)X' f2 = PrimeField(2) p = f2.polynomial(1, 1, 1) f4 = FiniteField(2, 2, p) with self.assertRaises(SyntaxError): symbolic_polynomial(expr, f4)
def test5(self): """Check equal degree factorization over F2: parameter mismatch """ f2 = PrimeField(2) p = f2.polynomial(1, 1, 1) # bad parameters with self.assertRaises(RuntimeError) as a_exc: _ = factorize(p).equal_degree(2, 1) self.assertEqual(str(a_exc.exception), 'unable to find 2 degree 1 factors for 1 + X + X^2')
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 testF4Str(self): """Check printable representation of a polynomial over F4 """ f2 = PrimeField(2) p_gen = f2.polynomial(1, 1, 1) f4 = FiniteField(2, 2, p_gen) p = f4.polynomial(f4(0, 1), f4(1, 0), f4(1, 1)) self.assertTrue(str(p) == '(j) + X + (1+j)X^2') p *= f4(0, 1) self.assertTrue(str(p) == '(1+j) + (j)X + X^2')
def testPrimeAndFinite(self): """Checking correct transtyping int, PFElement to FFElement for + and - in F9 """ f3 = PrimeField(3) f9 = FiniteField(3, 2, f3.polynomial(-1, 1, 1)) self.assertTrue(f9(1, 0) + 1 == f3(-1)) self.assertTrue(1 + f3(1) == f9(-1, 0)) self.assertTrue(f9(-1, 0) == -1) self.assertTrue(3 * f9(-1, 0) == f9(-1, 0) * 3) self.assertTrue(f3(1) * f9(1, 1) == f3(1) + f9(0, 1))
def test1(self): """Check return type of power in F4 and F2 """ f2 = PrimeField(2) f4 = FiniteField(2, 2, f2.polynomial(1, 1, 1)) b = f4(0, 1)**0 self.assertIsInstance(b, FFElement) self.assertTrue(b == 1) b = f2(1)**0 self.assertIsInstance(b, PFElement) self.assertTrue(b == 1)
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 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 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 testF8Add(self): """Check addition of polynomials over F8 """ f2 = PrimeField(2) p = f2.polynomial(1, 1, 0, 1) f8 = FiniteField(2, 3, p, root_symbol='w') a = symbolic_polynomial('1 + X + (1+w^2)X^3', f8) b = symbolic_polynomial('(1+w)X^2 + X^3', f8) self.assertEqual(b.trailing, FFElement(f8, (1, 1, 0))) self.assertTrue(a + b == f8.polynomial(1, 1, f8(1, 1, 0), f8(0, 0, 1)))
def test6(self): """Check equal degree factorization over F2: non square free polynomial """ f2 = PrimeField(2) p = f2.polynomial(1, 1) p **= 3 # non square-free polynomial with self.assertRaises(RuntimeError) as a_exc: _ = factorize(p).equal_degree(3, 1) self.assertEqual( str(a_exc.exception), 'unable to find 3 degree 1 factors for 1 + X + X^2 + X^3')