# AbstractAlgebra's polynomial interface

This is the initial API of SLPs which hasn't been updated in a while and might not work as-is with the current state of the package.

Currently, SLPs have a polynomial interface (SLPoly).

## Examples

julia> using AbstractAlgebra, StraightLinePrograms, BenchmarkTools;

julia> S = SLPolyRing(zz, [:x, :y]); x, y = gens(S)
2-element Vector{SLPoly{Int64,SLPolyRing{Int64,AbstractAlgebra.Integers{Int64}}}}:
x
y

julia> p = 3 + 2x * y^2 # each line of the SLP is shown with current value
#1 = * 2 x    ==>     (2x)
#2 = ^ y 2    ==>     y^2
#3 = * #1 #2  ==>     (2xy^2)
#4 = + 3 #3   ==>     (3 + (2xy^2))

julia> p.cs # constants used in the program
2-element Vector{Int64}:
3
2

julia> p.lines # each line is a UInt64 encoding an opcode and 2 arguments
Line(0x0500000028000001)
Line(0x8780000020000002)
Line(0x0500000030000004)
Line(0x0300000010000005)

julia> SLP.evaluate(p, [2, 3])
39

julia> p2 = (p*(x*y))^6
#1 = *  2  x  ==>  (2x)
#2 = ^  y  2  ==>  y^2
#3 = * #1 #2  ==>  (2xy^2)
#4 = +  3 #3  ==>  (3 + (2xy^2))
#5 = *  x  y  ==>  (xy)
#6 = * #4 #5  ==>  ((3 + (2xy^2))xy)
#7 = ^ #6  6  ==>  ((3 + (2xy^2))xy)^6

julia> R, (x1, y1) = polynomial_ring(zz, ["x", "y"]); R
Multivariate Polynomial Ring in x, y over Integers

julia> q = convert(R, p2)
64*x^12*y^18+576*x^11*y^16+2160*x^10*y^14+4320*x^9*y^12+4860*x^8*y^10+2916*x^7*y^8+729*x^6*y^6

julia> v = [3, 5]; @btime SLP.evaluate($q,$v)
32.101 μs (634 allocations: 45.45 KiB)
-1458502820125772303

julia> @btime SLP.evaluate($p2,$v)
270.341 ns (4 allocations: 352 bytes)
-1458502820125772303

julia> res = Int[]; @btime StraightLinePrograms.evaluate!($res,$p2, $v) 171.013 ns (0 allocations: 0 bytes) -1458502820125772303 julia> res # intermediate computations (first 2 elements are constants) 9-element Vector{Int64}: 3 2 6 25 150 153 15 2295 -1458502820125772303 julia> f2 = StraightLinePrograms.compile!(p2) # compile to machine code #3 (generic function with 1 method) julia> @btime SLP.evaluate($p2, $v) 31.153 ns (1 allocation: 16 bytes) -1458502820125772303 julia> @btime$f2($v) # use a function barrier for last bit of efficiency 7.980 ns (0 allocations: 0 bytes) -1458502820125772303 julia> q 64*x^12*y^18+576*x^11*y^16+2160*x^10*y^14+4320*x^9*y^12+4860*x^8*y^10+2916*x^7*y^8+729*x^6*y^6 julia> p3 = convert(S, q) # convert back q::Mpoly to an SLPoly #1 = ^ x 6 ==> x^6 #2 = ^ x 7 ==> x^7 #3 = ^ x 8 ==> x^8 #4 = ^ x 9 ==> x^9 #5 = ^ x 10 ==> x^10 #6 = ^ x 11 ==> x^11 #7 = ^ x 12 ==> x^12 #8 = ^ y 6 ==> y^6 #9 = ^ y 8 ==> y^8 #10 = ^ y 10 ==> y^10 #11 = ^ y 12 ==> y^12 #12 = ^ y 14 ==> y^14 #13 = ^ y 16 ==> y^16 #14 = ^ y 18 ==> y^18 #15 = * 64 #7 ==> (64x^12) #16 = * #15 #14 ==> (64x^12y^18) #17 = * 576 #6 ==> (576x^11) #18 = * #17 #13 ==> (576x^11y^16) #19 = + #16 #18 ==> ((64x^12y^18) + (576x^11y^16)) #20 = * 2160 #5 ==> (2160x^10) #21 = * #20 #12 ==> (2160x^10y^14) #22 = + #19 #21 ==> ((64x^12y^18) + (576x^11y^16) + (2160x^10y^14)) #23 = * 4320 #4 ==> (4320x^9) #24 = * #23 #11 ==> (4320x^9y^12) #25 = + #22 #24 ==> ((64x^12y^18) + (576x^11y^16) + (2160x^10y^14) + (4320x^9y^12)) #26 = * 4860 #3 ==> (4860x^8) #27 = * #26 #10 ==> (4860x^8y^10) #28 = + #25 #27 ==> ((64x^12y^18) + (576x^11y^16) + (2160x^10y^14) + (4320x^9y^12) + (4860x^8y^10)) #29 = * 2916 #2 ==> (2916x^7) #30 = * #29 #9 ==> (2916x^7y^8) #31 = + #28 #30 ==> ((64x^12y^18) + (576x^11y^16) + (2160x^10y^14) + (4320x^9y^12) + (4860x^8y^10) + (2916x^7y^8)) #32 = * 729 #1 ==> (729x^6) #33 = * #32 #8 ==> (729x^6y^6) #34 = + #31 #33 ==> ((64x^12y^18) + (576x^11y^16) + (2160x^10y^14) + (4320x^9y^12) + (4860x^8y^10) + (2916x^7y^8) + (729x^6y^6)) julia> @btime SLP.evaluate($p3, $v) 699.465 ns (5 allocations: 1008 bytes) -1458502820125772303 julia> @time f3 = StraightLinePrograms.compile!(p3); 0.002830 seconds (1.40 k allocations: 90.930 KiB) julia> @btime$f3($v) 80.229 ns (0 allocations: 0 bytes) -1458502820125772303 julia> p4 = convert(S, q, limit_exp=true); # use different encoding julia> @btime SLP.evaluate($p4, $v) 766.864 ns (5 allocations: 1008 bytes) -1458502820125772303 julia> @time f4 = StraightLinePrograms.compile!(p4); 0.002731 seconds (1.74 k allocations: 108.676 KiB) julia> @btime$f4(\$v)
11.781 ns (0 allocations: 0 bytes)
-1458502820125772303