sage: singular.lib('brnoeth.lib') sage: R = singular.ring(5, '(x,y)', 'lp') sage: f = singular.new('y^2 - x^9 - x') sage: X1 = f.Adj_div() sage: X2 = singular.NSplaces(1, X1) sage: X3 = singular.extcurve(1, X2) sage: R = X3[1][5] sage: singular.set_ring(R) sage: L = singular.new('POINTS')
sage: [(L[i][1], L[i][2], L[i][3]) for i in range(1,7)] [(0, 1, 0), (-2, 1, 1), (0, 0, 1), (2, 2, 1), (-2, -1, 1), (2, -2, 1)]
name
method of a Singular object returns the name
of that object in the Singular interpreter, so that it can
be used as input to a Singular function.
Next we implement the general function (we omit the docstring, which
is the same as above). Note that the point_parser
function
is not required.
def places_on_curve(f,F): p = F.characteristic() if F.degree() > 1: raise NotImplementedError singular.lib('brnoeth.lib') R = singular.ring(5, '(x,y)', 'lp') f = singular.new('y^2 - x^9 - x') X1 = f.Adj_div() X2 = singular.NSplaces(1, X1) X3 = singular.extcurve(1, X2) R = X3[1][5] singular.setring(R) L = singular.new('POINTS') return [(int(L[i][1]), int(L[i][2]), int(L[i][3])) \ for i in range(1,int(L.size())+1)]
This code is much shorter, nice, and more readable. However, it depends
on certain functions, e.g., singular.setring
having been implemented
in the Sage/Singular interface, whereas the code in the previous section
used only the barest minimum of that interface.
See About this document... for information on suggesting changes.