sage: a = 9
sage: a.is_square()
True
Coerce to Integer and use try/except:
sage: try:
Integer(sqrt(7))
except TypeError:
print "sqrt(7) is not an integer."
....:
sqrt(7) is not an integer.
sage: try:
Integer(sqrt(9))
except TypeError:
print "sqrt(9) is not an integer."
....:
3
Use the is_square *method* of integers:
sage: n = 100
sage: n.is_square()
True
sage: n = 100919080981232
sage: n.is_square()
False
The above is implemented by a single call into
the GMP library:
sage: n.is_square??
...
def is_square(self):
r"""
Returns \code{True} if self is a perfect square
EXAMPLES:
sage: Integer(4).is_square()
True
sage: Integer(41).is_square()
False
"""
return mpz_perfect_square_p(self.value)
This is going to be *vastly* faster than anything
you are likely to write:
sage: n = 100919080981232
sage: time for _ in xrange(10^6): a = n.is_square()
CPU times: user 0.29 s, sys: 0.00 s, total: 0.29 s
sage: time v = [n.is_square() for n in [1..10^6]]
CPU times: user 0.53 s, sys: 0.14 s, total: 0.68 s
Wall time: 2.50
sage: len(v)
1000000