1 | initial version |

You don't have to declare any symbols to solve the problem that you want to solve. (See the XY problem.)

Instead, proceed as follows:

```
F.<t>=GF(2^3)
R.<X,Y,Z> = PolynomialRing(F)
f = X^2*Y^2 - (X^2+(1+t)*Y^2)
g = f.homogenize(Z)
C = Curve(g)
sols = [P.dehomogenize(2) for P in C.rational_points() if P[2] != 0]
```

If you want them as pairs of vectors:

```
sage: [map(vector, sol) for sol in sols]
[[(0, 0, 0), (0, 0, 0)],
[(1, 0, 0), (1, 1, 0)],
[(0, 1, 0), (0, 0, 1)],
[(1, 1, 0), (0, 1, 0)],
[(0, 0, 1), (1, 0, 1)],
[(1, 0, 1), (1, 1, 1)],
[(0, 1, 1), (0, 1, 1)]]
```

Note that `C.rational_points()`

is a "slow" Python implementation, but it works fine when the degree of `F`

is not too big.

2 | No.2 Revision |

You don't have to declare any symbols to solve the problem that you want to solve. (See the XY problem.)

Instead, proceed as follows:

```
F.<t>=GF(2^3)
```~~R.<X,Y,Z> ~~R.<X,Y> = PolynomialRing(F)
f = X^2*Y^2 - (X^2+(1+t)*Y^2)
~~g = f.homogenize(Z)
~~C = ~~Curve(g)
~~Curve(f)
sols = ~~[P.dehomogenize(2) for P in C.rational_points() if P[2] != 0]
~~C.rational_points()

If you want them as pairs of vectors:

```
sage: [map(vector, sol) for sol in sols]
[[(0, 0, 0), (0, 0, 0)],
[(1, 0, 0), (1, 1, 0)],
[(0, 1, 0), (0, 0, 1)],
[(1, 1, 0), (0, 1, 0)],
[(0, 0, 1), (1, 0, 1)],
[(1, 0, 1), (1, 1, 1)],
[(0, 1, 1), (0, 1, 1)]]
```

Note that `C.rational_points()`

is a "slow" Python implementation, but it works fine when the degree of `F`

is not too big.

3 | No.3 Revision |

You don't have to declare any symbols to solve the problem that you want to solve. (See the XY problem.)

Instead, proceed as follows:

```
F.<t>=GF(2^3)
R.<X,Y> = PolynomialRing(F)
f = X^2*Y^2 - (X^2+(1+t)*Y^2)
C = Curve(f)
sols = C.rational_points()
```

If you want them as pairs of vectors:

```
sage: [map(vector, sol) for sol in sols]
[[(0, 0, 0), (0, 0, 0)],
[(1, 0, 0), (1, 1, 0)],
[(0, 1, 0), (0, 0, 1)],
[(1, 1, 0), (0, 1, 0)],
[(0, 0, 1), (1, 0, 1)],
[(1, 0, 1), (1, 1, 1)],
[(0, 1, 1), (0, 1, 1)]]
```

Note that `C.rational_points()`

is a "slow" Python implementation, but it works fine when the degree of `F`

is not too big.

To answer your question about symbols, you can do the following:

```
R.<a1,b1,c1,a2,b2,c2> = BooleanPolynomialRing()
S.<s> = PolynomialRing(R)
T.<t> = S.quotient(conway_polynomial(2,3).change_variable_name('s'))
X = a1 + b1*t + c1*t^2
Y = a2 + b2*t + c2*t^2
f = X^2*Y^2 - (X^2+(1+t)*Y^2)
```

Then you have:

```
sage: R.ideal(list(f)).variety()
[{c2: 0, b2: 0, a2: 0, b1: 0, c1: 0, a1: 0},
{c2: 0, b2: 1, a2: 0, b1: 1, c1: 0, a1: 1},
{c2: 0, b2: 1, a2: 1, b1: 0, c1: 0, a1: 1},
{c2: 1, b2: 0, a2: 0, b1: 1, c1: 0, a1: 0},
{c2: 1, b2: 0, a2: 1, b1: 0, c1: 1, a1: 0},
{c2: 1, b2: 1, a2: 0, b1: 1, c1: 1, a1: 0},
{c2: 1, b2: 1, a2: 1, b1: 0, c1: 1, a1: 1}]
```

4 | No.4 Revision |

Instead, proceed as follows:

```
F.<t>=GF(2^3)
R.<X,Y> = PolynomialRing(F)
f = X^2*Y^2 - (X^2+(1+t)*Y^2)
C = Curve(f)
sols = C.rational_points()
```

If you want them as pairs of vectors:

