On Jun 29, 2007, at 5:51 AM, Martin Albrecht wrote:

>
> On Friday 29 June 2007 02:48, Nick Alexander wrote:
>> Martin Albrecht <[EMAIL PROTECTED]> writes:
>>> Hi there,
>>>
>>> I often come across the situation where I have to construct an  
>>> integer
>>> from its binary representation and vice versa. So far you do it  
>>> in SAGE
>>> using strings. I have attached a preliminary patch which allows the
>>> following code to work, i.e. I _replaced_ the binary() method (which
>>> returned a string) with a method that returns a tuple of Python  
>>> ints.
>>
>> I won't take about the method name, but it would be very nice to have
>> a method that returns the base b digits of an integer for arbitrary
>> b.  Could this be made an optional argument, perhaps with a fast path
>> for b = 2?
>>
>> Nick
>
> Sounds good, will do. Actually, I have to bring up the endianess  
> again. Right
> now the string is big endian and I would prefer the list/tuple/ 
> vector match
> the endianess of the string rather than the endianess of polynomials.
>
> sage: 16.str(2)
> '10000'
> sage: 16.str(8)
> '20'
>
> Thoughts?

I still don't like it, basically because I've never seen a computer  
algebra system that represents integers *internally* in big-endian  
format. (The main exception is PARI, which actually *reverses* the  
representation on every single operation, because it uses GMP for the  
arithmetic, and GMP represents things internally in little-endian  
format!)

Strings are always big-endian because that's the way people read  
numbers off a page. That's just a historical thing. It has more to do  
with the left-right reading direction than representation in memory.  
I guess when you start from the left, if you see how long the number  
is, then the first digits (i.e. the most significant digits) give you  
immediately more information about the overall magnitude. If you  
start from the right, you only get information interesting to a  
number theorist :-)

I guess the main reason it feels more natural to me to go little  
endian is then digits are always aligned automatically for arithmetic  
purposes. Like if you want to add two vectors, you just start  
looping, you don't have to fiddle with indexing. If the value  
overflows, you just append digits at the end, you don't have to go  
shifting everything around.

On the other hand, you have mathematica as a precedent:

IntegerDigits[13, 2]

{1, 1, 0, 1}

But honestly I don't really care which way it goes. If you don't buy  
my argument, doesn't bother me at all. I'll just call reverse()  
whenever I use your function :-)

david


--~--~---------~--~----~------------~-------~--~----~
To post to this group, send email to sage-devel@googlegroups.com
To unsubscribe from this group, send email to [EMAIL PROTECTED]
For more options, visit this group at http://groups.google.com/group/sage-devel
URLs: http://sage.scipy.org/sage/ and http://modular.math.washington.edu/sage/
-~----------~----~----~----~------~----~------~--~---

Reply via email to