## Base-26 Arithmetic

### March 23, 2012

We write functions to convert between Prashant strings and Scheme numbers, then use normal Scheme multiplication; the digits and undigits functions of the Standard Prelude make the conversions easy:

`(define (number->prashant n)`

(define (d->c d) (integer->char (+ d 65)))

(list->string (map d->c (digits n 26))))

`(define (prashant->number p)`

(define (c->d c) (- (char->integer c) 65))

(undigits (map c->d (string->list p)) 26))

Here are two examples:

`> (number->prashant 1234567)`

"CSGHJ"

> (prashant->number "CSGHJ")

1234567

Then the multiplication function is simple:

`(define (prashant-times x y)`

(number->prashant

(* (prashant->number x)

(prashant->number y))))

And here’s another example:

> (prashant-times "CSGHJ" "CBA")

"FNEUZJA"

You can run the program at http://programmingpraxis.codepad.org/ZXOpICfm.

PHP CLI:

Maybe it’s too early for me and I made a mistake, but I think that “CSGHJ” x “CBA” = “FOFVAJA”; here’s my Python:

Changing bases seems to work fine, i.e.

`int_to_b26(b26_to_int(s)) == s`

as far as I can tell.Woops, never mind. I tested against 25, instead of 26; let me work on this (make sure I don’t have any more embarassing mistakes) and get back to you later.

Yup. Changing all 25s to 26s does the trick. I won’t repost, since I’ve already filled this page with my comments.

Here is a Perl solution

Ok, I should stop, but this is good J practice for me.

Typically, I wouldn’t then bother with defining the multiply function and instead just use:

Of course, I could always define it if I wanted to:

The trick here, besides having base-conversion built-in (“#.”), is the “under” adverb, “&.”. “f &. g” translates to

J is pretty clever about deducing the inverses of functions, and you can always explicitly set the inverse to a function, if it can’t figure it out.

Hey! Here’s the C code :

Hey! there’s a flaw :P replace the last 3 lines with:

an erlang example.

“FNEUZJA” = base26:mult(“CSGHJ”, “CBA”).

In Haskell, but written for conciseness at the expense of speed and safety. :-)

Looks long now that I’ve seen the other comments, but here’s one in Common Lisp:

Another CL version, in a slightly different style from that of Jonathan.

>>> WholeSym(WholeSym(‘CSGHJ’) * WholeSym(‘CBA’))

WholeSym(‘FNEUZJA’)

>>> W = WholeSym

>>> W( W(‘C’) * W(‘BL’) * W(‘CJ’) * W(‘FV’) * W(‘VHJ’) * W(‘MVUTMJAWRZ’) )

WholeSym(‘PROGRAMMINGPRAXIS’)

Also python version

My solution written in Go lang: https://gist.github.com/2944246

@Siyuan The python one is a bit weird … int_to_b26(25) == ‘z’ int_to_b26(26) == ‘ba’ < should be 'aa'