Mathematica 9 is now available
Services & Resources / Wolfram Forums
-----
 /
MathGroup Archive
2006
*January
*February
*March
*April
*May
*June
*July
*August
*September
*October
*November
*December
*Archive Index
*Ask about this page
*Print this page
*Give us feedback
*Sign up for the Wolfram Insider

MathGroup Archive 2006

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

Search the Archive

Re: Code to translate to negative base...

  • To: mathgroup at smc.vnet.net
  • Subject: [mg64591] Re: Code to translate to negative base...
  • From: Cca <cca at gregosetroianos.mat.br>
  • Date: Thu, 23 Feb 2006 00:34:51 -0500 (EST)
  • Sender: owner-wri-mathgroup at wolfram.com

>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: Re: Not Using a Text Editor Interface for Mathematica
  • Next by Date: Re: Re: ListSphericalDensityPlot[] ??
  • Previous by thread: Re: Code to translate to negative base...
  • Next by thread: Re: Code to translate to negative base...