[sage-support] Re: using len invokes bad division

2009-05-04 Thread William Stein

On Mon, May 4, 2009 at 10:45 AM, kcrisman kcris...@gmail.com wrote:

 Dear support,

 I assume this is known, but I am wondering whether it should be
 treated as a bug,

This is not a bug.  It's a stupid design decision in Python, which we
have to live with until we switch to Python 3.0 or switch to doing
from __future__ import division:

sage: from __future__ import division
sage: len([2,2])/len([2,3,4])
0.3


 or whether someone using len() on lists should be
 assumed to know it might then be operated on with Python /, not
 Sage /, as opposed to the preparser catching this sort of thing.

 sage: len([2,2])/len([2,3,4])
 0

 Thanks for any suggestions on what to do with this - right now I have
 to do

 sage: Integer(len([2,2]))/Integer(len([2,3,4]))
 2/3

Trust me, I understand that Python's int floor division sucks.   I'm
teaching undergrads about stats using Sage now, and the most obvious
line of code to compute the mean of a list gets the answer totally
wrong because of this problem.  This already caused a lot of
confusion.

This is definitely not something that should be addressed by the
preparser.  It could be addressed by rewriting len, but I'm very
hesitant to do that, because it will introduce subtle bugs when moving
code from preparsed to the library (.py files).
The way one might rewrite len would be:

sage: import __builtin__
sage: len = lambda x: Integer(__builtin__.len(x))
sage: len([2,2])/len([2,3,4])
2/3

 -- William

--~--~-~--~~~---~--~~
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
URLs: http://www.sagemath.org
-~--~~~~--~~--~--~---



[sage-support] Re: using len invokes bad division

2009-05-04 Thread Robert Bradshaw

On May 4, 2009, at 10:45 AM, kcrisman wrote:

 Dear support,

 I assume this is known, but I am wondering whether it should be
 treated as a bug, or whether someone using len() on lists should be
 assumed to know it might then be operated on with Python /, not
 Sage /, as opposed to the preparser catching this sort of thing.

len() is a Python builtin, which is a good indication that it will  
return Python types (especially when acting on a Python type). In  
fact, there's no way on the c-api level to return a Sage integer, as  
len() always returns a c long. This is similar to range returning a  
list of python ints.

 sage: len([2,2])/len([2,3,4])
 0

 Thanks for any suggestions on what to do with this - right now I have
 to do

 sage: Integer(len([2,2]))/Integer(len([2,3,4]))
 2/3

Yep, that's how to do it. (Note that only one of the numerator/ 
denominator needs to be cast, as coercion will cast the other.)

sage: Integer(2)/int(3)
2/3
sage: int(2)/Integer(3)
2/3
sage: int(2)/int(3)
0

- Robert


--~--~-~--~~~---~--~~
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
URLs: http://www.sagemath.org
-~--~~~~--~~--~--~---



[sage-support] Re: using len invokes bad division

2009-05-04 Thread Robert Bradshaw

On May 4, 2009, at 10:53 AM, William Stein wrote:

 On Mon, May 4, 2009 at 10:45 AM, kcrisman kcris...@gmail.com wrote:

 Dear support,

 I assume this is known, but I am wondering whether it should be
 treated as a bug,

 This is not a bug.  It's a stupid design decision in Python, which we
 have to live with until we switch to Python 3.0 or switch to doing
 from __future__ import division:

 sage: from __future__ import division
 sage: len([2,2])/len([2,3,4])
 0.3

And I'm not a fan of this behavior either, but in many ways it's less  
surprising than 0.



 or whether someone using len() on lists should be
 assumed to know it might then be operated on with Python /, not
 Sage /, as opposed to the preparser catching this sort of thing.

 sage: len([2,2])/len([2,3,4])
 0

 Thanks for any suggestions on what to do with this - right now I have
 to do

 sage: Integer(len([2,2]))/Integer(len([2,3,4]))
 2/3

 Trust me, I understand that Python's int floor division sucks.   I'm
 teaching undergrads about stats using Sage now, and the most obvious
 line of code to compute the mean of a list gets the answer totally
 wrong because of this problem.  This already caused a lot of
 confusion.

 This is definitely not something that should be addressed by the
 preparser.  It could be addressed by rewriting len, but I'm very
 hesitant to do that, because it will introduce subtle bugs when moving
 code from preparsed to the library (.py files).
 The way one might rewrite len would be:

 sage: import __builtin__
 sage: len = lambda x: Integer(__builtin__.len(x))
 sage: len([2,2])/len([2,3,4])
 2/3

