<:
use Math::BigFloat;
-my @cols = (2, 6, 8, 9, 10, 12, 16, 18, 60);
+my @cols = (2, 6, 8, 9, 10, 12, 16, 18);
+my $count = 42;
print '<tr><th>';
print '<th>', $_ for @cols;
my @char = (0..9, 'A'..'Z', 'a'..'z');
-my $places = 48;
+my $places = $count<<1;
-for my $n (2 .. 25) {
+sub shownum {
+ my ($num, $radix) = @_;
+
+ my $out = '';
+ my $class = '';
+ my $zeros = 0;
+
+ADD_DIGITS:
+ for my $place (1 .. $places) {
+ $out .= $char[ $num->blsft(1, $radix) ];
+ $num->bmod(1) or do {
+ $class = $out eq '1' ? 'l5' : $place == 1 ? 'l4' : 'l3';
+ last;
+ };
+ $zeros++ if $out =~ /^0+$/;
+
+ for my $check ($zeros .. length($out)>>1) {
+ if (substr($out, -$check) eq substr($out, -$check*2, $check)) {
+ $class = $check == 1 ? 'l2' : 'l1';
+ substr($out, -$check) = '';
+ substr($out, -$check, 0) = '<span style="text-decoration:overline">';
+ $check .= '</span>';
+ last ADD_DIGITS;
+ }
+ }
+ }
+ printf '<td%s style="text-align:left">%s', $class && qq( class="$class"), $out;
+}
+
+for my $n (2 .. $count) {
print '<tr>';
print '<th>', $n;
for my $radix (@cols) {
my $accuracy = int($places * log($radix) / log(10));
Math::BigFloat->accuracy($accuracy);
- my $frac = Math::BigFloat->new(1)->bdiv($n, $accuracy+1);
- my $out = '';
- my $class = '';
-ADD_DIGITS:
- for my $place (1 .. $places) {
- $out .= $char[ $frac->blsft(1, $radix) ];
- $frac->bmod(1) or do {
- $class = $n == $radix ? 'l5' : $place == 1 ? 'l4' : 'l3';
- last;
- };
- for my $check (log($n)/log($radix) .. length($out)>>1) {
- if ($out =~ /[^0]/ and substr($out, -$check) eq substr($out, -$check*2, $check)) {
- $class = $check == 1 ? 'l2' : 'l1';
- substr($out, -$check) = '';
- substr($out, -$check, 0) = '(';
- last ADD_DIGITS;
- }
- }
- }
- printf '<td%s>%s', $class && qq( class="$class"), $out;
+ shownum(scalar Math::BigFloat->new(1)->bdiv($n, $accuracy+1), $radix);
}
-# \x{305}
}
+
:></table>