use bigint;
$| = 1;
sub forward {
my $base = shift;
my $prev = shift;
my $sum = shift;
my $carry = 1;
my $next = 0;
my $rank = 0;
while ($prev or $sum or $carry) {
my $dprev = $prev % $base;
my $dsum = $sum % $base;
if ($dprev + $dsum + $carry < $base) {
$next += ($dprev + $carry) * $base**$rank;
$carry = 0;
} else {
$next = 0;
$carry = 1;
}
$prev = ($prev - $dprev) / $base;
$sum = ($sum - $dsum ) / $base;
$rank++;
}
return $next;
}
sub tobase {
my $base = shift;
my $n = shift;
my @d = ();
do {
my $d = $n % $base;
@d = ($d => @d);
$n = ($n - $d)/$base;
} while ($n);
return @d;
}
sub simplify {
my $base = shift;
my $a = shift;
my $sum = shift;
while (($a % $base)==0 && (($sum % $base)==($base-1))) {
$a = $a / $base;
$sum = ($sum-$base+1) / $base;
}
return "$a-$sum";
}
sub search {
my $base = shift;
my @values = ();
my $a = 0;
my $sum = 0;
my %seen = ();
for (my $n=1;; $n++) {
$a = forward($base, $a, $sum);
$sum += $a;
push @values => [$a, $sum];
my $key = simplify($base, $a, $sum);
if (exists $seen{$key}) {
return ($n - $seen{$key} => @values);
} else {
$seen{$key} = $n;
}
}
}
print "
\n";
print "A278743
\n";
print "
\n";
print "n | a(n) | k0 | b | cn |
\n";
foreach my $base (2..42) {
print STDERR "At base $base...\n";
my ($a, @values) = search($base);
print "\n";
print "$base | \n";
print "$a | \n";
my $k0 = $#values-$a;
print "$k0 | \n";
my $b = scalar(tobase($base, $values[$#values][0]/$values[$#values-$a][0]))-1;
print "$b | \n";
print "";
print "\n";
print "\n";
print "k | c$base(k) | In base $base | ";
print " \n";
print "\n";
print "c$base(k) | Partial sum | ";
print " \n";
foreach my $k (0..$#values) {
my $c = $values[$k][0];
my $sum = $values[$k][1];
my $bgcolor;
if ($k==$#values) {
$bgcolor = "white";
} elsif ($k < $#values-$a) {
$bgcolor = "peachpuff";
} else {
$bgcolor = "PaleTurquoise";
}
print "";
print "", $k+1, " | \n";
print "$c | \n";
my @c = tobase($base, $c);
my @sum = tobase($base, $sum);
my $skipped = 0;
while (@c && @sum && ($c[$#c]%$base)==0 && ($sum[$#sum]%$base)==($base-1)) {
$c = $c / $base;
$sum = ($sum - $base + 1)/$base;
pop @c;
pop @sum;
$skipped++;
}
print "";
print join($base <=10 ? "" : "," => (map {"$_" } @c), ("0") x $skipped);
print " | \n";
print "";
print join($base <=10 ? "" : "," => (map {"$_" } @sum), ( ("" . ($base-1) . "") ) x $skipped);
print " | \n";
print " ";
}
print " \n";
print " | ";
print "
\n";
}
print "
\n";
print "\n";