# Revision history [back]

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.

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.