Parse negative numbers better
[libyakmo.git] / test / groebner.myr
blob745cf2d83f984ecfef6dd1ba374baa6adeb08dfa
1 use std
2 use testr
4 use t
5 use yakmo
7 const main = {
8         testr.run([
9                 [ .name = "gb-groebner_basis_of-01",   .fn = gb01  ],
10                 [ .name = "gb-groebner_basis_of-02",   .fn = gb02  ],
11                 [ .name = "gb-lcm-01",                 .fn = lcm01 ],
12                 [ .name = "gb-lcm-02",                 .fn = lcm02 ],
13         ][:])
16 const gb01 = {c
17         var inputs : (byte[:][:], byte[:][:])[:] = [
18                 /*
19                    Gröbner bases are not unique, so any change to the
20                    algorithm may distort these. Therefore, we try not to
21                    copy too many input/outputs exactly.
22                  */
23                 ([ "x" ][:], [ "x" ][:]),
25                 ([ "x", "y" ][:],
26                  [ "x", "y" ][:]),
28                 ([ "x", "x", "x", "x", "x^2", "x", "x^34", "x", "x^2", ][:],
29                  [ "x" ][:]),
31                 ([ "x^3 - 2*x*y", "x^2*y - 2*y^2 + x" ][:],
32                  [ "x^2", "x*y", "y^2 - 1/2 x" ][:]),
34                 ([ "x^2 - y", "x^3 - x" ][:],
35                  [ "x^2 - y", "x*y - x", "y^2 - y" ][:]),
36         ][:]
38         for (Fs, Gs) : inputs
39                 var F = [][:]
40                 for ss : Fs
41                         std.slpush(&F, std.try(yakmo.polynomialfromS(ss)))
42                 ;;
44                 var Gexp = [][:]
45                 for ss : Gs
46                         std.slpush(&Gexp, std.try(yakmo.polynomialfromS(ss)))
47                 ;;
48                 std.sort(Gexp, t.cmp)
50                 var Gact = yakmo.groebner_basis_of(F)
51                 testr.check(c, Gexp.len == Gact.len, "expected Gröbner basis for {} to be {}, was {}", Fs, Gexp, Gact)
53                 for var j = 0; j < Gexp.len; ++j
54                         testr.check(c, std.eq(Gexp[j], Gact[j]), "expected Gröbner basis, elt {} for {} to be {}, was {}", j, Fs, Gexp[j], Gact[j])
55                 ;;
56         ;;
59 const gb02 = {c
60         var inputs : byte[:][:][:] = [
61                 [ "x^2 - 2*y^2", "x*y - 3" ][:],
62                 [ "-1 + 2*x*z - x^2", "3*x - 2*y + y*z", "1 + 2*y - x*z" ][:],
63                 [ "x + 1", "x + 2", "3*y - 2*x", "2*y - x" ][:],
64                 [ "x + 1", "x + 2", "3*y - 2*x", "2*y - x", "z" ][:],
65                 [ "x^5 - x^4*y + 3*x^4*z - x^3*y*z - x^2*z^2 + 2*x^3*z^2 + x*y*z^2 - 3*x*z^3 + y*z^3 - 2*z^4", "x*y + 2*x^2*y + x^3*y - z - 2*x*z - x^2*z", ][:],
66                 [ "x*y - y + z", "y", ][:],
67                 [ "x^2*y - x*y^2", "y^3 + x*y^2*z", ][:],
68                 [ "x^2*y - x*y^2 - x*z + y*z", "4*x*y^3 - 4*y^4 + x*y^2*z + 7*y^3*z + 4*x*y*z^2 - 2*y^2*z^2 + x*z^3 + 7*y*z^3 + 2*z^4", "16*y^4 + 8*y^3*z + 17*y^2*z^2 + 8*y*z^3 + z^4", ][:],
69                 [ "x^4*y - x^2*y^2 + x^3*y*z - x*y^2*z", "x^2 + x^3 + 2*x*z + 2*x^2*z + z^2 + x*z^2", "-2*x*y + 3*x^2*y + 2*z - 3*x*z", "x*y + 2*x^2*y + x^3*y - z - 2*x*z - x^2*z", ][:],
70                 [ "x^2*y + x^3*y - x*y^2", "x*y^3 + x*y*z^2", "-2*x^3 + 3*x^4 + 2*z^2 - 3*x*z^2", "-2*x^3 + 3*x^4 + 2*z^2", ][:],
71                 [ "4*x^2*y^2 - 4*x*y^3 + x^2*y*z + 7*x*y^2*z + 2*x*y*z^2", "x^2*y^3 - x*y^4 - x*y^2*z + y^3*z + x^2*y*z^2 - x*y^2*z^2 - x*z^3 + y*z^3", "x^4*y - x^2*y^2 - x^3*y^2 + x*y^3 - x^3*z + x*y*z + x^2*y*z + 2*x^3*y*z - y^2*z - 2*x*y^2*z - 2*x^2*z^2 + 2*y*z^2", "x^2*y - x*y^2 + 2*x*y*z", ][:],
72                 [ "x^4 - x^3*y - x*z^2 + y*z^2", "x^5*y - x^4*y^2 - x^4*z + x^3*y*z + 2*x^4*y*z - 2*x^3*z^2 - x^2*y*z^2 + x*y^2*z^2 + x*z^3 - y*z^3 - 2*x*y*z^3 + 2*z^4", "x^2*y^3 - x*y^4 + x^2*y*z^2 - x*y^2*z^2", "x^4*y + x^5*y - x^3*z - x^4*z - x*y*z^2 - x^2*y*z^2 + z^3 + x*z^3", ][:],
73                 [ "x^5*y - x^4*y^2", "x^2*y + x^3*y - x*y^2", "x^4*y^3 + x^4*y*z^2", ][:],
74                 [ "x^2 - x - x^2*z^2",  "x^3 - x*z^2", "x*y - z", ][:],
75                 [ "x^2 - x^2*z^2",  "x^3 - x*z^2", "x*y - z", ][:],
76                 [ "x^2 - x - x^2*z^2",  "x^4*y^3 + x^3 - x*y^3*z^2 - x", "x*y - z", ][:],
78                 /*
79                    There should be nothing wrong with these random
80                    tests, but they take forever. Save them for when you
81                    get a real implementation.
82                  */
83                 // [ "x^5*y - x^4*y^2 - x^2*y*z^2 + x*y^2*z^2", "x^2*y + x^3*y - x*y^2 - x^2*y^2", "x^4*y^3 + x^4*y*z^2 - x*y^3*z^2 - x*y*z^4", "x*y + x^2*y - z - x*z", ][:],
84                 // [ "t^5*X^2 - 2*t^5*X*Y + t^5*Y^2", "X^2 Y + X^2 Z + 2 X Y^2 + 2 X Y Z + Y^3 + Y^2 Z - t^5 X^2 Y - t^5 X^2 Z - 2 t^5 X Y^2 - 2 t^5 X Y Z - t^5 Y^3 - t^5 Y^2 Z", ][:],
85                 // [ "x z + y z + 2 x^2 z + 2 x y z + x^3 z + x^2 y z", "-x^2 + 2 x y - y^2 + x^3 - 2 x^2 y + x y^2 + x^2 z - 2 x y z + y^2 z - x^3 z + 2 x^2 y z - x y^2 z"][:],
86 //                [ "x^2*y + x^3*y - x*y^2 - x^2*y^2 + 2*x*y*z + 2*x^2*y*z", "x*y^3 + x*y*z^2", "-2*x^3 + 3*x^4 + 2*z^2 - 3*x*z^2", "-2*x^3 + 3*x^4 + 2*z^2 - 3*x*z^2", ][:],
87 //                [ "x^5 - x^4*y + 3*x^4*z - x^3*y*z - x^2*z^2 + 2*x^3*z^2 + x*y*z^2 - 3*x*z^3 + y*z^3 - 2*z^4", "x^4*y - x^3*z - x*y*z^2 + z^3", "4*x^2*y^2 - 4*x*y^3 + x^2*y*z + 7*x*y^2*z + 2*x*y*z^2", "x^3*y^2 - x^2*y^3 - x^2*y*z + x*y^2*z", ][:],
88 //                [ "-2*x*y^2 + 3*x^2*y^2 + 2*y^3 - 3*x*y^3 - 4*y^2*z + 6*x*y^2*z - 2*x*z^2 + 3*x^2*z^2 + 2*y*z^2 - 3*x*y*z^2 - 4*z^3 + 6*x*z^3", "x^6*y - x^4*y^2 - x^5*z + x^3*y*z - x^3*y*z^2 + x*y^2*z^2 + x^2*z^3 - y*z^3", "4*x^4*y + x^4*z + 4*x^3*y*z + x^3*z^2 - 4*x*y*z^2 - x*z^3 - 4*y*z^3 - z^4", "4*x^4*y + x^4*z + 4*x^3*y*z + x^3*z^2 - 4*x*y*z^2 - x*z^3 - 4*y*z^3 - z^4", ][:],
89 //                [ "x^3 + x^4 - x*y - 2*x^2*y - x^3*y + y^2 + x*y^2 + 2*x^2*z + 2*x^3*z - 2*y*z - 2*x*y*z", "1 + x", "x^3 + x^4 - x*y - 2*x^2*y - x^3*y + y^2 + x*y^2", "x^4*y + x^5*y - x^3*z - x^4*z - x*y*z^2 - x^2*y*z^2 + z^3 + x*z^3", ][:],
90 //                [ "x^2*y - x*y^2 - x*z + y*z", "-2*x^3 + x^4 + 3*x^5 + 2*z^2 - x*z^2 - 3*x^2*z^2", "x^5*y - x^4*y^2 - x^4*z + x^3*y*z + 2*x^4*y*z - 2*x^3*z^2 - x^2*y*z^2 + x*y^2*z^2 + x*z^3 - y*z^3 - 2*x*y*z^3 + 2*z^4", "-2 - x + 4*x^2 + 3*x^3", ][:],
92 //                [ "-2*x^3 + 3*x^4 + 2*z^2 - 3*x*z^2", "x^3*y - x*y^2", "x^3*y^2 + x^4*y^2 + x^3*z^2 + x^4*z^2 - y^2*z^2 - x*y^2*z^2 - z^4 - x*z^4", "-2*x + x^2 + 3*x^3 + 2*y - x*y - 3*x^2*y - 4*z + 2*x*z + 6*x^2*z", ][:],
93 //                [ "x^6*y - x^4*y^2 - x^3*y*z^2 + x*y^2*z^2", "x^4*y^3 + x^4*y*z^2 - x*y^3*z^2 - x*y*z^4", "4*x^4*y + x^4*z + 4*x^3*y*z + x^3*z^2 - 4*x*y*z^2 - x*z^3 - 4*y*z^3 - z^4", "x^2 + x^3 + 2*x*z + 2*x^2*z + z^2 + x*z^2", ][:],
94 //                [ "x^4*y^3 + x^4*y*z^2 - x*y^3*z^2 - x*y*z^4", "x^3*y^2 + x^4*y^2 + x^3*z^2 + x^4*z^2 - y^2*z^2 - x*y^2*z^2 - z^4 - x*z^4", "x^5 - 2*x^4*y + x^3*y^2 - x^2*z^2 + 2*x*y*z^2 - y^2*z^2", "x^4*y - x^2*y^2 - x^3*y^2 + x*y^3 - x^3*z + x*y*z + x^2*y*z + 2*x^3*y*z - y^2*z - 2*x*y^2*z - 2*x^2*z^2 + 2*y*z^2", ][:],
95 //                [ "", "x^4*y^2 - x^3*y^3 + 2*x^3*y^2*z + x^4*z^2 - x^3*y*z^2 - x*y^2*z^2 + y^3*z^2 + 2*x^3*z^3 - 2*y^2*z^3 - x*z^4 + y*z^4 - 2*z^5", "x^2 - 2*x*y + y^2", "-2 - x + 4*x^2 + 3*x^3", ][:],
96 //                [ "16*x^2*y^2 - 16*y^3 + 8*x^2*y*z - 8*y^2*z + x^2*z^2 - y*z^2", "x^3*y^2 - x*y^3 - x^2*y^3 + y^4 + 2*x^2*y^2*z - 2*y^3*z + x^3*z^2 - x*y*z^2 - x^2*y*z^2 + y^2*z^2 + 2*x^2*z^3 - 2*y*z^3", "-2*x + x^2 + 3*x^3 + 2*y - x*y - 3*x^2*y - 4*z + 2*x*z + 6*x^2*z", "x^3*y^3 - x^2*y^2*z", ][:],
97 //                [ "x^3 + x^4 - x*y - 2*x^2*y - x^3*y + y^2 + x*y^2", "x^3 - z^2", "x^4 + x^5 - x^3*y - x^4*y - x*z^2 - x^2*z^2 + y*z^2 + x*y*z^2", "x^4*y - x^2*y^2 + x^3*y*z - x*y^2*z", ][:],
98 //                [ "4*x^2*y^2 - 4*x*y^3 + x^2*y*z + 7*x*y^2*z + 2*x*y*z^2", "x^3*y - x^2*y^2 - x^2*z + x*y*z + x^2*y*z - x*y^2*z - x*z^2 + y*z^2", "x^2 + 2*x^3 + x^4 - y - 2*x*y - x^2*y", "x^3 + x^4 - x*y - 2*x^2*y - x^3*y + y^2 + x*y^2 + 2*x^2*z + 2*x^3*z - 2*y*z - 2*x*y*z", ][:],
99 //                [ "-2*x^3 + 3*x^4 + 2*x*y - x^2*y - 3*x^3*y - 2*y^2 + 3*x*y^2", "-2*x^4*y + 3*x^5*y + 2*x^3*z - 3*x^4*z + 2*x*y*z^2 - 3*x^2*y*z^2 - 2*z^3 + 3*x*z^3", "x^5*y - x^4*y^2 - x^4*z + x^3*y*z + 2*x^4*y*z - 2*x^3*z^2 - x^2*y*z^2 + x*y^2*z^2 + x*z^3 - y*z^3 - 2*x*y*z^3 + 2*z^4", "x^3*y - 2*x^2*y^2 + x*y^3 - x^2*z + 2*x*y*z + 4*x^2*y*z - y^2*z - 4*x*y^2*z - 4*x*z^2 + 4*y*z^2 + 4*x*y*z^2 - 4*z^3", ][:],
100 //                [ "-2*x*y^2 + 3*x^2*y^2 - 2*y^2*z + 3*x*y^2*z - 2*x*z^2 + 3*x^2*z^2 - 2*z^3 + 3*x*z^3", "x*y + x^2*y", "x^3*y - x*y^2 - x^2*z + y*z", "16*x*y^3 - 16*y^2*z + 8*x*y^2*z - 8*y*z^2 + x*y*z^2 - z^3", ][:],
101 //                [ "x^5 - x^4*y + 3*x^4*z - x^3*y*z - x^2*z^2 + 2*x^3*z^2 + x*y*z^2 - 3*x*z^3 + y*z^3 - 2*z^4", "4*y^3 + y^2*z + 4*y*z^2 + z^3", "x^4*y^2 - x^3*y^3 + 2*x^3*y^2*z + x^4*z^2 - x^3*y*z^2 - x*y^2*z^2 + y^3*z^2 + 2*x^3*z^3 - 2*y^2*z^3 - x*z^4 + y*z^4 - 2*z^5", "x*y + 2*x^2*y + x^3*y - z - 2*x*z - x^2*z", ][:],
102 //                [ "4*x*y + 4*x^2*y - 4*y^2 - 4*x*y^2 + x*z + x^2*z + 7*y*z + 7*x*y*z + 2*z^2 + 2*x*z^2", "x^4*y - x^2*y^2 + x^3*y*z - x*y^2*z", "4*x^2*y - 4*x*y^2 + x^2*z + 11*x*y*z - 4*y^2*z + 3*x*z^2 + 7*y*z^2 + 2*z^3", "x^6*y - x^4*y^2 - x^3*y*z^2 + x*y^2*z^2", ][:],
103 //                [ "x^6*y - x^4*y^2 - x^5*z + x^3*y*z - x^3*y*z^2 + x*y^2*z^2 + x^2*z^3 - y*z^3", "x^3*y - x^2*z + 2*x^2*y*z - 2*x*z^2 + x*y*z^2 - z^3", "4*x^4*y + x^4*z + 4*x^3*y*z + x^3*z^2 - 4*x*y*z^2 - x*z^3 - 4*y*z^3 - z^4", "4*x^2*y - 8*x*y^2 + 4*y^3 + x^2*z - 2*x*y*z + y^2*z", ][:],
104 //                [ "x^2*y^3 - x*y^4 - x*y^2*z + y^3*z + x^2*y*z^2 - x*y^2*z^2 - x*z^3 + y*z^3", "x^4*y - x^3*z - x*y*z^2 + z^3", "x^2*y^3 + x*y^3*z + x^2*y*z^2 + x*y*z^3", "x^4*y^3 + x^4*y*z^2 - x*y^3*z^2 - x*y*z^4", ][:],
105 //                [ "x^3*y - x*y^2 - x^2*z + y*z", "x^4 + x^5 - x^3*y - x^4*y - x*z^2 - x^2*z^2 + y*z^2 + x*y*z^2", "-2 - x + 4*x^2 + 3*x^3", "x^3*y - 2*x^2*y^2 + x*y^3 - x^2*z + 2*x*y*z + 4*x^2*y*z - y^2*z - 4*x*y^2*z - 4*x*z^2 + 4*y*z^2 + 4*x*y*z^2 - 4*z^3", ][:],
106 //                [ "x^4*y - x^2*y^2 - x^3*y^2 + x*y^3 - x^3*z + x*y*z + x^2*y*z + 2*x^3*y*z - y^2*z - 2*x*y^2*z - 2*x^2*z^2 + 2*y*z^2", "x^3 + x^4 - x*y - 2*x^2*y - x^3*y + y^2 + x*y^2 + 2*x^2*z + 2*x^3*z - 2*y*z - 2*x*y*z", "x*y^2 - y^3 + 2*y^2*z + x*z^2 - y*z^2 + 2*z^3", "1 + x", ][:],
107 //                [ "x^3 - z^2", "x^3*y - 2*x^2*y^2 + x*y^3 - x^2*z + 2*x*y*z + 4*x^2*y*z - y^2*z - 4*x*y^2*z - 4*x*z^2 + 4*y*z^2 + 4*x*y*z^2 - 4*z^3", "-2*x^3 + 3*x^4 + 2*z^2 - 3*x*z^2", "x^3*y - x*y^2", ][:],
108 //                [ "x^2*y^2 - 2*x*y^3 + y^4 + 4*x*y^2*z - 4*y^3*z + x^2*z^2 - 2*x*y*z^2 + 5*y^2*z^2 + 4*x*z^3 - 4*y*z^3 + 4*z^4", "x^2*y + x^3*y - x*y^2 - x^2*y^2 + 2*x*y*z + 2*x^2*y*z", "x^3*y - x^2*y^2 + 3*x^2*y*z - x*y^2*z + 2*x*y*z^2", "x^3*y^2 - x^2*y^3 - 2*x^2*y*z + 2*x*y^2*z + x*z^2 - y*z^2", ][:],
109 //                [ "x^2*y - x*y^2 - x*z + y*z", "x^3*y^2 + x^4*y^2 + x^3*z^2 + x^4*z^2 - y^2*z^2 - x*y^2*z^2 - z^4 - x*z^4", "x^2*y + x^3*y - x*y^2 - x^2*y^2 + 2*x*y*z + 2*x^2*y*z", "x*y + 2*x^2*y + x^3*y - z - 2*x*z - x^2*z", ][:],
110 //                [ "x^4*y - x^2*y^2 - x^3*y^2 + x*y^3 - x^3*z + x*y*z + x^2*y*z - y^2*z", "x*y^2 - y^3 + 2*y^2*z + x*z^2 - y*z^2 + 2*z^3", "x^5*y - x^4*y^2 - x^4*z + x^3*y*z + 2*x^4*y*z - 2*x^3*z^2 - x^2*y*z^2 + x*y^2*z^2 + x*z^3 - y*z^3 - 2*x*y*z^3 + 2*z^4", "x^3*y - 2*x^2*y^2 + x*y^3 - x^2*z + 2*x*y*z - y^2*z", ][:],
111 //                [ "x^5*y - x^4*y^2 - x^4*z + x^3*y*z + 2*x^4*y*z - 2*x^3*z^2 - x^2*y*z^2 + x*y^2*z^2 + x*z^3 - y*z^3 - 2*x*y*z^3 + 2*z^4", "x^4*y + x^5*y - x^3*z - x^4*z - x*y*z^2 - x^2*y*z^2 + z^3 + x*z^3", "x^6*y - x^4*y^2 - x^5*z + x^3*y*z - x^3*y*z^2 + x*y^2*z^2 + x^2*z^3 - y*z^3", "-2*x + x^2 + 3*x^3 + 2*y - x*y - 3*x^2*y - 4*z + 2*x*z + 6*x^2*z", ][:],
112 //                [ "x^3*y^2 + x^4*y^2 + x^3*z^2 + x^4*z^2 - y^2*z^2 - x*y^2*z^2 - z^4 - x*z^4", "x^4*y^2 - x^3*y^3 + 2*x^3*y^2*z + x^4*z^2 - x^3*y*z^2 - x*y^2*z^2 + y^3*z^2 + 2*x^3*z^3 - 2*y^2*z^3 - x*z^4 + y*z^4 - 2*z^5", "x^3 + x^4 - x*y - 2*x^2*y - x^3*y + y^2 + x*y^2 + 2*x^2*z + 2*x^3*z - 2*y*z - 2*x*y*z", "x^4*y - x^2*y^2 + x^3*y*z - x*y^2*z", ][:],
113 //                [ "4*x^2*y^2 + x^2*y*z + 4*x*y^2*z + x*y*z^2", "4*x*y^4 - 4*y^3*z + x*y^3*z - y^2*z^2 + 4*x*y^2*z^2 - 4*y*z^3 + x*y*z^3 - z^4", "4*x^2*y^2 - 4*x*y^3 + x^2*y*z + 7*x*y^2*z + 2*x*y*z^2", "x^5 - 2*x^3*y - x^4*y + x*y^2 + 2*x^2*y^2 - y^3", ][:],
114 //                [ "x^4 - x^3*y - x*z^2 + y*z^2", "x^3*y^2 - x^2*y^3 - x^2*y*z + x*y^2*z", "x^2 - x*y + x*z - y*z", "x^3*y^2 - x^2*y^3 - x^2*y*z + x*y^2*z", ][:],
115 //                [ "4*x^2*y^2 + x^2*y*z + 4*x*y^2*z + x*y*z^2", "4*x^2*y - 4*x*y^2 + x^2*z + 11*x*y*z - 4*y^2*z + 3*x*z^2 + 7*y*z^2 + 2*z^3", "x^2*y^3 - x*y^4 + x^2*y*z^2 - x*y^2*z^2", "x^3 + 2*x^4 + x^5 - z^2 - 2*x*z^2 - x^2*z^2", ][:],
116 //                [ "x^3*y^2 - x*y^3 - x^2*y^3 + y^4 + 2*x^2*y^2*z - 2*y^3*z + x^3*z^2 - x*y*z^2 - x^2*y*z^2 + y^2*z^2 + 2*x^2*z^3 - 2*y*z^3", "1 + x", "-2 - x + 4*x^2 + 3*x^3", "x^6*y - x^4*y^2 - x^5*z + x^3*y*z - x^3*y*z^2 + x*y^2*z^2 + x^2*z^3 - y*z^3", ][:],
117 //                [ "x^5 - x^4*y + 3*x^4*z - x^3*y*z - x^2*z^2 + 2*x^3*z^2 + x*y*z^2 - 3*x*z^3 + y*z^3 - 2*z^4", "x^4*y - x^2*y^2 - x^3*y^2 + x*y^3 - x^3*z + x*y*z + x^2*y*z + 2*x^3*y*z - y^2*z - 2*x*y^2*z - 2*x^2*z^2 + 2*y*z^2", "16*x^2*y^2 - 16*y^3 + 8*x^2*y*z - 8*y^2*z + x^2*z^2 - y*z^2", "x^5*y - x^4*y^2 - x^4*z + x^3*y*z + 2*x^4*y*z - 2*x^3*z^2 - x^2*y*z^2 + x*y^2*z^2 + x*z^3 - y*z^3 - 2*x*y*z^3 + 2*z^4", ][:],
118 //                [ "x^2 - 2*x*y + y^2", "x^3*y^2 - x^2*y^3 - x^2*y*z + x*y^2*z", "4*x^2*y - 4*x*y^2 + x^2*z + 11*x*y*z - 4*y^2*z + 3*x*z^2 + 7*y*z^2 + 2*z^3", "x^5 - 2*x^4*y + x^3*y^2 - x^2*z^2 + 2*x*y*z^2 - y^2*z^2", ][:],
119 //                [ "x^3*y - x*y^2 - x^2*z + y*z", "x^4 - x^2*y - 2*x^3*y + 2*x*y^2 + x^2*y^2 - y^3 + 2*x^3*z - 2*x*y*z - 2*x^2*y*z + 2*y^2*z", "x^3*y - x^2*y^2 - x^2*z + x*y*z + x^2*y*z - x*y^2*z - x*z^2 + y*z^2", "4*x^5*y - 4*x^3*y^2 + x^5*z - x^3*y*z - 4*x^2*y*z^2 + 4*y^2*z^2 - x^2*z^3 + y*z^3", ][:],
120 //                [ "4*x^2*y^2 + x^2*y*z + 4*x*y^2*z + x*y*z^2", "", "x^2*y - x*y^2 - x*z + y*z", "x^3*y^2 - x^2*y^3 - x^2*y*z + x*y^2*z", ][:],
121 //                [ "x^2 + 2*x^3 + x^4 - y - 2*x*y - x^2*y", "4*x^5*y - 4*x^3*y^2 + x^5*z - x^3*y*z - 4*x^2*y*z^2 + 4*y^2*z^2 - x^2*z^3 + y*z^3", "4*x*y^3 - 4*y^4 + x*y^2*z + 7*y^3*z + 4*x*y*z^2 - 2*y^2*z^2 + x*z^3 + 7*y*z^3 + 2*z^4", "x^2*y + x^3*y - x*y^2 - x^2*y^2", ][:],
122 //                [ "x^2*y + x^3*y - x*y^2 - x^2*y^2", "x^3*y^2 + x^4*y^2 + x^3*z^2 + x^4*z^2 - y^2*z^2 - x*y^2*z^2 - z^4 - x*z^4", "x^5 - 2*x^4*y + x^3*y^2 - x^2*z^2 + 2*x*y*z^2 - y^2*z^2", "x^3*y^2 - x^2*y^3 - 2*x^2*y*z + 2*x*y^2*z + x*z^2 - y*z^2", ][:],
123 //                [ "4*x^4*y + x^4*z + 4*x^3*y*z + x^3*z^2 - 4*x*y*z^2 - x*z^3 - 4*y*z^3 - z^4", "x^2*y - x*y^2 - x*z + y*z", "x^4*y - x^2*y^2 + x^3*y*z - x*y^2*z", "x^3 + x^4 - x*y - 2*x^2*y - x^3*y + y^2 + x*y^2", ][:],
124 //                [ "x^2*y + x^3*y - x*y^2 - x^2*y^2 + 2*x*y*z + 2*x^2*y*z", "x^4*y^3 + x^4*y*z^2 - x*y^3*z^2 - x*y*z^4", "-2*x^3 + x^4 + 3*x^5 + 2*z^2 - x*z^2 - 3*x^2*z^2", "x^4*y - x^2*y^2 - x^3*y^2 + x*y^3 - x^3*z + x*y*z + x^2*y*z + 2*x^3*y*z - y^2*z - 2*x*y^2*z - 2*x^2*z^2 + 2*y*z^2", ][:],
125 //                [ "x^5 + x^6 - x^3*y - x^4*y - x^2*z^2 - x^3*z^2 + y*z^2 + x*y*z^2", "x^2*y^3 - x*y^4 - x*y^2*z + y^3*z + x^2*y*z^2 - x*y^2*z^2 - x*z^3 + y*z^3", "x^4*y - x^2*y^2 - x^3*y^2 + x*y^3 - x^3*z + x*y*z + x^2*y*z - y^2*z", "x*y + x^2*y", ][:],
126 //                [ "x^2*y^2 - 2*x*y^3 + y^4 + 4*x*y^2*z - 4*y^3*z + x^2*z^2 - 2*x*y*z^2 + 5*y^2*z^2 + 4*x*z^3 - 4*y*z^3 + 4*z^4", "4*x*y^4 - 4*y^3*z + x*y^3*z - y^2*z^2 + 4*x*y^2*z^2 - 4*y*z^3 + x*y*z^3 - z^4", "x^2*y^2 + x^3*y^2 - x*y*z - x^2*y*z", "x*y + x^2*y", ][:],
127 //                [ "x^3*y - x^2*y^2 - x^2*z + x*y*z + x^2*y*z - x*y^2*z - x*z^2 + y*z^2", "x^3 - z^2", "x^3*y - 2*x^2*y^2 + x*y^3 + 2*x^2*y*z - 2*x*y^2*z", "-2*x*y^2 + 3*x^2*y^2 - 2*y^2*z + 3*x*y^2*z - 2*x*z^2 + 3*x^2*z^2 - 2*z^3 + 3*x*z^3", ][:],
128 //                [ "x^4*y^2 + x^3*y^2*z + x^4*z^2 - x*y^2*z^2 + x^3*z^3 - y^2*z^3 - x*z^4 - z^5", "x^2*y^2 + x^3*y^2 - x*y*z - x^2*y*z", "x^4*y + x^5*y - x^3*z - x^4*z - x*y*z^2 - x^2*y*z^2 + z^3 + x*z^3", "4*x*y^4 - 4*y^3*z + x*y^3*z - y^2*z^2 + 4*x*y^2*z^2 - 4*y*z^3 + x*y*z^3 - z^4", ][:],
129 //                [ "-2*x + x^2 + 3*x^3 + 2*y - x*y - 3*x^2*y - 4*z + 2*x*z + 6*x^2*z", "x^3*y - x^2*y^2 + 3*x^2*y*z - x*y^2*z + 2*x*y*z^2", "x^6*y - x^4*y^2 - x^3*y*z^2 + x*y^2*z^2", "x^4*y - x^2*y^2 - x^3*y^2 + x*y^3 - x^3*z + x*y*z + x^2*y*z + 2*x^3*y*z - y^2*z - 2*x*y^2*z - 2*x^2*z^2 + 2*y*z^2", ][:],
130 //                [ "4*x^2*y^2 + x^2*y*z + 4*x*y^2*z + x*y*z^2", "x^4 - x^2*y - x^3*y + x*y^2 + 3*x^3*z - 3*x*y*z - x^2*y*z + y^2*z + 2*x^2*z^2 - 2*y*z^2", "4*x^5*y - 4*x^3*y^2 + x^5*z - x^3*y*z - 4*x^2*y*z^2 + 4*y^2*z^2 - x^2*z^3 + y*z^3", "x^2 + x^3 + 2*x*z + 2*x^2*z + z^2 + x*z^2", ][:],
132         ][:]
134         for ls : inputs
135                 var F : yakmo.polynomial#[:] = [][:]
136                 for s : ls
137                         std.slpush(&F, std.try(yakmo.polynomialfromS(s)))
138                 ;;
140                 /* Dup f to make sure groebner_basis_of doesn't change it from under us */
141                 var G : yakmo.polynomial#[:] = yakmo.groebner_basis_of(t.dup(F))
143                 /* First, check G doesn't have any 0s in it */
144                 for q : G
145                         if q.terms.len == 0
146                                 testr.fail(c, "Groebner basis of {} contained zero polynomial", ls)
147                         ;;
148                 ;;
150                 /*
151                    Now, check that G is a Gröbner basis: every leading
152                    term of F needs to be contained in the ideal of
153                    leading terms of G.
154                  */
155                 for p : F
156                         if p.terms.len == 0
157                                 continue
158                         ;;
160                         var lt = t.dup(p.terms[p.terms.len - 1])
162                         var this_okay = false
163                         for q : G
164                                 match yakmo.positive_monomial_division(&lt, &q.terms[q.terms.len - 1])
165                                 | `std.Some quotient:
166                                         this_okay = true
167                                         break
168                                 | `std.None:
169                                 ;;
170                         ;;
172                         if this_okay
173                                 continue
174                         ;;
176                         testr.fail(c, "For {}, leading term of {} not contained in LT(G); G = {}", ls, p, G)
177                 ;;
179                 /*
180                    Now, check that G is monic.
181                  */
182                 for p : G
183                         testr.check(c, yakmo.eqQ(p.terms[p.terms.len - 1].coeff, 1, 1), "For {}, G was non-monic {}", ls, G)
184                 ;;
186                 /*
187                    Now, check that G is reduced: for every monomial m in
188                    every polynomial of p, m is not contained in the
189                    ideal LT(G - { p }).
190                  */
191                 for var j = 0; j < G.len; ++j
192                         var p : yakmo.polynomial# = G[j]
193                         for var k = 0; k < p.terms.len; ++k
194                                 var mon : yakmo.monomial# = &p.terms[k]
195                                 for var l = 0; l < G.len; ++l
196                                         if l == j
197                                                 continue
198                                         ;;
200                                         var q : yakmo.polynomial# = G[l]
201                                         match yakmo.positive_monomial_division(mon, &q.terms[q.terms.len - 1])
202                                         | `std.Some _:
203                                                 testr.fail(c, "For {}, G = {} was non-reduced, proven by {}", ls, G, p)
204                                         | `std.None:
205                                         ;;
206                                 ;;
207                         ;;
208                 ;;
209         ;;
212 const lcm01 = {c
213         var inputs : (byte[:], byte[:], byte[:], byte[:])[:] = [
214                 ("01", "x",   "y",   "x y"  ),
215                 ("02", "x z", "y z", "x y z"),
217                 ("03", "x^2 - y^2",
218                  "x^2 + 2 x y + y^2",
219                  "- x^3 - y*x^2 + y^2*x + y^3"),
222                 /* All trivial LCM */
223                 ("04",
224                  "y + z",
225                  "x^3 + 3*x^2*y + 3*x*y^2 + y^3",
226                  "x^3*y + 3*x^2*y^2 + 3*x*y^3 + y^4 + x^3*z + 3*x^2*y*z + 3*x*y^2*z + y^3*z"),
227                 ("05",
228                  "x + x^2 + y + x*y",
229                  "y - 2*x*y + x^2*y + z - 2*x*z + x^2*z",
230                  "x*y - x^2*y - x^3*y + x^4*y + y^2 - x*y^2 - x^2*y^2 + x^3*y^2 + x*z - x^2*z - x^3*z + x^4*z + y*z - x*y*z - x^2*y*z + x^3*y*z"),
231                 ("06",
232                  "-x + x^2 + y - x*y",
233                  "x + 2*x^2 + x^3 + y + 2*x*y + x^2*y",
234                  "x^2 + x^3 - x^4 - x^5 - y^2 - x*y^2 + x^2*y^2 + x^3*y^2"),
235                 ("07",
236                  "x - y",
237                  "x + x^2 + y + x*y",
238                  "-x^2 - x^3 + y^2 + x*y^2"),
239                 ("08",
240                  "x + 2*x^2 + x^3 + y + 2*x*y + x^2*y",
241                  "-x^2 + x^3 + 2*x*y - 2*x^2*y - y^2 + x*y^2",
242                  "-x^3 - x^4 + x^5 + x^6 + x^2*y + x^3*y - x^4*y - x^5*y + x*y^2 + x^2*y^2 - x^3*y^2 - x^4*y^2 - y^3 - x*y^3 + x^2*y^3 + x^3*y^3"),
243                 ("09",
244                  "x^2 + x^3 - y^2 - x*y^2",
245                  "1 - 2*x + x^2",
246                  "- x^2 + x^3 + x^4 - x^5 + y^2 - x*y^2 - x^2*y^2 + x^3*y^2"),
247                 ("10",
248                  "w^2 - 2*w*x + x^2",
249                  "w^2*x + 2*w*x^2 + x^3 + w^2*y + 2*w*x*y + x^2*y",
250                  "w^4*x - 2*w^2*x^3 + x^5 + w^4*y - 2*w^2*x^2*y + x^4*y"),
251                 ("11",
252                  "1",
253                  "y^2 + 2*y*z + z^2",
254                  "y^2 + 2*y*z + z^2"),
255                 ("12",
256                  "y + x*y + z + x*z",
257                  "-1 + 3*x - 3*x^2 + x^3",
258                  "-y + 2*x*y - 2*x^3*y + x^4*y - z + 2*x*z - 2*x^3*z + x^4*z"),
259                 ("13",
260                  "x + x^2 + y + x*y",
261                  "x*y - y^2 + x*z - y*z",
262                  "- x^2*y - x^3*y + y^3 + x*y^3 - x^2*z - x^3*z + y^2*z + x*y^2*z"),
263                 ("14",
264                  "y^2 + x*y^2 + 2*y*z + 2*x*y*z + z^2 + x*z^2",
265                  "x - y",
266                  "- x*y^2 - x^2*y^2 + y^3 + x*y^3 - 2*x*y*z - 2*x^2*y*z + 2*y^2*z + 2*x*y^2*z - x*z^2 - x^2*z^2 + y*z^2 + x*y*z^2"),
267                 ("15",
268                  "-x + x^2 - y + x*y",
269                  "x - y",
270                  "x^2 - x^3 - y^2 + x*y^2"),
272                 /* All non-trivial LCM, (this may be something as lame as a sign flip) */
273                 ("16",
274                  "x*y^2 - 2*x^2*y^2 + x^3*y^2",
275                  "-x^2 - x*y + x*z + y*z",
276                  "- x^3*y^2 + 2*x^4*y^2 - x^5*y^2 - x^2*y^3 + 2*x^3*y^3 - x^4*y^3 + x^2*y^2*z - 2*x^3*y^2*z + x^4*y^2*z + x*y^3*z - 2*x^2*y^3*z + x^3*y^3*z"),
277                 ("17",
278                  "x^4*y^4*z",
279                  "-x^3 + 3*x^2*z - 3*x*z^2 + z^3",
280                  "- x^7*y^4*z + 3*x^6*y^4*z^2 - 3*x^5*y^4*z^3 + x^4*y^4*z^4"),
281                 ("18",
282                  "x^4*y - x^2*y^3",
283                  "x*y^3*z + 2*x*y^2*z^2 + x*y*z^3",
284                  "- x^4*y^3*z + x^2*y^5*z - 2*x^4*y^2*z^2 + 2*x^2*y^4*z^2 - x^4*y*z^3 + x^2*y^3*z^3"),
285                 ("19",
286                  "-x + x^3 + y - x^2*y",
287                  "-x + x^3 + y - x^2*y",
288                  "x - x^3 - y + x^2*y"),
289                 ("20",
290                  "x^3*y^2 - x*y^4",
291                  "-x^4 - x^3*y + x^3*z + x^2*y*z",
292                  "x^5*y^2 - x^3*y^4 - x^4*y^2*z + x^2*y^4*z"),
293                 ("21",
294                  "x + y",
295                  "x^3 + x^2*y - 2*x^2*z - 2*x*y*z + x*z^2 + y*z^2",
296                  "x^3 + x^2*y - 2*x^2*z - 2*x*y*z + x*z^2 + y*z^2"),
297                 ("22",
298                  "x^3*y^4 + x^3*y^3*z",
299                  "x^2*y*z + x*y^2*z",
300                  "x^4*y^4*z + x^3*y^5*z + x^4*y^3*z^2 + x^3*y^4*z^2"),
301                 ("23",
302                  "x^5 - x^4*y",
303                  "x^4*y + x^5*y",
304                  "- x^5*y - x^6*y + x^4*y^2 + x^5*y^2"),
305                 ("24",
306                  "x^4*y - 2*x^3*y^2 + x^2*y^3",
307                  "x^2*y*z + x^3*y*z + x*y^2*z + x^2*y^2*z",
308                  "x^5*y*z + x^6*y*z - x^4*y^2*z - x^5*y^2*z - x^3*y^3*z - x^4*y^3*z + x^2*y^4*z + x^3*y^4*z"),
309                 ("25",
310                  "x - x^3 - z + x^2*z",
311                  "-x + 2*x^2 - x^3 + z - 2*x*z + x^2*z",
312                  "-x + x^2 + x^3 - x^4 + z - x*z - x^2*z + x^3*z"),
313                 ("26",
314                  "x^2*y^3*z",
315                  "x*y^2 + x^2*y^2",
316                  "x^2*y^3*z + x^3*y^3*z"),
317                 ("27",
318                  "-x + x^3 - y + x^2*y",
319                  "x^3 + x^2*y - 2*x^2*z - 2*x*y*z + x*z^2 + y*z^2",
320                  "-x^3 + x^5 - x^2*y + x^4*y + 2*x^2*z - 2*x^4*z + 2*x*y*z - 2*x^3*y*z - x*z^2 + x^3*z^2 - y*z^2 + x^2*y*z^2"),
321                 ("29",
322                  "y + x*y + z + x*z",
323                  "x^2 + x^3 - 2*x*y - 2*x^2*y + y^2 + x*y^2",
324                  "x^2*y + x^3*y - 2*x*y^2 - 2*x^2*y^2 + y^3 + x*y^3 + x^2*z + x^3*z - 2*x*y*z - 2*x^2*y*z + y^2*z + x*y^2*z"),
325                 ("30",
326                  "x*y*z + x^2*y*z",
327                  "x^4*y^2 - x^3*y^3",
328                  "- x^4*y^2*z - x^5*y^2*z + x^3*y^3*z + x^4*y^3*z"),
329                 ("31",
330                  "x*y^2",
331                  "x^4*y^3*z",
332                  "x^4*y^3*z"),
333                 ("32",
334                  "x^4*y^2 + x^4*y*z",
335                  "y + x*y + z + x*z",
336                  "x^4*y^2 + x^5*y^2 + x^4*y*z + x^5*y*z"),
337                 ("33",
338                  "x^5*y + x^4*y^2",
339                  "x*y^3*z + 2*x*y^2*z^2 + x*y*z^3",
340                  "x^5*y^3*z + x^4*y^4*z + 2*x^5*y^2*z^2 + 2*x^4*y^3*z^2 + x^5*y*z^3 + x^4*y^2*z^3"),
341                 ("34",
342                  "x^4",
343                  "-x^3 + x^4 + x^2*y - x^3*y",
344                  "x^5 - x^6 - x^4*y + x^5*y"),
345                 ("35",
346                  "-x^3 - x^4 + x^2*z + x^3*z",
347                  "x^2 - x^3 - x*y + x^2*y - x*z + x^2*z + y*z - x*y*z",
348                  "-x^4 + x^6 + x^3*y - x^5*y + x^3*z - x^5*z - x^2*y*z + x^4*y*z"),
349                 ("36",
350                  "x^3*y^3*z + x^2*y^4*z",
351                  "-x^3 - x^4 + x^2*z + x^3*z",
352                  "- x^4*y^3*z - x^5*y^3*z - x^3*y^4*z - x^4*y^4*z + x^3*y^3*z^2 + x^4*y^3*z^2 + x^2*y^4*z^2 + x^3*y^4*z^2"),
353                 ("37",
354                  "x^3*y^2*z + x^3*y*z^2",
355                  "y + z",
356                  "x^3*y^2*z + x^3*y*z^2"),
357                 ("38",
358                  "x^4*y^2 + x^3*y^3",
359                  "x*y + y^2 + x*z + y*z",
360                  "x^4*y^3 + x^3*y^4 + x^4*y^2*z + x^3*y^3*z"),
361                 ("39",
362                  "x^4*y^3 + x^3*y^4",
363                  "x*y^2 + 2*x^2*y^2 + x^3*y^2",
364                  "x^4*y^3 + 2*x^5*y^3 + x^6*y^3 + x^3*y^4 + 2*x^4*y^4 + x^5*y^4"),
365                 ("40",
366                  "-x^3 + 3*x^2*z - 3*x*z^2 + z^3",
367                  "-x^2 + x^4",
368                  "x^5 - x^7 - 3*x^4*z + 3*x^6*z + 3*x^3*z^2 - 3*x^5*z^2 - x^2*z^3 + x^4*z^3"),
369                 ("41",
370                  "x^3*y^3 + x^4*y^3",
371                  "x^4*y^2",
372                  "x^4*y^3 + x^5*y^3"),
373                 ("42",
374                  "-x^2 - x^3 + x*y + x^2*y + x*z + x^2*z - y*z - x*y*z",
375                  "x^3*y*z - x*y^3*z",
376                  "x^4*y*z + x^5*y*z - x^2*y^3*z - x^3*y^3*z - x^3*y*z^2 - x^4*y*z^2 + x*y^3*z^2 + x^2*y^3*z^2"),
377                 ("44",
378                  "x^2*y^2*z + x*y^3*z + x^2*y*z^2 + x*y^2*z^2",
379                  "x^2*y^2*z^2 + x^3*y^2*z^2",
380                  "x^3*y^3*z^2 + x^4*y^3*z^2 + x^2*y^4*z^2 + x^3*y^4*z^2 + x^3*y^2*z^3 + x^4*y^2*z^3 + x^2*y^3*z^3 + x^3*y^3*z^3"),
381                 ("45",
382                  "x^5*y^2*z",
383                  "x*y^2*z + x^2*y^2*z + x*y*z^2 + x^2*y*z^2",
384                  "x^5*y^3*z + x^6*y^3*z + x^5*y^2*z^2 + x^6*y^2*z^2"),
385                 ("46",
386                  "-x^3 + x*y^2 + x^2*z - y^2*z",
387                  "x^3*y^2 - x*y^4",
388                  "x^4*y^2 - x^2*y^4 - x^3*y^2*z + x*y^4*z"),
389                 ("47",
390                  "-x - x^2 + z + x*z",
391                  "x^4*y^2 + x^3*y^3",
392                  "- x^5*y^2 - x^6*y^2 - x^4*y^3 - x^5*y^3 + x^4*y^2*z + x^5*y^2*z + x^3*y^3*z + x^4*y^3*z"),
393                 ("48",
394                  "x^4*y^2",
395                  "x^4*y - x^2*y^3",
396                  "-x^6*y^2 + x^4*y^4"),
397                 ("49",
398                  "x^4*y^2*z + x^3*y^3*z",
399                  "x^4*y",
400                  "x^5*y^2*z + x^4*y^3*z"),
401                 ("50",
402                  "x^4*y^2*z^2",
403                  "x^4*y - 2*x^3*y^2 + x^2*y^3",
404                  "x^6*y^2*z^2 - 2*x^5*y^3*z^2 + x^4*y^4*z^2"),
405                 ("51",
406                  "x^3*y*z + 2*x^2*y^2*z + x*y^3*z",
407                  "x^3*y^3*z - x^2*y^4*z",
408                  "- x^5*y^3*z - x^4*y^4*z + x^3*y^5*z + x^2*y^6*z"),
409                 ("52",
410                  "-x^2 - x*y + x*z + y*z",
411                  "x^4*y^3 + x^3*y^4",
412                  "- x^5*y^3 - x^4*y^4 + x^4*y^3*z + x^3*y^4*z"),
413                 ("53",
414                  "-x^3 + x^2*z",
415                  "x^4 - x^2*y^2",
416                  "x^5 - x^3*y^2 - x^4*z + x^2*y^2*z"),
417                 ("54",
418                  "x^4*y^3 - x^3*y^4",
419                  "x^2*y^4*z + x^2*y^3*z^2",
420                  "-x^4*y^4*z + x^3*y^5*z - x^4*y^3*z^2 + x^3*y^4*z^2"),
421                 ("55", "1", "1", "1"),
422                 ("55", "2", "3", "1"),
424         ][:]
426         for (id, fs, gs, exps) : inputs
427                 var f = auto std.try(yakmo.polynomialfromS(fs))
428                 var g = auto std.try(yakmo.polynomialfromS(gs))
429                 var exp = auto std.try(yakmo.polynomialfromS(exps))
431                 var act = yakmo.lcm(f, g)
432                 testr.check(c, std.eq(exp, act), "{}: expected lcm(  {}  ,   {}  ) to be {}, was {}", id, fs, gs, exp, act)
433         ;;
436 const lcm02 = {c
437         var a_str = std.strjoin([
438                 "19104670425305164606640959687010349754528570061866115",
439                 "26046033144178272757679170191595259851939658340508506",
440                 "04628457416900266249028333602056540585550668802542632",
441                 "48606225543691036168823145797323883329876304653072214",
442                 "39891390745965121128977813098908621103772018491571031",
443                 "71786948079915430420148613011746059467750134983407008",
444                 "77358712515882121018468321606235121606262709444632613",
445                 "13716698797703388154454187876651872630380019127528940",
446                 "02662490928298442301687332710068169864741312886576707",
447                 "39151023517856491368585673783910216357765605796880189",
448                 "84554764848415406257121448083536319562662440652295253",
449                 "80270183630160646028040916074226122535406844285214191",
450                 "90374274469154055794278982790075068640288009649949851",
451                 "24030823491716705281794499539762805718545501654739403",
452                 "15744225794206368770257662228643122409522247384780267",
453                 "13086964546856430932978920642908624770455318423385061",
454                 "17489512813259080533500496687811090052050663507923168",
455                 "45482213224576436061130351262021502810238931168149922",
456                 "66436086308684093211917306197487317939394321593421373",
457                 "33058538840796877054636781033459627694062854752324993",
458                 "54731331139096582654289934040495590165267304002945914",
459                 "62527936606870140737937111986089072688610529730388162",
460                 "13023944164349778320828796366203845913098289590424454",
461                 "98981842382953923172644100653249094555260875718425505",
462                 "81855009112898127593082276475900261221232578617369568",
463                 "65176769477121708728356351606428598074827351976058015",
464                 "90627964047498322605289995869696461412066552046028432",
465                 "56573564590727863271976858193188890689253792122561989",
466                 "82023278560667087835485360603050343830737882471647447",
467                 "21140068315946464845310666121995484847062875913905593",
468                 "02306171450156853663300036179979894268374622640701071",
469                 "38979658865857942540674312992217018977399372424354460",
470                 "87327526649148555309810194020252572168626245206435176",
471                 "00787688636080560171680021701071760440397327367174261",
472                 "36393256714074183782005612877312887490791951972230505",
473                 "46789923597823270977826230908694387602694980375424092",
474                 "01600099711191023176253133385122417674417936012025603",
475                 "62129834026230143314711896785090099951842051024764270",
476                 "08918145200749840120479652987103375946463517687290288",
477                 "98292890910573669422806303838517225334302689446311111",
478                 "68390986181110828211605390830961361777258851338924631",
479                 "44879850611640855405046477093239467273001021222606583",
480                 "30936460940366115093317564862209609677929177724711514",
481                 "27757355115066248168184349231234919635812455348701390",
482                 "87205322361975735937289012761326495566956652864619277",
483                 "32579944377606186055680121123108381629244694807530722",
484                 "68487817261980872196055695764982043925759762218202345",
485                 "60043413306199019749216259539822590393874382988033836",
486                 "49147205544147769272788770279390901184318950635986887",
487                 "43954154124805793949597020405237956618132614165809382",
488                 "76409706341996695817015245582544204465190842892081370",
489                 "09791521084533069895193697888908955206436367592377623",
490                 "39435989450755183597431209034488898684267377902704402",
491                 "38662856236716417263007430572626968509227204564808308",
492                 "11849782598489350090699062334202619884625435285106247",
493                 "90963375764385967557832039766794447718441817283741759",
494                 "51460042892131830992469482613848329609839756569266412",
495                 "00054859634288421513332369871507172166404646689515726",
496                 "85568306913802119547556763169364356408232733979665579",
497                 "0305629390406402471330117561685935726465463810301002",
498         ][:], "")
499         var b_str = std.strjoin([
500                 "47761676063262911516602399217525874386321425154665288",
501                 "15115082860445681894197925478988149629849145851271265",
502                 "11571143542250665622570834005141351463876672006356581",
503                 "21515563859227590422057864493309708324690761632680535",
504                 "99728476864912802822444532747271552759430046228927579",
505                 "29467370199788576050371532529365148669375337458517521",
506                 "93396781289705302546170804015587804015656773611581532",
507                 "84291746994258470386135469691629681575950047818822350",
508                 "06656227320746105754218331775170424661853282216453580",
509                 "65118148374602730789292890088436127799192248462538157",
510                 "76171592220367477514113981813653827598879760324678015",
511                 "72569856934779854551039387447180998052960720088078298",
512                 "42486705399640002154282828138332380855908419701919315",
513                 "02855524771559401066085266481423224233184788362596214",
514                 "39753616711901860991324869331091946538920682695124802",
515                 "33719653300233933573028597737029655482519780558972068",
516                 "41761255888349979620722669682379502906421413721274536",
517                 "07774880279600751561700075952352952194746453979290876",
518                 "06643353537819940644614346346590629348820966261361536",
519                 "18621718551829108419152857610777116856221800841892805",
520                 "54896006553469590353145911744527918191690198246905490",
521                 "08776081137158263008676945661337677696858836060625930",
522                 "00581424521378490526686848392051316637950699748991409",
523                 "97048436055200446594903714717200168715334823804386248",
524                 "94114717962858589975244350229780928217044677081910810",
525                 "10053040285027441278009566098641725724410502962651983",
526                 "63378189596000577100868533735270549253221004238630110",
527                 "34410951016223541591647505563407428973527480862730419",
528                 "48215419973738776139123660977545095685691592364042285",
529                 "72402422245210061447962179132483232416738707244968666",
530                 "15382463529233092119349386365840829919388146375142434",
531                 "92251769719620118604245696007319248735435765087168721",
532                 "73816633031653209518688172019063193821707171208006318",
533                 "10314592152327618572654822230646091394187603281830003",
534                 "67882788417029612294479753218148244558786225211270430",
535                 "45790288018336089099176286245633831419169671095017866",
536                 "38622399641099027175118634426688825552372925472967936",
537                 "14601046311341360206178941376456435552044889045555886",
538                 "37635772559572879390630570340582421089174267059560715",
539                 "92287217926929420512849362802122104770057272317401878",
540                 "59135427046675986730664719255646646397096873355840994",
541                 "58004283168449927332759192791832329997748257711081749",
542                 "54597553268672156753140531672573737613066211881553092",
543                 "03889089688821313658206999054353222567308795097833296",
544                 "43416055667258561768990862941439862150867248450664003",
545                 "05255462550283686482441560101688961892391651209427520",
546                 "11382297126051476478287137158164324634775338021281466",
547                 "45195693925800435870896147592790092451606074857395888",
548                 "31150920176000392037177984559567254014388345256461299",
549                 "00294381200771954440643352341394536370784392549170280",
550                 "16765366044736880797006711488664713556913490609498901",
551                 "54308916480821203853215685949910005729466899434331462",
552                 "77967667330640003307996836786156595366016851000657389",
553                 "30298314558992450342884430917553475004549808753299358",
554                 "99403507520649449537235572123014892303371660075494187",
555                 "87542003580910131906007046129152017846498253473093230",
556                 "64464058711933149092574093956748207461240934546482067",
557                 "59438789833656044800729445020310853023788651682061298",
558                 "70144239526669133440641565177676466580598106832762906",
559                 "0689094700957629172391295771295877146289233486907065",
560         ][:], "")
562         var p1 = std.try(yakmo.polynomialfromS(a_str))
563         var p2 = std.try(yakmo.polynomialfromS(b_str))
565         /*
566            The test here is really that this completes without the
567            test-runner getting impatient and killing it.
568          */
569         var lcm = yakmo.lcm(p1, p2)
570         var act = std.fmt("{}", lcm)
571         var exp = "1"
572         testr.check(c, std.eq(exp, act), "expected lcm(<huge 1>, <huge 2>) to be {}, was {}", exp, act)