Hi Laurent,

On 15 Mrz., 12:30, Laurent <moky.m...@gmail.com> wrote:
> In order to test of something is integer, is it safe to use isinstance ?
> isinstance(A,sage.rings.integer.Integer)

There is a (deprecated) function is_Integer, that does exactly the
"isinstance" test. Whether it is safe or not depends on you
application.

Namely, when you say "test if something is integer", the test *very*
much depends on what you want to do with it. Here are four different
settings that would require different tests for integrality.

1.
If you want to use the underlying C data type of Sage integers, then
of course you need an "isinstance(...)" test.

2.
If you want to use certain methods that are provided by Sage integers,
but not by Sage rationals, then you might consider "duck typing" the
integer: You test whether the object has the methods that you need,
and then you use them, regardless whether the object really is a Sage
Integer or not. For example:
  sage: hasattr(SR(5),'xgcd')
  False
  sage: hasattr(5,'xgcd')
  True
  sage: hasattr(QQ['x'](5),'xgcd')
  True
  sage: hasattr(5/1,'xgcd')
  False
So, if you really just want to use the xgcd method, then you could
pretend that QQ['x'](5) (that's to say: The number 5 interpreted as a
polynomial of degree zero with rational coefficients) is an integer,
but the rational number 5/1 is not an integer.

3.
If, in your application, it is enough to know whether the given object
x is equal to an integer, then you could do "x in ZZ". Note that this
property has nothing to do with the type!
  sage: 5 in ZZ
  True
  sage: type(5)
  <type 'sage.rings.integer.Integer'>
  sage: 5/1 in ZZ
  True
  sage: type(5/1)
  <type 'sage.rings.rational.Rational'>
  sage: QQ['x'](5) in ZZ
  True
  sage: type(QQ['x'](5))
  <type
'sage.rings.polynomial.polynomial_rational_flint.Polynomial_rational_flint'>
  sage: QQ['x','y'](5) in ZZ
  True
  sage: type(QQ['x','y'](5))
  <type
'sage.rings.polynomial.multi_polynomial_libsingular.MPolynomial_libsingular'>
  sage: SR(5) in ZZ
  True
  sage: type(SR(5))
  <type 'sage.symbolic.expression.Expression'>
  sage: int(5) in ZZ
  True
  sage: type(int(5))
  <type 'int'>
Hence, from that point of view, QQ['x'](5) and 5/1 are integers. But
perhaps you don't like
  sage: GF(7)(5) in ZZ
  True
If you don't like finite field elements being equal to integers, you
have to think of yet another test.

4.
Or perhaps you are number theorist and consider elements of number
fields? Then, "being an integer" means "being root of a monic
polynomial". That property is tested by the "is_integral" method, that
is available for a couple of classes:
  sage: def test_integral(x):
  ....:     return hasattr(x,'is_integral') and x.is_integral()
  ....:
  sage: test_integral(5)
  True
  sage: test_integral(5/1)
  True
  sage: test_integral(int(5))
  # Python ints don't have the is_integral method
  False
  sage: test_integral(NumberField(x^2-2,'y')(5))
  True
  sage: test_integral(NumberField(x^2-2,'y')('y')/2)
  False

And then
  sage: test_integral(NumberField(x^2-2,'y')('y'))
  True
  sage: test_integral(sqrt(2))
  False
  sage: NumberField(x^2-2,'y')('y')^2 == 2
  True
(so, the generator of the number field somehow is a square root of 2,
but sqrt(2) is a symbolic expression, not an element of a number
field)

CONCLUSION:

We already have four different meanings of the question "Is x an
integer?". Since different meanings of the question require different
answers, there is certainly not *one* single test for "bein an
integer" in Sage.

Best regards,
Simon

-- 
To post to this group, send email to sage-support@googlegroups.com
To unsubscribe from this group, send email to 
sage-support+unsubscr...@googlegroups.com
For more options, visit this group at 
http://groups.google.com/group/sage-support
URL: http://www.sagemath.org

Reply via email to