Algorithm-BitVector
view release on metacpan or search on metacpan
lib/Algorithm/BitVector.pm view on Meta::CPAN
return "is NOT a prime" if any {$p % $_ == 0} @probes;
my ($k, $q) = (0, $p-1);
while (! ($q & 1)) {
$q >>= 1;
$k++;
}
foreach my $a (@probes) {
my $a_raised_to_q = _powmod_small_ints($a, int($q), $p);
next if $a_raised_to_q == 1 or $a_raised_to_q == $p - 1;
my $a_raised_to_jq = $a_raised_to_q;
my $primeflag = 0;
foreach my $j (0..$k-1) {
$a_raised_to_jq = _powmod_small_ints($a_raised_to_jq, 2, $p);
if ($a_raised_to_jq == $p-1) {
$primeflag = 1;
last;
}
}
return "is NOT a prime" unless $primeflag;
}
my $probability_of_prime = 1 - 1.0/(4 ** @probes);
return "is a prime with probability $probability_of_prime";
}
## This routine is for modular exponentiation of small integers, meaning the
## integers that can be accommodated (before and after exponentiation) in the native
## 4-byte int representation. For larger integers, a call to this function should
## be replaced by a call to modular exponentiation of the Math::BigInt module.
sub _powmod_small_ints {
lib/Algorithm/BitVector.pm view on Meta::CPAN
sub _check_for_illegal_params {
my @params = @_;
my @legal_params = qw / filename
size
intVal
bitlist
bitstring
hexstring
textstring
/;
my $found_match_flag;
foreach my $param (@params) {
foreach my $legal (@legal_params) {
$found_match_flag = 0;
if ($param eq $legal) {
$found_match_flag = 1;
last;
}
}
last if $found_match_flag == 0;
}
return $found_match_flag;
}
1;
=pod
=head1 NAME
Algorithm::BitVector --- A memory efficient packed representation of arbitrary sized
( run in 2.100 seconds using v1.01-cache-2.11-cpan-94b05bcf43c )