To give a quick answer to the question in title, you can use the magic function %time
or %timeit
:
sage: R.<x> = GF(17)[]
sage: p = R.random_element(50)
sage: q = R.random_element(50)
sage: %timeit gcd(p,q)
100000 loops, best of 3: 12.2 µs per loop
The actual computation in my case (univariate polynomial over prime finite field) is done by Flint. I explain below how to get this information.
First, you can use gcd??
which shows you the source code. You'll find
try:
return a.gcd(b, **kwargs)
which tells you that the actual computation is p.gcd(q)
. Then using p.gcd??
, you'll see that this method, written in the file $SAGE/src/sage/rings/polynomial/polynomial_template.pxi
, use the function celement_gcd
. If you open this file polynomial_template.pxi
, the docstring tells us that this celement_gcd
is implemented in some linkage file. Since in my case, the polynomial has type
sage: type(p)
<type 'sage.rings.polynomial.polynomial_zmod_flint.Polynomial_zmod_flint'>
one can open the file $SAGE/src/sage/rings/polynomial/polynomial_zmod_flint.pyx
where the linkage file is included:
include "sage/libs/flint/nmod_poly_linkage.pxi"
The linkage file is thus $SAGE/src/sage/libs/flint/nmod_poly_linkage.pxi
. In this file one sees that celement_gcd
uses nmod_poly_gcd
from Flint library. So at the end, this computation is performed by Flint.