Good point, I hadn't though about that. We could introduce a size()  
or cardinality() method that returns an Integer, or possibly infinity.

- Robert



--~--~-~--~~~---~--~~
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
URLs: http://www.sagemath.org
-~--~~~~--~~--~--~---



[sage-support] Re: using len invokes bad division

2009-05-04 Thread William Stein

On Mon, May 4, 2009 at 11:01 AM, Robert Bradshaw
rober...@math.washington.edu wrote:

 On May 4, 2009, at 10:53 AM, William Stein wrote:

 On Mon, May 4, 2009 at 10:45 AM, kcrisman kcris...@gmail.com wrote:

 Dear support,

 I assume this is known, but I am wondering whether it should be
 treated as a bug,

 This is not a bug.  It's a stupid design decision in Python, which we
 have to live with until we switch to Python 3.0 or switch to doing
 from __future__ import division:

 sage: from __future__ import division
 sage: len([2,2])/len([2,3,4])
 0.3

 And I'm not a fan of this behavior either, but in many ways it's less
 surprising than 0.

I also don't like it either, but it is *massively* better than getting 0.




 or whether someone using len() on lists should be
 assumed to know it might then be operated on with Python /, not
 Sage /, as opposed to the preparser catching this sort of thing.

 sage: len([2,2])/len([2,3,4])
 0

 Thanks for any suggestions on what to do with this - right now I have
 to do

 sage: Integer(len([2,2]))/Integer(len([2,3,4]))
 2/3

 Trust me, I understand that Python's int floor division sucks.   I'm
 teaching undergrads about stats using Sage now, and the most obvious
 line of code to compute the mean of a list gets the answer totally
 wrong because of this problem.  This already caused a lot of
 confusion.

 This is definitely not something that should be addressed by the
 preparser.  It could be addressed by rewriting len, but I'm very
 hesitant to do that, because it will introduce subtle bugs when moving
 code from preparsed to the library (.py files).
 The way one might rewrite len would be:

 sage: import __builtin__
 sage: len = lambda x: Integer(__builtin__.len(x))
 sage: len([2,2])/len([2,3,4])
 2/3

 Good point, I hadn't though about that. We could introduce a size()
 or cardinality() method that returns an Integer, or possibly infinity.

We could also redefine len.Can you think of any problems this will
cause *besides* when moving code from .sage preparsed files to Python
in the Sage library?I can't think of any.

 -- William

--~--~-~--~~~---~--~~
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
URLs: http://www.sagemath.org
-~--~~~~--~~--~--~---



[sage-support] Re: using len invokes bad division

2009-05-04 Thread mabshoff



On May 4, 11:01 am, Robert Bradshaw rober...@math.washington.edu
wrote:
 On May 4, 2009, at 10:53 AM, William Stein wrote:

SNIP

 Good point, I hadn't though about that. We could introduce a size()  
 or cardinality() method that returns an Integer, or possibly infinity.

Combinat already uses cardinality() since they need lists to be longer
than a C long or even infinity.

 - Robert

Cheers,

Michael
--~--~-~--~~~---~--~~
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
URLs: http://www.sagemath.org
-~--~~~~--~~--~--~---



[sage-support] Re: using len invokes bad division

2009-05-04 Thread kcrisman

  I assume this is known, but I am wondering whether it should be
  treated as a bug,

  This is not a bug.  It's a stupid design decision in Python, which we

Right, I knew that Python ints behaved this way, I was just surprised
that somehow in Sage / didn't change this - I guess it's because most
integer input gets preparsed to Integer, right?

  Trust me, I understand that Python's int floor division sucks.   I'm
  teaching undergrads about stats using Sage now, and the most obvious
  line of code to compute the mean of a list gets the answer totally
  wrong because of this problem.  This already caused a lot of
  confusion.

Luckily I haven't had that problem - just my own getting weird answers
just now!

  Good point, I hadn't though about that. We could introduce a size()
  or cardinality() method that returns an Integer, or possibly infinity.

That sounds useful; there are already other things that have
cardinality() implemented, right?

 We could also redefine len.    

