# Doing $x ** $y can result in very large numbers, # But if what you want it ( $x ** $y ) % $m, then # you can pull the modulo into the products and keep # your numbers smaller. sub ModuloPwr { my($base,$pwr,$mod) = @_; return 1 if $pwr < 1; # I probably don't need the 0.1, but doesn't hurt. my $result = ModuloPwr($base, int(0.1 + $pwr/2), $mod); $result = ($result * $result) % $mod; if ($pwr%2) { $result = ( $result * $base ) % $mod; } return $result; }