sub binmodexp { my ($base, $exp, $n) = @_; die "Negative exponent" if $exp<0; my $res = 1; my $mul = $base % $n; while ($exp) { if ($exp & 1) { $res = ( $res * $mul ) % $n; } $exp>>=1; $mul = ($mul*$mul) % $n; } return $res; }