In cases like is_prime
, there is a function with that name in the global namespace, and also some objects have a method called that. What the global function does is usually deal with some special cases, then check if the argument you entered for the function is an object that has a method with the same name, and then apply this method to that object.
You can inspect the source code for the global function is_prime
:
sage: is_prime??
You can see that it's not the same as the source code for the method is_prime
of an integer.
sage: a = 5
sage: a.is_prime??
In cases like small_roots
, it doesn't make sense to have it as a global function in the global namespace. It can only be called as a method, for those objects which have such a method.
If f
has a method small_roots
, then you can access the documentation by
sage: f.small_roots?
and the source code by
sage: f.small_roots??
If you don't have an object with that method, you can do
sage: search_doc("small_roots")
or
sage: search_src("small_roots")
to get an idea of where in the documentation, resp. where in the source code, this string appears.
For instance, I get:
sage: search_src("small_roots")
rings/polynomial/polynomial_modn_dense_ntl.pyx:373: def small_roots(self, *args, **kwds):
rings/polynomial/polynomial_modn_dense_ntl.pyx:375: See :func:`sage.rings.polynomial.polynomial_modn_dense_ntl.small_roots`
rings/polynomial/polynomial_modn_dense_ntl.pyx:384: sage: f.small_roots()
rings/polynomial/polynomial_modn_dense_ntl.pyx:387: return small_roots(self, *args, **kwds)
rings/polynomial/polynomial_modn_dense_ntl.pyx:389:def small_roots(self, X=None, beta=1.0, epsilon=None, **kwds):
rings/polynomial/polynomial_modn_dense_ntl.pyx:443: sage: f.small_roots()
rings/polynomial/polynomial_modn_dense_ntl.pyx:484: sage: Kbar = f.small_roots()[0]
rings/polynomial/polynomial_modn_dense_ntl.pyx:513: sage: d = f.small_roots(X=2^hidden-1, beta=0.5)[0] # time random
rings/polynomial/polynomial_zmod_flint.pyx:353: def small_roots(self, *args, **kwds):
rings/polynomial/polynomial_zmod_flint.pyx:355: See :func:`sage.rings.polynomial.polynomial_modn_dense_ntl.small_roots`
rings/polynomial/polynomial_zmod_flint.pyx:364: sage: f.small_roots()
rings/polynomial/polynomial_zmod_flint.pyx:367: from sage.rings.polynomial.polynomial_modn_dense_ntl import small_roots
rings/polynomial/polynomial_zmod_flint.pyx:368: return small_roots(self, *args, **kwds)
Then you can inspect these files in your favourite text editor, for instance open up a terminal and type
vim <SAGE_ROOT>/src/sage/rings/polynomial/polynomial_modn_dense_ntl.pyx
(replacing <sage_root> with the path to your Sage installation), and go to the specified lines, or use your text editor to search for the string small_roots
, and you get an example of how to use the method, and the source code.