summaryrefslogtreecommitdiff
path: root/macros/luatex/latex/luacas/tex/test/polynomials/polynomialmod.lua
blob: 1906ad2d72a62588e393fe678cb3c2a0f7c1baeb (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
local a = PolynomialRing({IntegerModN(Integer(1), Integer(11)),
                        IntegerModN(Integer(6), Integer(11)),
                        IntegerModN(Integer(1), Integer(11)),
                        IntegerModN(Integer(9), Integer(11)),
                        IntegerModN(Integer(1), Integer(11))}, "y")

local b = PolynomialRing({IntegerModN(Integer(7), Integer(11)),
                        IntegerModN(Integer(7), Integer(11)),
                        IntegerModN(Integer(6), Integer(11)),
                        IntegerModN(Integer(2), Integer(11)),
                        IntegerModN(Integer(1), Integer(11))}, "y")

local q = PolynomialRing({IntegerModN(Integer(2), Integer(13)),
                            IntegerModN(Integer(6), Integer(13)),
                            IntegerModN(Integer(4), Integer(13))}, "z")

local p = PolynomialRing({IntegerModN(Integer(4), Integer(13)),
                    IntegerModN(Integer(11), Integer(13)),
                    IntegerModN(Integer(1), Integer(13)),
                    IntegerModN(Integer(12), Integer(13)),
                    IntegerModN(Integer(1), Integer(13))}, "x")

local r = PolynomialRing({IntegerModN(Integer(1), Integer(3)),
                    IntegerModN(Integer(0), Integer(3)),
                    IntegerModN(Integer(0), Integer(3)),
                    IntegerModN(Integer(2), Integer(3)),
                    IntegerModN(Integer(0), Integer(3)),
                    IntegerModN(Integer(0), Integer(3)),
                    IntegerModN(Integer(1), Integer(3))}, "x")

local s = PolynomialRing({IntegerModN(Integer(1), Integer(5)),
                    IntegerModN(Integer(1), Integer(5)),
                    IntegerModN(Integer(1), Integer(5)),
                    IntegerModN(Integer(1), Integer(5)),
                    IntegerModN(Integer(1), Integer(5))}, "x")

local t = PolynomialRing({IntegerModN(Integer(1), Integer(7))}, "x"):multiplyDegree(7) - PolynomialRing({IntegerModN(Integer(1), Integer(7))}, "x"):multiplyDegree(1)

local u = PolynomialRing({IntegerModN(Integer(1), Integer(13)),
                        IntegerModN(Integer(5), Integer(13)),
                        IntegerModN(Integer(6), Integer(13)),
                        IntegerModN(Integer(5), Integer(13)),
                        IntegerModN(Integer(1), Integer(13))}, "x")

local v = PolynomialRing({IntegerModN(Integer(24), Integer(7)),
                            IntegerModN(Integer(50), Integer(7)),
                            IntegerModN(Integer(59), Integer(7)),
                            IntegerModN(Integer(60), Integer(7)),
                            IntegerModN(Integer(36), Integer(7)),
                            IntegerModN(Integer(10), Integer(7)),
                            IntegerModN(Integer(1), Integer(7))}, "z")

starttest("modular polynomial operations")
testeq(q*q, "3z^4+9z^3+0z^2+11z^1+4z^0")
testeq(PolynomialRing.gcd(a, b), "1y^0")
local Q, R, S = PolynomialRing.extendedgcd(a, b)
testeq(Q, "1y^0")
testeq(R, "4y^3+5y^2+1y^1+3y^0")
testeq(S, "7y^3+0y^2+7y^1+6y^0")
endtest()

starttest("modular square free factoring")
testeq(p:squarefreefactorization(), Integer(1) * BinaryOperation.POWEXP({(PolynomialRing({Integer(2), Integer(6), Integer(1)}, SymbolExpression("x"))), Integer(2)}))
testeq(r:squarefreefactorization(), Integer(1) * BinaryOperation.POWEXP({(PolynomialRing({Integer(1), Integer(0), Integer(0), Integer(1)}, SymbolExpression("x"))), Integer(2)}))
testeq(q:squarefreefactorization(), Integer(4) * BinaryOperation.POWEXP({(PolynomialRing({Integer(7), Integer(8), Integer(1)}, SymbolExpression("z"))), Integer(1)}))
testeq(s:squarefreefactorization(), Integer(1) * BinaryOperation.POWEXP({(PolynomialRing({Integer(4), Integer(1)}, SymbolExpression("x"))), Integer(4)}))
endtest()

starttest("modular polynomial factoring")
testeq(q:factor(), BinaryOperation.MULEXP({Integer(4), BinaryOperation.POWEXP({PolynomialRing({Integer(7), Integer(1)}, SymbolExpression("z")), Integer(1)}), BinaryOperation.POWEXP({PolynomialRing({Integer(1), Integer(1)}, SymbolExpression("z")), Integer(1)})}), q)
testeq(p:factor(), Integer(1) * BinaryOperation.POWEXP({PolynomialRing({Integer(2), Integer(6), Integer(1)}, SymbolExpression("x")), Integer(2)}), p)
testeq(r:factor(), Integer(1) * BinaryOperation.POWEXP({(PolynomialRing({Integer(1), Integer(0), Integer(0), Integer(1)}, SymbolExpression("x"))), Integer(2)}), r)
testeq(t:factor(), BinaryOperation.MULEXP({Integer(1), BinaryOperation.POWEXP({PolynomialRing({Integer(0), Integer(1)}, SymbolExpression("x")), Integer(1)}), BinaryOperation.POWEXP({PolynomialRing({Integer(6), Integer(1)}, SymbolExpression("x")), Integer(1)}), BinaryOperation.POWEXP({PolynomialRing({Integer(5), Integer(1)}, SymbolExpression("x")), Integer(1)}), BinaryOperation.POWEXP({PolynomialRing({Integer(4), Integer(1)}, SymbolExpression("x")), Integer(1)}), BinaryOperation.POWEXP({PolynomialRing({Integer(3), Integer(1)}, SymbolExpression("x")), Integer(1)}), BinaryOperation.POWEXP({PolynomialRing({Integer(2), Integer(1)}, SymbolExpression("x")), Integer(1)}), BinaryOperation.POWEXP({PolynomialRing({Integer(1), Integer(1)}, SymbolExpression("x")), Integer(1)})}), t)
testeq(u:factor(), BinaryOperation.MULEXP({Integer(1), BinaryOperation.POWEXP({PolynomialRing({Integer(11), Integer(1)}, SymbolExpression("x")), Integer(1)}), BinaryOperation.POWEXP({PolynomialRing({Integer(10), Integer(1)}, SymbolExpression("x")), Integer(1)}), BinaryOperation.POWEXP({PolynomialRing({Integer(6), Integer(1)}, SymbolExpression("x")), Integer(1)}), BinaryOperation.POWEXP({PolynomialRing({Integer(4), Integer(1)}, SymbolExpression("x")), Integer(1)})}), u)
testeq(v:factor(), BinaryOperation.MULEXP({Integer(1), BinaryOperation.POWEXP({PolynomialRing({Integer(1), Integer(1)}, SymbolExpression("z")), Integer(1)}), BinaryOperation.POWEXP({PolynomialRing({Integer(2), Integer(1)}, SymbolExpression("z")), Integer(1)}), BinaryOperation.POWEXP({PolynomialRing({Integer(1), Integer(0), Integer(1)}, SymbolExpression("z")), Integer(1)}), BinaryOperation.POWEXP({PolynomialRing({Integer(4), Integer(1)}, SymbolExpression("z")), Integer(1)}), BinaryOperation.POWEXP({PolynomialRing({Integer(3), Integer(1)}, SymbolExpression("z")), Integer(1)})}), v)
endtest()