When in doubt add another table:
my @luhnmap_1 = (0,2,4,6,8,1,3,5,7,9);
my @luhnmap_2 = ();
for my $x (0..9) {
for my $y (0..9) {
@luhnmap_2[$y*10+$x]=$luhnmap_1[$y]+$x;
}
}
sub LUHN10 {
my $num = shift;
my $sum = 0;
while ($str = substr $num, -2, 2, "") {
$sum+=$bigmap[$str];
}
return $sum % 10 ? 0 : 1;
}
As bonus, if you don't count the additional table code (aw, come on, please :) ), it's shorter! You can increase this speed some more if you want, but the only way to get a huge increase is to create a bigger table (instead of 10 or 100 elements, try 10,000!). Not sure if it's worth going the next step (the memory and upfront cost).
Enjoy,
Gryn |