summaryrefslogtreecommitdiff
path: root/macros/luatex/latex/luacas/tex/test/polynomials/polynomial.lua
diff options
context:
space:
mode:
Diffstat (limited to 'macros/luatex/latex/luacas/tex/test/polynomials/polynomial.lua')
-rw-r--r--macros/luatex/latex/luacas/tex/test/polynomials/polynomial.lua153
1 files changed, 153 insertions, 0 deletions
diff --git a/macros/luatex/latex/luacas/tex/test/polynomials/polynomial.lua b/macros/luatex/latex/luacas/tex/test/polynomials/polynomial.lua
new file mode 100644
index 0000000000..545538c764
--- /dev/null
+++ b/macros/luatex/latex/luacas/tex/test/polynomials/polynomial.lua
@@ -0,0 +1,153 @@
+
+local a = PolynomialRing({
+ Integer(1),
+ Integer(2),
+ Integer(3),
+ Integer(4),
+ Integer(5)
+}, "x")
+
+local b = PolynomialRing({
+ Integer(1) / Integer(3),
+ Integer(1) / Integer(12),
+ Integer(6) / Integer(3),
+}, "x")
+
+local c = PolynomialRing({
+ Integer(12),
+ Integer(4)
+}, "x")
+
+local h = PolynomialRing({Integer(2), Integer(3), Integer(1)}, "x")
+local i = PolynomialRing({Integer(8), Integer(20), Integer(18), Integer(7), Integer(1)}, "x")
+local j = PolynomialRing({Integer(108), Integer(324), Integer(387), Integer(238), Integer(80), Integer(14), Integer(1)}, "x")
+local k = PolynomialRing({Integer(30), Integer(11), Integer(1)}, "x")
+local l = PolynomialRing({Integer(6), Integer(11), Integer(6), Integer(1)}, "z")
+local m = PolynomialRing({Integer(1), Integer(10), Integer(45), Integer(120), Integer(210), Integer(252), Integer(210), Integer(120), Integer(45), Integer(10), Integer(1)}, "x")
+local n = PolynomialRing({Integer(24), Integer(50), Integer(35), Integer(10), Integer(1), Integer(0), Integer(24), Integer(50), Integer(35), Integer(10), Integer(1)}, "x")
+local o = PolynomialRing({Integer(24), Integer(50), Integer(59), Integer(60), Integer(36), Integer(10), Integer(1)}, "x")
+local p = PolynomialRing({Integer(-110592), Integer(59904), Integer(-5760), Integer(720), Integer(-48), Integer(1)}, "x")
+
+local d = PolynomialRing({Integer(21), Integer(10), Integer(1)}, "x")
+local e = PolynomialRing({Integer(-6), Integer(1), Integer(1)}, "x")
+
+local f = PolynomialRing({Integer(-1), Integer(-2), Integer(15), Integer(36)}, "x")
+local g = PolynomialRing({Integer(1), Integer(7), Integer(15), Integer(9)}, "x")
+
+local q = PolynomialRing({Integer(3), Integer(-9), Integer(27), Integer(-36), Integer(36)}, "z")
+local r = PolynomialRing({Integer(0), Integer(0), Integer(0), Integer(0), Integer(0), Integer(0), Integer(4)}, "x");
+local s = PolynomialRing({Integer(1), Integer(0), Integer(-4), Integer(0), Integer(1)}, "x")
+
+local x = Integer(3)
+local y = Integer(-1) / Integer(6)
+
+local multia = PolynomialRing({Integer(4),
+ Integer(0),
+ PolynomialRing({Integer(0), Integer(0), Integer(-6)}, "y"),
+ PolynomialRing({Integer(1), Integer(3)}, "y")}, "x")
+local multib = PolynomialRing({PolynomialRing({Integer(0), Integer(6)}, "y"),
+ Integer(0),
+ PolynomialRing({Integer(-4), Integer(12)}, "y")}, "x")
+
+starttest("polynomial construction")
+testeq(a, "5x^4+4x^3+3x^2+2x^1+1x^0")
+testeq(a.degree, 4)
+testeq(b, "2x^2+1/12x^1+1/3x^0")
+testeq(b.degree, 2)
+testeq(multia, "(3y^1+1y^0)x^3+(-6y^2+0y^1+0y^0)x^2+(0)x^1+(4)x^0")
+testeq(multia.degree, 3)
+endtest()
+
+starttest("polynomial-expression conversion")
+testeq(a:tocompoundexpression():autosimplify():topolynomial(), a)
+testeq(b:tocompoundexpression():autosimplify():topolynomial(), b)
+testeq(c:tocompoundexpression():autosimplify():topolynomial(), c)
+endtest()
+
+starttest("polynomial arithmetic")
+testeq(a + a, "10x^4+8x^3+6x^2+4x^1+2x^0")
+testeq(a + b, "5x^4+4x^3+5x^2+25/12x^1+4/3x^0")
+testeq(b + a, "5x^4+4x^3+5x^2+25/12x^1+4/3x^0")
+testeq(a - a, "0x^0")
+testeq(a - b, "5x^4+4x^3+1x^2+23/12x^1+2/3x^0")
+testeq(b:multiplyDegree(4), "2x^6+1/12x^5+1/3x^4+0x^3+0x^2+0x^1+0x^0")
+testeq(a:multiplyDegree(12), "5x^16+4x^15+3x^14+2x^13+1x^12+0x^11+0x^10+0x^9+0x^8+0x^7+0x^6+0x^5+0x^4+0x^3+0x^2+0x^1+0x^0")
+testeq(c * c, "16x^2+96x^1+144x^0")
+testeq(a * c, "20x^5+76x^4+60x^3+44x^2+28x^1+12x^0")
+testeq(c * a, "20x^5+76x^4+60x^3+44x^2+28x^1+12x^0")
+testeq(b * c, "8x^3+73/3x^2+7/3x^1+4x^0")
+local qq, rr = a:divremainder(c)
+testeq(qq, "5/4x^3+-11/4x^2+9x^1+-53/2x^0")
+testeq(rr, "319x^0")
+qq, rr = a:divremainder(b)
+testeq(qq, "5/2x^2+91/48x^1+1157/1152x^0")
+testeq(rr, "17755/13824x^1+2299/3456x^0")
+endtest()
+
+starttest("polynomial pseudodivision")
+local pq, pr = a:pseudodivide(c)
+testeq(pq, "320x^3+-704x^2+2304x^1+-6784x^0")
+testeq(pr, "81664x^0")
+
+pq, pr = multia:pseudodivide(multib)
+testeq(pq, "(36y^2+0y^1+-4y^0)x^1+(-72y^3+24y^2+0y^1+0y^0)x^0")
+testeq(pr, "(-216y^3+0y^2+24y^1+0y^0)x^1+(432y^4+-144y^3+576y^2+-384y^1+64y^0)x^0")
+endtest()
+
+
+starttest("combined polynomial/coefficient operations")
+testeq(a + x, "5x^4+4x^3+3x^2+2x^1+4x^0")
+testeq(x + a, "5x^4+4x^3+3x^2+2x^1+4x^0")
+testeq(b - y, "2x^2+1/12x^1+1/2x^0")
+testeq(a * x, "15x^4+12x^3+9x^2+6x^1+3x^0")
+testeq(x * a, "15x^4+12x^3+9x^2+6x^1+3x^0")
+endtest()
+
+starttest("polynomial formal derivatives")
+testeq(a:derivative(), "20x^3+12x^2+6x^1+2x^0")
+testeq(b:derivative(), "4x^1+1/12x^0")
+testeq(c:derivative():derivative(), "0x^0")
+endtest()
+
+
+starttest("polynomial gcd...")
+testeq(PolynomialRing.gcd(d, e), "1x^1+3x^0")
+testeq(PolynomialRing.gcd(b, c), "1x^0")
+testeq(PolynomialRing.gcd(f, g), "1x^2+2/3x^1+1/9x^0")
+endtest()
+
+starttest("square-free factorization")
+testeq(h:squarefreefactorization():autosimplify(), parse("(2 + (3 * x) + (x ^ 2))"), h)
+testeq(i:squarefreefactorization():autosimplify(), parse("((1 + x) * ((2 + x) ^ 3))"), i)
+testeq((Integer(2)*i):squarefreefactorization():autosimplify(), parse("(((2 + x) ^ 3) * (2 + (2 * x)))"), (Integer(2)*i), true)
+testeq(j:squarefreefactorization():autosimplify(), parse("((1 + x) * ((2 + x) ^ 2) * ((3 + x) ^ 3))"), j)
+testeq(o:squarefreefactorization():autosimplify(), parse("(24 + (50 * x) + (59 * (x ^ 2)) + (60 * (x ^ 3)) + (36 * (x ^ 4)) + (10 * (x ^ 5)) + (x ^ 6))"), o)
+endtest()
+
+starttest("polynomial factorization")
+testeq(c:factor(), BinaryOperation.MULEXP({Integer(4), BinaryOperation.POWEXP({PolynomialRing({Integer(3), Integer(1)}, "x"), Integer(1)})}), c)
+testeq(h:factor():autosimplify(), parse("((1 + x) * (2 + x))"), h)
+testeq(k:factor():autosimplify(), parse("((5 + x) * (6 + x))"), k)
+testeq(j:factor():autosimplify(), parse("((1 + x) * ((2 + x) ^ 2) * ((3 + x) ^ 3))"), j)
+testeq(p:factor():autosimplify(), parse("((-24 + x) * (96 + (x ^ 2)) * (48 + (-24 * x) + (x ^ 2)))"), p)
+testeq(l:factor():autosimplify(), parse("((1 + z) * (2 + z) * (3 + z))"), l)
+testeq(m:factor():autosimplify(), parse("((1 + x) ^ 10)"), m)
+testeq(b:factor(), BinaryOperation.MULEXP({Integer(1)/Integer(12), BinaryOperation.POWEXP({PolynomialRing({Integer(4), Integer(1), Integer(24)}, "x"), Integer(1)})}), b)
+testeq(o:factor():autosimplify(), parse("((1 + x) * (2 + x) * (3 + x) * (4 + x) * (1 + (x ^ 2)))"), o)
+testeq(n:factor():autosimplify(), parse("((1 + x) * (2 + x) * (3 + x) * (4 + x) * (1 + (x ^ 2)) * (1 + (-1 * (x ^ 2)) + (x ^ 4)))"), n)
+endtest()
+
+starttest("polynomial decomposition")
+testeq(c:decompose(), "{4x^1+12x^0}", c, true)
+testeq(h:decompose(), "{1x^2+3x^1+2x^0}", h, true)
+testeq(k:decompose(), "{1x^2+11x^1+30x^0}", k, true)
+testeq(j:decompose(), "{1x^6+14x^5+80x^4+238x^3+387x^2+324x^1+108x^0}", j, true)
+testeq(l:decompose(), "{1z^3+6z^2+11z^1+6z^0}", l, true)
+testeq(m:decompose(), "{1x^5+5x^4+10x^3+10x^2+5x^1+1x^0, 1x^2+2x^1+0x^0}", m, true)
+testeq(b:decompose(), "{2x^2+1/12x^1+1/3x^0}", b, true)
+testeq(o:decompose(), "{1x^6+10x^5+36x^4+60x^3+59x^2+50x^1+24x^0}", o, true)
+testeq(n:decompose(), "{1x^10+10x^9+35x^8+50x^7+24x^6+0x^5+1x^4+10x^3+35x^2+50x^1+24x^0}", n, true)
+testeq(q:decompose(), "{36z^2+18z^1+3z^0, 1z^2+-1/2z^1+0z^0}", q, true)
+testeq(r:decompose(),"{4x^3+0x^2+0x^1+0x^0, 1x^2+0x^1+0x^0}", r, true)
+testeq(s:decompose(), "{1x^2+4x^1+1x^0, 1x^2+0x^1+-4x^0}", s, true)
+endtest() \ No newline at end of file