number base conversion (ベース変換)

任意の数をn進数で表記したり、n進数表記の数を10進数の数に変換したりしたい。
具体的には0から9とaからzの36文字を36進数と考えると、

zz <=> 1295

ということです。

   36bzz
1295
   36b1000
46656
   x: 36bthisisapen
2994670252589855

これを逆に変換する関数を作ってみました。

   asc=:'0123456789abcdefghijklmnopqrstuvwxyz'
   norm=: ]`($:@( (0:,~<.@:%&36)+(0:,36&| ) ) )@.(36&( +./ @:<:))
   (norm 1295) { asc
zz
   (norm 46656) { asc
1000
   (norm 2994670252589855) { asc
thisisapf0

最後の数の最後の方がおかしいのは有効桁数をオーバーしているのかな?
いずれにせよ、どうやらできている風ですね。
36進数で素数リストを作ってみよう。

   (,. ; (asc {~ norm)"0)   p:i.20
 +--+--+
 | 2|2 |
 | 3|3 |
 | 5|5 |
 | 7|7 |
 |11|b |
 |13|d |
 |17|h |
 |19|j |
 |23|n |
 |29|t |
 |31|v |
 |37|11|
 |41|15|
 |43|17|
 |47|1b|
 |53|1h|
 |59|1n|
 |61|1p|
 |67|1v|
 |71|1z|
 +--+--+

あまり意味のある文字列になりませんでした。

以上