1 | initial version |

I am not very familiar with the case when `R`

is not a field, so let me try to answer the case when `R`

is a field.

If `R`

is a field and `I`

is a zero-dimensional ideal, then `R/I`

is a finite dimensional vector space and a basis can be computed using the method `normal_basis`

:

```
sage: R.<x,y,z> = QQ[]
sage: I = R.ideal([x^2 + y^2 - 1, z^3, z - x^3])
sage: I.dimension()
0
sage: I.normal_basis()
[y^3*z^2, y^2*z^2, x*y*z^2, y*z^2, x*z^2, z^2, y^3*z, y^2*z, x*y*z, y*z, x*z, z, y^3, y^2, x*y, y, x, 1]
```

If the ideal is of positive dimension, then Sage does not currently have a way to compute this directly. However, we can use Singular for this. Given a GrÃ¶bner basis of an ideal, the function kbase can be used to find the finitely-many monomials of certain degree in a vector space basis of this infinite-dimensional space. Let us define a wrapper function:

```
def kbasis(I, d):
gb = I.groebner_basis()
# the Singular interface works with ideals, but in Sage we prefer
# polynomial sequences, so we need these conversions
return singular.kbase(gb.ideal(), d).sage().gens()
```

Now we get:

```
sage: R.<x,y,z> = QQ[]
sage: I = R.ideal([x^2 + y^2 - 1, z^3])
sage: kbasis(I, 0)
[1]
sage: kbasis(I, 1)
[z, y, x]
sage: kbasis(I, 2)
[z^2, y*z, x*z, y^2, x*y]
sage: kbasis(I, 3)
[y*z^2, x*z^2, y^2*z, x*y*z, y^3, x*y^2]
```

In Sage, we can now even construct the infinite union over all degrees of these finite sets, which might be convenient for some purposes:

```
sage: D = DisjointUnionEnumeratedSets(Family(NN, lambda d: kbasis(I, d), name='kbasis_I'))
sage: D
Disjoint union of Lazy family (kbasis_I(i))_{i in Non negative integer semiring}
sage: D[0:15]
[1, z, y, x, z^2, y*z, x*z, y^2, x*y, y*z^2, x*z^2, y^2*z, x*y*z, y^3, x*y^2]
```

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.