示例#1
0
    def test4(self):
        """Check full factorization over F3, non monic
        """
        f3 = PrimeField(3)
        p = symbolic_polynomial('-X^3 - X^2 + X + 1', f3)

        factors, c = factorize(p).cantor_zassenhaus()
        self.assertTrue(factorize(p).factors_product(factors) * c == p)
示例#2
0
    def test5(self):
        """Check full factorization over F7, non monic
        """
        f7 = PrimeField(7)
        p = symbolic_polynomial('-3X^3 - 2X^2 + X + 3', f7)

        factors, c = factorize(p).cantor_zassenhaus()
        self.assertTrue(factorize(p).factors_product(factors) * c == p)
示例#3
0
    def test3(self):
        """Check full factorization over F2, square of degree 8
        """
        f2 = PrimeField(2)
        p = symbolic_polynomial('1 + X^2 + X^4 + X^8', f2)

        factors, c = factorize(p).cantor_zassenhaus()
        self.assertTrue(c == 1)
        self.assertTrue(len(factors) == 2)
        self.assertTrue(factorize(p).factors_product(factors) == p)
示例#4
0
    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}')
示例#5
0
    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)
示例#6
0
    def testFiniteFieldF4(self):
        """Check full Cantor-Zassenhaus factorization over F4
        """
        f4 = finite_field(4)

        p1 = f4.polynomial(1, f4(1, 1), 1)
        p2 = f4.polynomial(1, f4(1, 1), 0, 1)
        p3 = f4.polynomial(f4(0, 1), 1)**2
        p4 = f4.polynomial(f4(0, 1), 1, f4(0, 1), 0, f4(1, 1)) / f4(1, 1)

        ps = [p1, p2, p3, p4]

        for p in ps:
            with self.subTest(f'Testing factorizing {str(p)}'):
                factors, c = factorize(p).cantor_zassenhaus()
                self.assertTrue(p == factorize(p).factors_product(factors) * c)
示例#7
0
 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)
示例#8
0
    def testFiniteFieldF9(self):
        """Check full Cantor-Zassenhaus factorization over F9
        """
        f9 = finite_field(9)

        p1 = f9.polynomial(1, f9(1, 1), 1)
        p2 = f9.polynomial(1, f9(1, 1), 0, 1)
        p3 = f9.polynomial(f9(0, 1), 1)**2
        p4 = f9.polynomial(f9(0, 1), 1, f9(0, 1), 0, f9(1, 1)) / f9(1, 1)
        p5 = f9.polynomial(f9(-1, 1), f9(1, -1), 1)**3

        ps = [p1, p2, p3, p4, p5]

        for p in ps:
            with self.subTest(f'Testing factorizing {str(p)}'):
                factors, c = factorize(p).cantor_zassenhaus()
                self.assertTrue(p == factorize(p).factors_product(factors) * c)
示例#9
0
 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)
示例#10
0
 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)
示例#11
0
    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)
示例#12
0
 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))
示例#13
0
    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)
示例#14
0
 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))
示例#15
0
    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)
示例#16
0
    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')
示例#17
0
    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))
示例#18
0
    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)
示例#19
0
    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)
示例#20
0
 def test9(self):
     """Check square free factorization of a polynomial of degree 9 over F3
     """
     f3 = PrimeField(3)
     p = f3.polynomial(-1, 1)**3 * f3.polynomial(1, 1)**2 * f3.polynomial(
         -1, 1, 1)
     sqf, factors = factorize(p).square_free()
     self.assertTrue(sqf == f3.polynomial(-1, 1, 1))
     self.assertTrue(len(factors) == 2)
     for fct in factors:
         self.assertTrue(
             fct.multiplicity == 2 and fct.value == f3.polynomial(1, 1)
             or fct.multiplicity == 3 and fct.value == f3.polynomial(-1, 1))
示例#21
0
    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)
示例#22
0
    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)
示例#23
0
    def test2(self):
        """Check equal degree factorization over F2
        (non-deterministic, might be skipped)
        """
        f2 = PrimeField(2)
        p = f2.polynomial(0, 1, 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}')
示例#24
0
    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')
示例#25
0
    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')
示例#26
0
    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)
示例#27
0
    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}')
示例#28
0
    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')
示例#29
0
    def test7(self):
        """Check distinct degree factorization over F5 with:
        - two irreducible factors of the same degree
        - one irreducible factor of distinct degree
        """
        f5 = PrimeField(5)
        p1 = f5.polynomial(2, 0, 1)
        p2 = f5.polynomial(1, -1, 1)
        p3 = f5.polynomial(1, 1, 0, 1)
        p = p1 * p2 * p3

        factors = factorize(p).distinct_degree()
        self.assertTrue(len(factors) == 2)

        fdeg4 = [f for f in factors if f.max_degree == 2][0]
        fdeg3 = [f for f in factors if f.max_degree == 3][0]

        self.assertTrue(fdeg4.value.degree == 2 * fdeg4.max_degree == 4)
        self.assertTrue(fdeg3.value.degree == fdeg3.max_degree == 3)

        self.assertTrue(fdeg4.value == p1 * p2)
        self.assertTrue(fdeg3.value == p3)
示例#30
0
 def test1(self):
     f7 = PrimeField(7)
     f = factorize(f7.polynomial(0))
     self.assertEqual(f.factors_product([]), f7.zero)