Fという数のp進数への基数変換ってつまり以下の更新式に従って、F_n mod pを逆に並べるということ。F_{n+1}が0になれば計算終了。
F_n = p * F_{n+1} + F_n mod p n = 0;
移行してF_nの項とF_{n+1}の項を分離。
F_{n+1} = (F_n - F_n mod p) / p n = 0;
コード的には以下。
my $Fn = 192; my $p = 2; my $str = ""; do { my $Fnmodp = ($Fn % $p); $str = "$Fnmodp $str"; $Fn = ($Fn - $Fnmodp) / $p; } while ($Fn == 0); print $str;
一行で書くと以下。
$ perl -le '$Fn=192; $p=2; $str=""; do{$Fnmodp=($Fn%$p); $str="$Fnmodp $str"; $Fn=($Fn-$Fnmodp)/$p;}while($Fn); print $str;' 1 1 0 0 0 0 0 0 $ perl -le '$Fn=16*10+14; $p=16; $str=""; do{$Fnmodp=($Fn%$p); $str="$Fnmodp $str"; $Fn=($Fn-$Fnmodp)/$p;}while($Fn); print $str;' 10 14
わざわざ書かなくてもMath::BaseCalcという基数変換モジュールがある。