I'm not touching that one! :)

Thanks for all the insight,
- kcrisman
--~--~-~--~~~---~--~~
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
URLs: http://www.sagemath.org
-~--~~~~--~~--~--~---



[sage-support] Re: using len invokes bad division

2009-05-04 Thread Jaap Spies

Robert Bradshaw wrote:
 On May 4, 2009, at 10:45 AM, kcrisman wrote:

 len() is a Python builtin, which is a good indication that it will  
 return Python types (especially when acting on a Python type). In  
 fact, there's no way on the c-api level to return a Sage integer, as  
 len() always returns a c long. This is similar to range returning a  
 list of python ints.
 

Another Python builtin is pow(), but how is it possible that
type(pow(2,9,11)) returns
type 'sage.rings.integer_mod.IntegerMod_int'

Or am I mistaken?

Jaap

(This comes from a question from a private e-mail)


--~--~-~--~~~---~--~~
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
URLs: http://www.sagemath.org
-~--~~~~--~~--~--~---



[sage-support] Re: using len invokes bad division

2009-05-04 Thread Mike Hansen

On Mon, May 4, 2009 at 12:19 PM, Jaap Spies j.sp...@hccnet.nl wrote:
 Another Python builtin is pow(), but how is it possible that
 type(pow(2,9,11)) returns
 type 'sage.rings.integer_mod.IntegerMod_int'

 Or am I mistaken?

The pow() builtin just calls __pow__ on the first argument in that
case, which we control so we can return one of our types.  len() will
call __len__, but forces whatever is returned to be an int.  This is
what will be changing in Python 3.0.

--Mike

--~--~-~--~~~---~--~~
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
URLs: http://www.sagemath.org
-~--~~~~--~~--~--~---



[sage-support] Re: using len invokes bad division

2009-05-04 Thread William Stein

On Mon, May 4, 2009 at 12:23 PM, Mike Hansen mhan...@gmail.com wrote:

 On Mon, May 4, 2009 at 12:19 PM, Jaap Spies j.sp...@hccnet.nl wrote:
 Another Python builtin is pow(), but how is it possible that
 type(pow(2,9,11)) returns
 type 'sage.rings.integer_mod.IntegerMod_int'

 Or am I mistaken?

 The pow() builtin just calls __pow__ on the first argument in that
 case, which we control so we can return one of our types.  len() will
 call __len__, but forces whatever is returned to be an int.  This is
 what will be changing in Python 3.0.

However that change will in now way help with the original question.
Even in python 3.0 the len(...) of a list is still a Python int.

wst...@sage:~$ python3.0
Python 3.0 (r30:67503, Jan 23 2009, 04:39:45)
[GCC 4.2.4 (Ubuntu 4.2.4-1ubuntu3)] on linux2
Type help, copyright, credits or license for more information.
 type(len([1,2,3,4]))
class 'int'

William

--~--~-~--~~~---~--~~
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
URLs: http://www.sagemath.org
-~--~~~~--~~--~--~---



[sage-support] Re: using len invokes bad division

2009-05-04 Thread Jaap Spies

Mike Hansen wrote:
 On Mon, May 4, 2009 at 12:19 PM, Jaap Spies j.sp...@hccnet.nl wrote:
 Another Python builtin is pow(), but how is it possible that
 type(pow(2,9,11)) returns
 type 'sage.rings.integer_mod.IntegerMod_int'

 Or am I mistaken?
 
 The pow() builtin just calls __pow__ on the first argument in that
 case, which we control so we can return one of our types.  len() will
 call __len__, but forces whatever is returned to be an int.  This is
 what will be changing in Python 3.0.
 

Than pow? gives a misleading text:

 Type:type 'builtin_function_or_method'
 Definition:  pow( [noargspec] )
 Docstring: 
 pow(x, y[, z]) - number
 
 With two arguments, equivalent to x**y.  With three arguments,
 equivalent to (x**y) % z, but may be more efficient (e.g. for longs).


type(pow(2,9)) returns
type 'sage.rings.integer.Integer'

type(pow(2,9) % 11) returns
type 'sage.rings.integer.Integer'

same for type(2^9 % 11) and type(2**9 % 11)


Jaap


 --Mike
 
  
 


--~--~-~--~~~---~--~~
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
URLs: http://www.sagemath.org
-~--~~~~--~~--~--~---