MathGroup Archive 2006

[Date Index] [Thread Index] [Author Index]

Search the Archive

Re: Re: Code to translate to negative base...

  • To: mathgroup at smc.vnet.net
  • Subject: [mg64676] Re: [mg64591] Re: Code to translate to negative base...
  • From: Richard Palmer <mapsinc at bellatlantic.net>
  • Date: Sun, 26 Feb 2006 05:07:58 -0500 (EST)
  • Sender: owner-wri-mathgroup at wolfram.com

It is nice to be on a list with the best programmers in the world.  I owe
you too a coffee or a drink whenever you get to Boston.

Richard Palmer

On 2/23/06 12:34 AM, "Cca" <cca at gregosetroianos.mat.br> wrote:

>> Does anyone have code to translate to a negative base?
> 
> Surprinsingly enough, this is very simple, although not much known among
> students. I find the approach below conceptually very intuitive and ellegant:
> everything depends on a REMAINDER function.
> 
> Suppose that you already have implemented the traditional algorithm that gives
> you the digits of a integer number N in base B, for B>0 in Integers. Then,
> just enter with a negative value for B and you will get what you want.
> Let me ellaborate on this a little. We can see the traditional algorithm as a
> Mathematica command, say (although below I´ll not give any formatting
> instructions)
> 
> myBaseForm[A, B, r]
> 
> where r is a REMAINDER FUNCTION, that is, a rule
> 
> r[A, B]
> 
> such that A is congruent to r[A,B] mod B. The Euclidean remainder -- the
> "standard" one -- is given by
> 
> r[A_, B_] := A - Abs[B]*Floor[A/Abs[B]]
> 
> or, using Mathematica Mod,
> 
> r[A_, B_] := Mod[A, Abs[B]]
> 
> For each A in Integers, this gives the UNIQUE number r such that A is
> congruent to r mod B and 0<=r<Abs[B].
> 
> So, using the notations above, he following would always return True:
> 
> myBaseForm[A, B] == BaseForm[A, B,  Mod[#1, Abs[#2]] & ]
> 
> This means that what you want is just
> 
> myBaseForm[A, -B]
> 
> Here is a direct implementation of the ideas above:
> 
> myBaseForm[a_, base_, r_:(Mod[#1, Abs[#2]] & )] :=
> Reverse[Drop[(r[#1, base] & ) /@
>    FixedPointList[(#1 - r[#1, base])/base & ,
>     a], -2]]
> 
> Some examples for comparison:
> 
> IntegerDigits[200, 3]
> {2,1,1,0,2}
> 
> myBaseForm[200, 3]
> {2,1,1,0,2}
> 
> myBaseForm[21, -10]
> {1,8,1}
> 
> 
> Carlos César de Araújo
> Gregos & Troianos Educacional
> www.gregosetroianos.mat.br
> Belo Horizonte, MG, Brasil
> (31) 3283-1122
> 


  • Prev by Date: Re: Re: Code to translate to negative base...
  • Next by Date: Re: Sequence@@List
  • Previous by thread: Re: Re: Code to translate to negative base...
  • Next by thread: question about Split[...]