```
sage: [map(vector, sol) for sol in sols]
[[(0, 0, 0), (0, 0, 0)],
[(1, 0, 0), (1, 1, 0)],
[(0, 1, 0), (0, 0, 1)],
[(1, 1, 0), (0, 1, 0)],
[(0, 0, 1), (1, 0, 1)],
[(1, 0, 1), (1, 1, 1)],
[(0, 1, 1), (0, 1, 1)]]
```

`C.rational_points()`

is a "slow" Python implementation, but it works fine when the degree of `F`

is not too big.

To answer your question about symbols, you can do the following:

```
R.<a1,b1,c1,a2,b2,c2> = BooleanPolynomialRing()
S.<s> = PolynomialRing(R)
```~~T.<t> = S.quotient(conway_polynomial(2,3).change_variable_name('s'))
~~from sage.rings.polynomial.polynomial_quotient_ring import PolynomialQuotientRing_generic
T = PolynomialQuotientRing_generic(S, S(conway_polynomial(2,3).change_variable_name('s')), 't')
t = T.gen()
X = a1 + b1*t + c1*t^2
Y = a2 + b2*t + c2*t^2
f = X^2*Y^2 - (X^2+(1+t)*Y^2)

Then you have:

```
sage: R.ideal(list(f)).variety()
[{c2: 0, b2: 0, a2: 0, b1: 0, c1: 0, a1: 0},
{c2: 0, b2: 1, a2: 0, b1: 1, c1: 0, a1: 1},
{c2: 0, b2: 1, a2: 1, b1: 0, c1: 0, a1: 1},
{c2: 1, b2: 0, a2: 0, b1: 1, c1: 0, a1: 0},
{c2: 1, b2: 0, a2: 1, b1: 0, c1: 1, a1: 0},
{c2: 1, b2: 1, a2: 0, b1: 1, c1: 1, a1: 0},
{c2: 1, b2: 1, a2: 1, b1: 0, c1: 1, a1: 1}]
```

Morally I think it should be possible (and it was in 8.1) to construct `T`

by

```
T.<t> = S.quotient(conway_polynomial(2,3).change_variable_name('s'))
```

but it seems this is no longer the case. Probably it is a bug; I will investigate.

5 | No.5 Revision |

Instead, proceed as follows:

```
F.<t>=GF(2^3)
R.<X,Y> = PolynomialRing(F)
f = X^2*Y^2 - (X^2+(1+t)*Y^2)
C = Curve(f)
sols = C.rational_points()
```

If you want them as pairs of vectors:

```
sage: [map(vector, sol) for sol in sols]
[[(0, 0, 0), (0, 0, 0)],
[(1, 0, 0), (1, 1, 0)],
[(0, 1, 0), (0, 0, 1)],
[(1, 1, 0), (0, 1, 0)],
[(0, 0, 1), (1, 0, 1)],
[(1, 0, 1), (1, 1, 1)],
[(0, 1, 1), (0, 1, 1)]]
```

`C.rational_points()`

is a "slow" Python implementation, but it works fine when the degree of `F`

is not too big.

To answer your question about symbols, you can do the following:

```
R.<a1,b1,c1,a2,b2,c2> = BooleanPolynomialRing()
S.<s> = PolynomialRing(R)
from sage.rings.polynomial.polynomial_quotient_ring import PolynomialQuotientRing_generic
T = PolynomialQuotientRing_generic(S, S(conway_polynomial(2,3).change_variable_name('s')), 't')
t = T.gen()
X = a1 + b1*t + c1*t^2
Y = a2 + b2*t + c2*t^2
f = X^2*Y^2 - (X^2+(1+t)*Y^2)
```

Then you have:

```
sage: R.ideal(list(f)).variety()
[{c2: 0, b2: 0, a2: 0, b1: 0, c1: 0, a1: 0},
{c2: 0, b2: 1, a2: 0, b1: 1, c1: 0, a1: 1},
{c2: 0, b2: 1, a2: 1, b1: 0, c1: 0, a1: 1},
{c2: 1, b2: 0, a2: 0, b1: 1, c1: 0, a1: 0},
{c2: 1, b2: 0, a2: 1, b1: 0, c1: 1, a1: 0},
{c2: 1, b2: 1, a2: 0, b1: 1, c1: 1, a1: 0},
{c2: 1, b2: 1, a2: 1, b1: 0, c1: 1, a1: 1}]
```

Morally I think it should be possible (and it was in 8.1) to construct `T`

by

```
T.<t> = S.quotient(conway_polynomial(2,3).change_variable_name('s'))
```

but it seems this is no longer the case. ~~Probably it ~~This is a ~~bug; I will investigate.~~

Copyright Sage, 2010. Some rights reserved under creative commons license. Content on this site is licensed under a Creative Commons Attribution Share Alike 3.0 license.