1 | initial version |
Firstly, F = PolynomialRing(GF(3),'x')
defines a polynomial ring F
in one variable, where the variable is internally named 'x'
. To access the variable, the generator of the ring, you use F.gen()
; it is natural to assign it to a variable x
, i.e. x = F.gen()
. A convenient shorthand notation for use in Sage scripts/notebooks (but not usable in Python .py
files) is F.<x> = PolynomialRing(GF(3),'x')
; Sage's pre-parser expands this to (pretty much) the two aforementioned definitions of F
and x
.
To approach your problem you can do something like this:
p = 3
A.<d1a,d1b,d2a,d2b,d3a,d3b,r1a,r1b,r2a,r2b,r3a,r3b> = PolynomialRing(GF(p))
R.<X> = PolynomialRing(A)
S.<x> = R.quotient(X^2)
laplacian = matrix([[d1a*x + d1b, -1, 0], [-1, d2a*x + d2b, -1], [0, -1, d3a*x + d3b]])
r = vector([r1a*x + r1b, r2a*x + r2b, r3a*x + r3b])
err_vec = laplacian*r
err_polys = sum((entry.lift().coefficients() for entry in err_vec), [])
I = A.ideal(err_polys)
Here I manually expanded d1 = d1a*x + d1b
etc.
To get all pairs of solutions (d, r)
you can do e.g.:
sage: J = I + A.ideal([v^p - v for v in A.gens()])
sage: J.variety()
[{r3b: 0, r3a: 0, r2b: 0, r2a: 0, r1b: 0, r1a: 0, d3b: 0, d3a: 0, d2b: 0, d2a: 0, d1b: 0, d1a: 0},
{r3b: 0, r3a: 0, r2b: 0, r2a: 0, r1b: 0, r1a: 0, d3b: 0, d3a: 0, d2b: 0, d2a: 0, d1b: 0, d1a: 2},
{r3b: 0, r3a: 0, r2b: 0, r2a: 0, r1b: 0, r1a: 0, d3b: 0, d3a: 0, d2b: 0, d2a: 0, d1b: 0, d1a: 1},
...
{r3b: 1, r3a: 1, r2b: 1, r2a: 1, r1b: 1, r1a: 0, d3b: 1, d3a: 0, d2b: 2, d2a: 2, d1b: 1, d1a: 1},
{r3b: 1, r3a: 1, r2b: 1, r2a: 1, r1b: 1, r1a: 2, d3b: 1, d3a: 0, d2b: 2, d2a: 1, d1b: 1, d1a: 2},
{r3b: 1, r3a: 1, r2b: 1, r2a: 1, r1b: 1, r1a: 1, d3b: 1, d3a: 0, d2b: 2, d2a: 0, d1b: 1, d1a: 0}]
sage: len(J.variety())
1485
To get more insight into the solution set you can look at the primary decomposition:
sage: I.associated_primes()
[Ideal (r3b, r3a, r2b, r2a, r1b, r1a) of Multivariate Polynomial Ring in d1a, d1b, d2a, d2b, d3a, d3b, r1a, r1b, r2a, r2b, r3a, r3b over Finite Field of size 3,
Ideal (r3b, r2b, r1b, d3b*r3a - r2a, d2b*r2a - r1a - r3a, d1b*r1a - r2a, d1b*d2b*d3b - d1b - d3b) of Multivariate Polynomial Ring in d1a, d1b, d2a, d2b, d3a, d3b, r1a, r1b, r2a, r2b, r3a, r3b over Finite Field of size 3,
Ideal (d3b*r3b - r2b, d3b*r3a + d3a*r3b - r2a, d2b*r2b - r1b - r3b, d2b*r2a + d2a*r2b - r1a - r3a, d1b*r1b - r2b, d1b*r1a + d1a*r1b - r2a, d3a*r3b^2 + r2b*r3a - r2a*r3b, d2a*r2b^2 + r1b*r2a - r1a*r2b - r2b*r3a + r2a*r3b, d1a*r1b^2 - r1b*r2a + r1a*r2b, d1b*d2b*d3b - d1b - d3b, d1b*d2b*d3a + d1b*d2a*d3b + d1a*d2b*d3b - d1a - d3a, d1b*d2a*d3b*r2b + d1a*d3b*r1b + d1b*d3a*r3b, d1b*d2a*d3b*r2a - d1b*d2a*d3a*r2b - d1a*d2a*d3b*r2b + d1a*d3b*r1a - d1a*d3a*r1b + d1b*d3a*r3a - d1a*d3a*r3b, d1a*d2b*d3b*r1b + d2a*d3b*r2b - d1a*r1b + d3a*r3b, d1a*d2b*d3b*r1a - d1a*d2b*d3a*r1b - d1a*d2a*d3b*r1b + d2a*d3b*r2a - d2a*d3a*r2b - d1a*r1a + d3a*r3a, d1b*d2a*d3b^2 + d1a*d2b*d3b^2 + d1b*d3a - d1a*d3b, d1b*d2a*d3a*r2b*r3b - d1b*d2a*r2a*r2b + d1a*d3a*r1b*r3b - d1b*d3a*r3a*r3b - d1a*r1b*r2a, d1a*d2b*d3a*r1b*r3b + d1a*d2a*r1b*r2b + d2a*d3a*r2b*r3b - d1a*r1a*r1b - d2a*r2a*r2b - d3a*r3a*r3b, d1b*d2a*d3a*r2b*r3a + d1b*d2a*d3a*r2a*r3b - d1a*d2a*d3a*r2b*r3b - d1b*d2a*r2a^2 + d1a*d2a*r2a*r2b + d1a*d3a*r1b*r3a - d1b*d3a*r3a^2 + d1a*d3a*r1a*r3b + d1a*d3a*r3a*r3b - d1a*r1a*r2a, d1a*d2b*d3a*r1b*r3a + d1a*d2b*d3a*r1a*r3b - d1a*d2a*d3a*r1b*r3b + d1a*d2a*r1b*r2a + d1a*d2a*r1a*r2b + d2a*d3a*r2b*r3a + d2a*d3a*r2a*r3b - d1a*r1a^2 - d2a*r2a^2 - d3a*r3a^2, d1a*d2a*d3b*r1b*r2b - d1a*d3b*r1a*r1b - d2a*d3b*r2a*r2b + d1a*d3a*r1b*r3b - d3a*r2a*r3b, d1a*d2a*d3b*r1b*r2a + d1a*d2a*d3b*r1a*r2b - d1a*d2a*d3a*r1b*r2b - d1a*d3b*r1a^2 + d1a*d3a*r1a*r1b - d2a*d3b*r2a^2 + d2a*d3a*r2a*r2b + d1a*d3a*r1b*r3a + d1a*d3a*r1a*r3b - d3a*r2a*r3a, d1a*d2b^2*d3b^2 + d1a*d2b*d3b + d2a*d3b^2 + d1a + d3a, d1a*d2a*d3a*r1b*r2b*r3b - d1a*d2a*r1b*r2a*r2b - d1a*d3a*r1a*r1b*r3b - d2a*d3a*r2a*r2b*r3b - d1a*d3a*r1b*r3a*r3b + d1a*r1a*r1b*r2a + d2a*r2a^2*r2b + d3a*r2a*r3a*r3b, d1a*d2a*d3a*r1b*r2b*r3a + d1a*d2a*d3a*r1b*r2a*r3b + d1a*d2a*d3a*r1a*r2b*r3b - d1a*d2a*r1b*r2a^2 - d1a*d2a*r1a*r2a*r2b - d1a*d3a*r1a*r1b*r3a - d2a*d3a*r2a*r2b*r3a - d1a*d3a*r1b*r3a^2 - d1a*d3a*r1a^2*r3b - d2a*d3a*r2a^2*r3b - d1a*d3a*r1a*r3a*r3b + d1a*r1a^2*r2a + d2a*r2a^3 + d3a*r2a*r3a^2) of Multivariate Polynomial Ring in d1a, d1b, d2a, d2b, d3a, d3b, r1a, r1b, r2a, r2b, r3a, r3b over Finite Field of size 3]
... or the intersection of those components with d
-space:
sage: [P.elimination_ideal(A.gens()[6:]).gens() for P in I.associated_primes()]
[[0],
[d1b*d2b*d3b - d1b - d3b],
[d1b*d2b*d3b - d1b - d3b, d1b*d2b*d3a + d1b*d2a*d3b + d1a*d2b*d3b - d1a - d3a, d1b*d2a*d3b^2 + d1a*d2b*d3b^2 + d1b*d3a - d1a*d3b, d1a*d2b^2*d3b^2 + d1a*d2b*d3b + d2a*d3b^2 + d1a + d3a]]
This shows r = (0, 0, 0)
is always a solution for any d
(as expected), and there are other solutions when laplacian.determinant()
vanishes, and other solutions when only the constant part of laplacian.determinant()
vanishes (d1b*d2b*d3b - d1b - d3b = 0
).
We can count the solutions with these properties, as a double check:
sage: len([p for p in J.variety() if all(p[v] == 0 for v in A.gens()[6:])])
729
sage: len([p for p in J.variety() if not all(p[v] == 0 for v in A.gens()[6:]) and laplacian.determinant().lift().map_coefficients(lambda c: c.subs(p)) == 0])
504
sage: len([p for p in J.variety() if not all(p[v] == 0 for v in A.gens()[6:]) and laplacian.determinant().lift().map_coefficients(lambda c: c.subs(p)) != 0 and (d1b*d2b*d3b - d1b - d3b).subs(p) == 0])
252
sage: 729 + 504 + 252
1485