| line |
stmt |
bran |
cond |
sub |
pod |
time |
code |
|
1
|
|
|
|
|
|
|
package Math::Prime::Util::PPFE; |
|
2
|
1
|
|
|
1
|
|
6
|
use strict; |
|
|
1
|
|
|
|
|
1
|
|
|
|
1
|
|
|
|
|
36
|
|
|
3
|
1
|
|
|
1
|
|
5
|
use warnings; |
|
|
1
|
|
|
|
|
1
|
|
|
|
1
|
|
|
|
|
44
|
|
|
4
|
1
|
|
|
1
|
|
1737
|
use Math::Prime::Util::PP; |
|
|
1
|
|
|
|
|
5
|
|
|
|
1
|
|
|
|
|
77
|
|
|
5
|
1
|
|
|
1
|
|
789
|
use Math::Prime::Util::Entropy; |
|
|
1
|
|
|
|
|
3
|
|
|
|
1
|
|
|
|
|
51
|
|
|
6
|
|
|
|
|
|
|
|
|
7
|
|
|
|
|
|
|
# The PP front end, only loaded if XS is not used. |
|
8
|
|
|
|
|
|
|
# It is intended to load directly into the MPU namespace. |
|
9
|
|
|
|
|
|
|
|
|
10
|
|
|
|
|
|
|
package Math::Prime::Util; |
|
11
|
1
|
|
|
1
|
|
6
|
use Carp qw/carp croak confess/; |
|
|
1
|
|
|
|
|
2
|
|
|
|
1
|
|
|
|
|
107
|
|
|
12
|
|
|
|
|
|
|
|
|
13
|
|
|
|
|
|
|
*_validate_integer = \&Math::Prime::Util::PP::_validate_integer; |
|
14
|
|
|
|
|
|
|
*_validate_integer_nonneg = \&Math::Prime::Util::PP::_validate_integer_nonneg; |
|
15
|
|
|
|
|
|
|
*_validate_integer_positive = \&Math::Prime::Util::PP::_validate_integer_positive; |
|
16
|
|
|
|
|
|
|
*_validate_integer_abs = \&Math::Prime::Util::PP::_validate_integer_abs; |
|
17
|
|
|
|
|
|
|
|
|
18
|
|
|
|
|
|
|
*_prime_memfreeall = \&Math::Prime::Util::PP::_prime_memfreeall; |
|
19
|
|
|
|
|
|
|
*prime_memfree = \&Math::Prime::Util::PP::prime_memfree; |
|
20
|
|
|
|
|
|
|
*prime_precalc = \&Math::Prime::Util::PP::prime_precalc; |
|
21
|
|
|
|
|
|
|
|
|
22
|
1
|
|
|
1
|
|
719
|
use Math::Prime::Util::ChaCha; |
|
|
1
|
|
|
|
|
4
|
|
|
|
1
|
|
|
|
|
506
|
|
|
23
|
|
|
|
|
|
|
*_is_csprng_well_seeded = \&Math::Prime::Util::ChaCha::_is_csprng_well_seeded; |
|
24
|
|
|
|
|
|
|
*_csrand = \&Math::Prime::Util::ChaCha::csrand; |
|
25
|
|
|
|
|
|
|
*_srand = \&Math::Prime::Util::ChaCha::srand; |
|
26
|
|
|
|
|
|
|
*random_bytes = \&Math::Prime::Util::ChaCha::random_bytes; |
|
27
|
|
|
|
|
|
|
*irand = \&Math::Prime::Util::ChaCha::irand; |
|
28
|
|
|
|
|
|
|
*irand64 = \&Math::Prime::Util::ChaCha::irand64; |
|
29
|
|
|
|
|
|
|
|
|
30
|
|
|
|
|
|
|
sub srand { |
|
31
|
0
|
|
|
0
|
1
|
0
|
my($seed) = @_; |
|
32
|
0
|
0
|
|
|
|
0
|
croak "secure option set, manual seeding disabled" if prime_get_config()->{'secure'}; |
|
33
|
0
|
0
|
|
|
|
0
|
if (!defined $seed) { |
|
34
|
0
|
|
|
|
|
0
|
my $nbytes = (~0 == 4294967295) ? 4 : 8; |
|
35
|
0
|
|
|
|
|
0
|
$seed = entropy_bytes( $nbytes ); |
|
36
|
0
|
0
|
|
|
|
0
|
$seed = unpack(($nbytes==4) ? "L" : "Q", $seed); |
|
37
|
|
|
|
|
|
|
} |
|
38
|
|
|
|
|
|
|
Math::Prime::Util::GMP::seed_csprng(8,pack("LL",$seed)) |
|
39
|
0
|
0
|
|
|
|
0
|
if $Math::Prime::Util::_GMPfunc{"seed_csprng"}; |
|
40
|
0
|
|
|
|
|
0
|
Math::Prime::Util::_srand($seed); |
|
41
|
|
|
|
|
|
|
} |
|
42
|
|
|
|
|
|
|
sub csrand { |
|
43
|
1
|
|
|
1
|
1
|
4
|
my($seed) = @_; |
|
44
|
1
|
0
|
33
|
|
|
5
|
croak "secure option set, manual seeding disabled" if defined $seed && prime_get_config()->{'secure'}; |
|
45
|
1
|
50
|
|
|
|
5
|
$seed = entropy_bytes( 64 ) unless defined $seed; |
|
46
|
|
|
|
|
|
|
Math::Prime::Util::GMP::seed_csprng(length($seed),$seed) |
|
47
|
1
|
50
|
|
|
|
4
|
if $Math::Prime::Util::_GMPfunc{"seed_csprng"}; |
|
48
|
1
|
|
|
|
|
4
|
Math::Prime::Util::_csrand($seed); |
|
49
|
1
|
|
|
|
|
3
|
1; # Don't return the seed |
|
50
|
|
|
|
|
|
|
} |
|
51
|
|
|
|
|
|
|
sub entropy_bytes { |
|
52
|
1
|
|
|
1
|
1
|
3
|
my($bytes) = @_; |
|
53
|
1
|
50
|
33
|
|
|
12
|
croak "entropy_bytes: input must be integer bytes between 1 and 4294967295" |
|
|
|
|
33
|
|
|
|
|
|
|
|
|
33
|
|
|
|
|
|
54
|
|
|
|
|
|
|
if !defined($bytes) || $bytes < 1 || $bytes > 4294967295 || $bytes != int($bytes); |
|
55
|
1
|
|
|
|
|
5
|
my $data = Math::Prime::Util::Entropy::entropy_bytes($bytes); |
|
56
|
1
|
50
|
|
|
|
4
|
if (!defined $data) { |
|
57
|
|
|
|
|
|
|
# We can't find any entropy source! Highly unusual. |
|
58
|
0
|
|
|
|
|
0
|
Math::Prime::Util::_srand(); |
|
59
|
0
|
|
|
|
|
0
|
$data = random_bytes($bytes); |
|
60
|
|
|
|
|
|
|
} |
|
61
|
1
|
50
|
|
|
|
3
|
croak "entropy_bytes internal got wrong amount!" unless length($data) == $bytes; |
|
62
|
1
|
|
|
|
|
3
|
$data; |
|
63
|
|
|
|
|
|
|
} |
|
64
|
|
|
|
|
|
|
|
|
65
|
|
|
|
|
|
|
# Fill all the mantissa bits for our NV, regardless of 32-bit or 64-bit Perl. |
|
66
|
|
|
|
|
|
|
{ |
|
67
|
1
|
|
|
1
|
|
10
|
use Config; |
|
|
1
|
|
|
|
|
2
|
|
|
|
1
|
|
|
|
|
6548
|
|
|
68
|
|
|
|
|
|
|
my $nvbits = (defined $Config{nvmantbits}) ? $Config{nvmantbits} |
|
69
|
|
|
|
|
|
|
: (defined $Config{usequadmath}) ? 112 |
|
70
|
|
|
|
|
|
|
: $Config{nvsize} == 32 ? 236 |
|
71
|
|
|
|
|
|
|
: $Config{nvsize} == 16 ? 112 |
|
72
|
|
|
|
|
|
|
: $Config{nvsize} == 8 ? 52 |
|
73
|
|
|
|
|
|
|
: $Config{nvsize} == 4 ? 23 |
|
74
|
|
|
|
|
|
|
: 52; |
|
75
|
|
|
|
|
|
|
my $nvdigits = int(($nvbits+1) / 3.322); |
|
76
|
|
|
|
|
|
|
my $uvbits = (~0 > 4294967295) ? 64 : 32; |
|
77
|
|
|
|
|
|
|
my $rsub; |
|
78
|
|
|
|
|
|
|
my $_tonv_32 = 1.0; $_tonv_32 /= 2.0 for 1..32; |
|
79
|
|
|
|
|
|
|
my $_tonv_64 = $_tonv_32; $_tonv_64 /= 2.0 for 1..32; |
|
80
|
|
|
|
|
|
|
my $_tonv_96 = $_tonv_64; $_tonv_96 /= 2.0 for 1..32; |
|
81
|
|
|
|
|
|
|
my $_tonv_128 = $_tonv_96; $_tonv_128/= 2.0 for 1..32; |
|
82
|
|
|
|
|
|
|
if ($uvbits == 64) { |
|
83
|
|
|
|
|
|
|
if ($nvbits <= 32) { |
|
84
|
|
|
|
|
|
|
*drand = sub { my $d = irand() * $_tonv_32; $d *= $_[0] if $_[0]; $d; }; |
|
85
|
|
|
|
|
|
|
} elsif ($nvbits <= 64) { |
|
86
|
0
|
0
|
|
0
|
|
0
|
*drand = sub { my $d = irand64() * $_tonv_64; $d *= $_[0] if $_[0]; $d; }; |
|
|
0
|
|
|
|
|
0
|
|
|
|
0
|
|
|
|
|
0
|
|
|
87
|
|
|
|
|
|
|
} else { |
|
88
|
|
|
|
|
|
|
*drand = sub { my $d = irand64() * $_tonv_64 + irand64() * $_tonv_128; $d *= $_[0] if $_[0]; $d; }; |
|
89
|
|
|
|
|
|
|
} |
|
90
|
|
|
|
|
|
|
} else { |
|
91
|
|
|
|
|
|
|
if ($nvbits <= 32) { |
|
92
|
|
|
|
|
|
|
*drand = sub { my $d = irand() * $_tonv_32; $d *= $_[0] if $_[0]; $d; }; |
|
93
|
|
|
|
|
|
|
} elsif ($nvbits <= 64) { |
|
94
|
|
|
|
|
|
|
*drand = sub { my $d = ((irand() >> 5) * 67108864.0 + (irand() >> 6)) / 9007199254740992.0; $d *= $_[0] if $_[0]; $d; }; |
|
95
|
|
|
|
|
|
|
} else { |
|
96
|
|
|
|
|
|
|
*drand = sub { my $d = irand() * $_tonv_32 + irand() * $_tonv_64 + irand() * $_tonv_96 + irand() * $_tonv_128; $d *= $_[0] if $_[0]; $d; }; |
|
97
|
|
|
|
|
|
|
} |
|
98
|
|
|
|
|
|
|
} |
|
99
|
|
|
|
|
|
|
*rand = \&drand; |
|
100
|
|
|
|
|
|
|
|
|
101
|
0
|
|
|
0
|
|
0
|
{ my $ivsize = $Config{ivsize}; *_ivsize = sub { return $ivsize; }; } |
|
102
|
0
|
|
|
0
|
|
0
|
{ my $uvsize = $Config{uvsize}; *_uvsize = sub { return $uvsize; }; } |
|
103
|
0
|
|
|
0
|
|
0
|
{ my $uvbits = $Config{uvsize}*8; *_uvbits = sub { return $uvbits; }; } |
|
104
|
0
|
|
|
0
|
|
0
|
{ my $nvsize = $Config{nvsize}; *_nvsize = sub { return $nvsize; }; } |
|
105
|
0
|
|
|
0
|
|
0
|
*_nvmantbits = sub { return $nvbits; }; |
|
106
|
0
|
|
|
0
|
|
0
|
*_nvmantdigits = sub { return $nvdigits; }; |
|
107
|
|
|
|
|
|
|
} |
|
108
|
|
|
|
|
|
|
|
|
109
|
|
|
|
|
|
|
|
|
110
|
|
|
|
|
|
|
# These functions all do input validation within the PP code. |
|
111
|
|
|
|
|
|
|
# Therefore we can send user input straight to them. |
|
112
|
|
|
|
|
|
|
|
|
113
|
|
|
|
|
|
|
# The advantage is simplicity and speed for a single user call. |
|
114
|
|
|
|
|
|
|
# |
|
115
|
|
|
|
|
|
|
# The disadvantage is that we're doing very expensive PP validation |
|
116
|
|
|
|
|
|
|
# for each function call within the PP code itself. |
|
117
|
|
|
|
|
|
|
|
|
118
|
|
|
|
|
|
|
# Rules of thumb: |
|
119
|
|
|
|
|
|
|
# if a function is expensive, no harm in validation |
|
120
|
|
|
|
|
|
|
# if a function is cheap and often called, consider validation here. |
|
121
|
|
|
|
|
|
|
|
|
122
|
|
|
|
|
|
|
# TODO: revisit decision for all of these |
|
123
|
|
|
|
|
|
|
|
|
124
|
|
|
|
|
|
|
*urandomb = \&Math::Prime::Util::PP::urandomb; |
|
125
|
|
|
|
|
|
|
*urandomm = \&Math::Prime::Util::PP::urandomm; |
|
126
|
|
|
|
|
|
|
|
|
127
|
|
|
|
|
|
|
*sumdigits = \&Math::Prime::Util::PP::sumdigits; |
|
128
|
|
|
|
|
|
|
*todigits = \&Math::Prime::Util::PP::todigits; |
|
129
|
|
|
|
|
|
|
*todigitstring = \&Math::Prime::Util::PP::todigitstring; |
|
130
|
|
|
|
|
|
|
*fromdigits = \&Math::Prime::Util::PP::fromdigits; |
|
131
|
|
|
|
|
|
|
*inverse_li = \&Math::Prime::Util::PP::inverse_li; |
|
132
|
|
|
|
|
|
|
*inverse_li_nv = \&Math::Prime::Util::PP::inverse_li_nv; |
|
133
|
|
|
|
|
|
|
*sieve_prime_cluster = \&Math::Prime::Util::PP::sieve_prime_cluster; |
|
134
|
|
|
|
|
|
|
*sieve_range = \&Math::Prime::Util::PP::sieve_range; |
|
135
|
|
|
|
|
|
|
*lucky_numbers = \&Math::Prime::Util::PP::lucky_numbers; |
|
136
|
|
|
|
|
|
|
*powerful_numbers = \&Math::Prime::Util::PP::powerful_numbers; |
|
137
|
|
|
|
|
|
|
|
|
138
|
|
|
|
|
|
|
*prime_count = \&Math::Prime::Util::PP::prime_count; |
|
139
|
|
|
|
|
|
|
*prime_power_count = \&Math::Prime::Util::PP::prime_power_count; |
|
140
|
|
|
|
|
|
|
*twin_prime_count = \&Math::Prime::Util::PP::twin_prime_count; |
|
141
|
|
|
|
|
|
|
*semiprime_count = \&Math::Prime::Util::PP::semiprime_count; |
|
142
|
|
|
|
|
|
|
*almost_prime_count = \&Math::Prime::Util::PP::almost_prime_count; |
|
143
|
|
|
|
|
|
|
*omega_prime_count = \&Math::Prime::Util::PP::omega_prime_count; |
|
144
|
|
|
|
|
|
|
*ramanujan_prime_count = \&Math::Prime::Util::PP::ramanujan_prime_count; |
|
145
|
|
|
|
|
|
|
*lucky_count = \&Math::Prime::Util::PP::lucky_count; |
|
146
|
|
|
|
|
|
|
*smooth_count = \&Math::Prime::Util::PP::smooth_count; |
|
147
|
|
|
|
|
|
|
*rough_count = \&Math::Prime::Util::PP::rough_count; |
|
148
|
|
|
|
|
|
|
|
|
149
|
|
|
|
|
|
|
*sum_primes = \&Math::Prime::Util::PP::sum_primes; |
|
150
|
|
|
|
|
|
|
*print_primes = \&Math::Prime::Util::PP::print_primes; |
|
151
|
|
|
|
|
|
|
|
|
152
|
|
|
|
|
|
|
*is_prime = \&Math::Prime::Util::PP::is_prime; |
|
153
|
|
|
|
|
|
|
*is_prob_prime = \&Math::Prime::Util::PP::is_prob_prime; |
|
154
|
|
|
|
|
|
|
*is_provable_prime = \&Math::Prime::Util::PP::is_provable_prime; |
|
155
|
|
|
|
|
|
|
*is_bpsw_prime = \&Math::Prime::Util::PP::is_bpsw_prime; |
|
156
|
|
|
|
|
|
|
*is_pseudoprime = \&Math::Prime::Util::PP::is_pseudoprime; |
|
157
|
|
|
|
|
|
|
*is_euler_pseudoprime = \&Math::Prime::Util::PP::is_euler_pseudoprime; |
|
158
|
|
|
|
|
|
|
*is_strong_pseudoprime = \&Math::Prime::Util::PP::is_strong_pseudoprime; |
|
159
|
|
|
|
|
|
|
*is_euler_plumb_pseudoprime = \&Math::Prime::Util::PP::is_euler_plumb_pseudoprime; |
|
160
|
|
|
|
|
|
|
*is_perrin_pseudoprime = \&Math::Prime::Util::PP::is_perrin_pseudoprime; |
|
161
|
|
|
|
|
|
|
|
|
162
|
|
|
|
|
|
|
*is_cyclic = \&Math::Prime::Util::PP::is_cyclic; |
|
163
|
|
|
|
|
|
|
*is_carmichael = \&Math::Prime::Util::PP::is_carmichael; |
|
164
|
|
|
|
|
|
|
*is_quasi_carmichael = \&Math::Prime::Util::PP::is_quasi_carmichael; |
|
165
|
|
|
|
|
|
|
*is_practical = \&Math::Prime::Util::PP::is_practical; |
|
166
|
|
|
|
|
|
|
*is_pillai = \&Math::Prime::Util::PP::is_pillai; |
|
167
|
|
|
|
|
|
|
*is_fundamental = \&Math::Prime::Util::PP::is_fundamental; |
|
168
|
|
|
|
|
|
|
*is_semiprime = \&Math::Prime::Util::PP::is_semiprime; |
|
169
|
|
|
|
|
|
|
*is_almost_prime = \&Math::Prime::Util::PP::is_almost_prime; |
|
170
|
|
|
|
|
|
|
*is_chen_prime = \&Math::Prime::Util::PP::is_chen_prime; |
|
171
|
|
|
|
|
|
|
*is_omega_prime = \&Math::Prime::Util::PP::is_omega_prime; |
|
172
|
|
|
|
|
|
|
*is_totient = \&Math::Prime::Util::PP::is_totient; |
|
173
|
|
|
|
|
|
|
*is_square = \&Math::Prime::Util::PP::is_square; |
|
174
|
|
|
|
|
|
|
*is_prime_power = \&Math::Prime::Util::PP::is_prime_power; |
|
175
|
|
|
|
|
|
|
*is_lucky = \&Math::Prime::Util::PP::is_lucky; |
|
176
|
|
|
|
|
|
|
*is_gaussian_prime = \&Math::Prime::Util::PP::is_gaussian_prime; |
|
177
|
|
|
|
|
|
|
*is_polygonal = \&Math::Prime::Util::PP::is_polygonal; |
|
178
|
|
|
|
|
|
|
*is_smooth = \&Math::Prime::Util::PP::is_smooth; |
|
179
|
|
|
|
|
|
|
*is_rough = \&Math::Prime::Util::PP::is_rough; |
|
180
|
|
|
|
|
|
|
*is_perfect_power = \&Math::Prime::Util::PP::is_perfect_power; |
|
181
|
|
|
|
|
|
|
*is_powerful = \&Math::Prime::Util::PP::is_powerful; |
|
182
|
|
|
|
|
|
|
*is_odd = \&Math::Prime::Util::PP::is_odd; |
|
183
|
|
|
|
|
|
|
*is_even = \&Math::Prime::Util::PP::is_even; |
|
184
|
|
|
|
|
|
|
*is_divisible = \&Math::Prime::Util::PP::is_divisible; |
|
185
|
|
|
|
|
|
|
*is_congruent = \&Math::Prime::Util::PP::is_congruent; |
|
186
|
|
|
|
|
|
|
*is_congruent_number = \&Math::Prime::Util::PP::is_congruent_number; |
|
187
|
|
|
|
|
|
|
*is_perfect_number = \&Math::Prime::Util::PP::is_perfect_number; |
|
188
|
|
|
|
|
|
|
*is_delicate_prime = \&Math::Prime::Util::PP::is_delicate_prime; |
|
189
|
|
|
|
|
|
|
*is_happy = \&Math::Prime::Util::PP::is_happy; |
|
190
|
|
|
|
|
|
|
*powerful_count = \&Math::Prime::Util::PP::powerful_count; |
|
191
|
|
|
|
|
|
|
*nth_powerful = \&Math::Prime::Util::PP::nth_powerful; |
|
192
|
|
|
|
|
|
|
*sumpowerful = \&Math::Prime::Util::PP::sumpowerful; |
|
193
|
|
|
|
|
|
|
*perfect_power_count = \&Math::Prime::Util::PP::perfect_power_count; |
|
194
|
|
|
|
|
|
|
*is_power = \&Math::Prime::Util::PP::is_power; |
|
195
|
|
|
|
|
|
|
*is_square_free = \&Math::Prime::Util::PP::is_square_free; |
|
196
|
|
|
|
|
|
|
*is_sum_of_squares = \&Math::Prime::Util::PP::is_sum_of_squares; |
|
197
|
|
|
|
|
|
|
*is_powerfree = \&Math::Prime::Util::PP::is_powerfree; |
|
198
|
|
|
|
|
|
|
*powerfree_count = \&Math::Prime::Util::PP::powerfree_count; |
|
199
|
|
|
|
|
|
|
*nth_powerfree = \&Math::Prime::Util::PP::nth_powerfree; |
|
200
|
|
|
|
|
|
|
*powerfree_sum = \&Math::Prime::Util::PP::powerfree_sum; |
|
201
|
|
|
|
|
|
|
*powerfree_part = \&Math::Prime::Util::PP::powerfree_part; |
|
202
|
|
|
|
|
|
|
*powerfree_part_sum = \&Math::Prime::Util::PP::powerfree_part_sum; |
|
203
|
|
|
|
|
|
|
*squarefree_kernel = \&Math::Prime::Util::PP::squarefree_kernel; |
|
204
|
|
|
|
|
|
|
# TODO: Should this do validation here? |
|
205
|
|
|
|
|
|
|
*powersum = \&Math::Prime::Util::PP::powersum; |
|
206
|
|
|
|
|
|
|
*next_chen_prime = \&Math::Prime::Util::PP::next_chen_prime; |
|
207
|
|
|
|
|
|
|
|
|
208
|
|
|
|
|
|
|
*random_prime = \&Math::Prime::Util::PP::random_prime; |
|
209
|
|
|
|
|
|
|
*random_ndigit_prime = \&Math::Prime::Util::PP::random_ndigit_prime; |
|
210
|
|
|
|
|
|
|
*random_nbit_prime = \&Math::Prime::Util::PP::random_nbit_prime; |
|
211
|
|
|
|
|
|
|
*random_proven_prime = \&Math::Prime::Util::PP::random_maurer_prime; # redir |
|
212
|
|
|
|
|
|
|
*random_safe_prime = \&Math::Prime::Util::PP::random_safe_prime; |
|
213
|
|
|
|
|
|
|
*random_strong_prime = \&Math::Prime::Util::PP::random_strong_prime; |
|
214
|
|
|
|
|
|
|
*random_maurer_prime = \&Math::Prime::Util::PP::random_maurer_prime; |
|
215
|
|
|
|
|
|
|
*random_shawe_taylor_prime =\&Math::Prime::Util::PP::random_shawe_taylor_prime; |
|
216
|
|
|
|
|
|
|
*miller_rabin_random = \&Math::Prime::Util::PP::miller_rabin_random; |
|
217
|
|
|
|
|
|
|
*random_semiprime = \&Math::Prime::Util::PP::random_semiprime; |
|
218
|
|
|
|
|
|
|
*random_unrestricted_semiprime = \&Math::Prime::Util::PP::random_unrestricted_semiprime; |
|
219
|
|
|
|
|
|
|
*random_factored_integer = \&Math::Prime::Util::PP::random_factored_integer; |
|
220
|
|
|
|
|
|
|
|
|
221
|
|
|
|
|
|
|
*next_prime = \&Math::Prime::Util::PP::next_prime; |
|
222
|
|
|
|
|
|
|
*prev_prime = \&Math::Prime::Util::PP::prev_prime; |
|
223
|
|
|
|
|
|
|
*next_prime_power = \&Math::Prime::Util::PP::next_prime_power; |
|
224
|
|
|
|
|
|
|
*prev_prime_power = \&Math::Prime::Util::PP::prev_prime_power; |
|
225
|
|
|
|
|
|
|
*next_perfect_power = \&Math::Prime::Util::PP::next_perfect_power; |
|
226
|
|
|
|
|
|
|
*prev_perfect_power = \&Math::Prime::Util::PP::prev_perfect_power; |
|
227
|
|
|
|
|
|
|
|
|
228
|
|
|
|
|
|
|
*numtoperm = \&Math::Prime::Util::PP::numtoperm; |
|
229
|
|
|
|
|
|
|
*permtonum = \&Math::Prime::Util::PP::permtonum; |
|
230
|
|
|
|
|
|
|
*randperm = \&Math::Prime::Util::PP::randperm; |
|
231
|
|
|
|
|
|
|
*shuffle = \&Math::Prime::Util::PP::shuffle; |
|
232
|
|
|
|
|
|
|
|
|
233
|
|
|
|
|
|
|
*lcm = \&Math::Prime::Util::PP::lcm; |
|
234
|
|
|
|
|
|
|
*gcdext = \&Math::Prime::Util::PP::gcdext; |
|
235
|
|
|
|
|
|
|
*prime_bigomega = \&Math::Prime::Util::PP::prime_bigomega; |
|
236
|
|
|
|
|
|
|
*prime_omega = \&Math::Prime::Util::PP::prime_omega; |
|
237
|
|
|
|
|
|
|
*moebius = \&Math::Prime::Util::PP::moebius; |
|
238
|
|
|
|
|
|
|
*euler_phi = \&Math::Prime::Util::PP::euler_phi; |
|
239
|
|
|
|
|
|
|
*inverse_totient = \&Math::Prime::Util::PP::inverse_totient; |
|
240
|
|
|
|
|
|
|
*divisor_sum = \&Math::Prime::Util::PP::divisor_sum; |
|
241
|
|
|
|
|
|
|
*sumtotient = \&Math::Prime::Util::PP::sumtotient; |
|
242
|
|
|
|
|
|
|
*jordan_totient = \&Math::Prime::Util::PP::jordan_totient; |
|
243
|
|
|
|
|
|
|
*ramanujan_sum = \&Math::Prime::Util::PP::ramanujan_sum; |
|
244
|
|
|
|
|
|
|
*mertens = \&Math::Prime::Util::PP::mertens; |
|
245
|
|
|
|
|
|
|
*valuation = \&Math::Prime::Util::PP::valuation; |
|
246
|
|
|
|
|
|
|
*hammingweight = \&Math::Prime::Util::PP::hammingweight; |
|
247
|
|
|
|
|
|
|
*chinese = \&Math::Prime::Util::PP::chinese; |
|
248
|
|
|
|
|
|
|
*chinese2 = \&Math::Prime::Util::PP::chinese2; |
|
249
|
|
|
|
|
|
|
*cornacchia = \&Math::Prime::Util::PP::cornacchia; |
|
250
|
|
|
|
|
|
|
*primorial = \&Math::Prime::Util::PP::primorial; |
|
251
|
|
|
|
|
|
|
*pn_primorial = \&Math::Prime::Util::PP::pn_primorial; |
|
252
|
|
|
|
|
|
|
*divisors = \&Math::Prime::Util::PP::divisors; |
|
253
|
|
|
|
|
|
|
*partitions = \&Math::Prime::Util::PP::partitions; |
|
254
|
|
|
|
|
|
|
*consecutive_integer_lcm = \&Math::Prime::Util::PP::consecutive_integer_lcm; |
|
255
|
|
|
|
|
|
|
*carmichael_lambda = \&Math::Prime::Util::PP::carmichael_lambda; |
|
256
|
|
|
|
|
|
|
*exp_mangoldt = \&Math::Prime::Util::PP::exp_mangoldt; |
|
257
|
|
|
|
|
|
|
*liouville = \&Math::Prime::Util::PP::liouville; |
|
258
|
|
|
|
|
|
|
*sumliouville = \&Math::Prime::Util::PP::sumliouville; |
|
259
|
|
|
|
|
|
|
*frobenius_number = \&Math::Prime::Util::PP::frobenius_number; |
|
260
|
|
|
|
|
|
|
*binomial = \&Math::Prime::Util::PP::binomial; |
|
261
|
|
|
|
|
|
|
*subfactorial = \&Math::Prime::Util::PP::subfactorial; |
|
262
|
|
|
|
|
|
|
*fubini = \&Math::Prime::Util::PP::fubini; |
|
263
|
|
|
|
|
|
|
*falling_factorial = \&Math::Prime::Util::PP::falling_factorial; |
|
264
|
|
|
|
|
|
|
*rising_factorial = \&Math::Prime::Util::PP::rising_factorial; |
|
265
|
|
|
|
|
|
|
|
|
266
|
|
|
|
|
|
|
*chebyshev_theta = \&Math::Prime::Util::PP::chebyshev_theta; |
|
267
|
|
|
|
|
|
|
*chebyshev_psi = \&Math::Prime::Util::PP::chebyshev_psi; |
|
268
|
|
|
|
|
|
|
*hclassno = \&Math::Prime::Util::PP::hclassno; |
|
269
|
|
|
|
|
|
|
*ramanujan_tau = \&Math::Prime::Util::PP::ramanujan_tau; |
|
270
|
|
|
|
|
|
|
*legendre_phi = \&Math::Prime::Util::PP::legendre_phi; |
|
271
|
|
|
|
|
|
|
|
|
272
|
|
|
|
|
|
|
*bernfrac = \&Math::Prime::Util::PP::bernfrac; |
|
273
|
|
|
|
|
|
|
*harmfrac = \&Math::Prime::Util::PP::harmfrac; |
|
274
|
|
|
|
|
|
|
*contfrac = \&Math::Prime::Util::PP::contfrac; |
|
275
|
|
|
|
|
|
|
*from_contfrac = \&Math::Prime::Util::PP::from_contfrac; |
|
276
|
|
|
|
|
|
|
*next_calkin_wilf = \&Math::Prime::Util::PP::next_calkin_wilf; |
|
277
|
|
|
|
|
|
|
*next_stern_brocot = \&Math::Prime::Util::PP::next_stern_brocot; |
|
278
|
|
|
|
|
|
|
*calkin_wilf_n = \&Math::Prime::Util::PP::calkin_wilf_n; |
|
279
|
|
|
|
|
|
|
*stern_brocot_n = \&Math::Prime::Util::PP::stern_brocot_n; |
|
280
|
|
|
|
|
|
|
*nth_calkin_wilf = \&Math::Prime::Util::PP::nth_calkin_wilf; |
|
281
|
|
|
|
|
|
|
*nth_stern_brocot = \&Math::Prime::Util::PP::nth_stern_brocot; |
|
282
|
|
|
|
|
|
|
*nth_stern_diatomic = \&Math::Prime::Util::PP::nth_stern_diatomic; |
|
283
|
|
|
|
|
|
|
*farey = \&Math::Prime::Util::PP::farey; |
|
284
|
|
|
|
|
|
|
*next_farey = \&Math::Prime::Util::PP::next_farey; |
|
285
|
|
|
|
|
|
|
*farey_rank = \&Math::Prime::Util::PP::farey_rank; |
|
286
|
|
|
|
|
|
|
|
|
287
|
|
|
|
|
|
|
|
|
288
|
|
|
|
|
|
|
*addint = \&Math::Prime::Util::PP::addint; |
|
289
|
|
|
|
|
|
|
*subint = \&Math::Prime::Util::PP::subint; |
|
290
|
|
|
|
|
|
|
*add1int = \&Math::Prime::Util::PP::add1int; |
|
291
|
|
|
|
|
|
|
*sub1int = \&Math::Prime::Util::PP::sub1int; |
|
292
|
|
|
|
|
|
|
*lshiftint = \&Math::Prime::Util::PP::lshiftint; |
|
293
|
|
|
|
|
|
|
*rshiftint = \&Math::Prime::Util::PP::rshiftint; |
|
294
|
|
|
|
|
|
|
*rashiftint = \&Math::Prime::Util::PP::rashiftint; |
|
295
|
|
|
|
|
|
|
*mulint = \&Math::Prime::Util::PP::mulint; |
|
296
|
|
|
|
|
|
|
*powint = \&Math::Prime::Util::PP::powint; |
|
297
|
|
|
|
|
|
|
*divint = \&Math::Prime::Util::PP::divint; |
|
298
|
|
|
|
|
|
|
*modint = \&Math::Prime::Util::PP::modint; |
|
299
|
|
|
|
|
|
|
*cdivint = \&Math::Prime::Util::PP::cdivint; |
|
300
|
|
|
|
|
|
|
*divrem = \&Math::Prime::Util::PP::divrem; |
|
301
|
|
|
|
|
|
|
*tdivrem = \&Math::Prime::Util::PP::tdivrem; |
|
302
|
|
|
|
|
|
|
*fdivrem = \&Math::Prime::Util::PP::fdivrem; |
|
303
|
|
|
|
|
|
|
*cdivrem = \&Math::Prime::Util::PP::cdivrem; |
|
304
|
|
|
|
|
|
|
*absint = \&Math::Prime::Util::PP::absint; |
|
305
|
|
|
|
|
|
|
*negint = \&Math::Prime::Util::PP::negint; |
|
306
|
|
|
|
|
|
|
*signint = \&Math::Prime::Util::PP::signint; |
|
307
|
|
|
|
|
|
|
*cmpint = \&Math::Prime::Util::PP::cmpint; |
|
308
|
|
|
|
|
|
|
*sqrtint = \&Math::Prime::Util::PP::sqrtint; |
|
309
|
|
|
|
|
|
|
*rootint = \&Math::Prime::Util::PP::rootint; |
|
310
|
|
|
|
|
|
|
*logint = \&Math::Prime::Util::PP::logint; |
|
311
|
|
|
|
|
|
|
|
|
312
|
|
|
|
|
|
|
*negmod = \&Math::Prime::Util::PP::negmod; |
|
313
|
|
|
|
|
|
|
*sqrtmod = \&Math::Prime::Util::PP::sqrtmod; |
|
314
|
|
|
|
|
|
|
*allsqrtmod = \&Math::Prime::Util::PP::allsqrtmod; |
|
315
|
|
|
|
|
|
|
*rootmod = \&Math::Prime::Util::PP::rootmod; |
|
316
|
|
|
|
|
|
|
*allrootmod = \&Math::Prime::Util::PP::allrootmod; |
|
317
|
|
|
|
|
|
|
*factorialmod = \&Math::Prime::Util::PP::factorialmod; |
|
318
|
|
|
|
|
|
|
*binomialmod = \&Math::Prime::Util::PP::binomialmod; |
|
319
|
|
|
|
|
|
|
*lucasumod = \&Math::Prime::Util::PP::lucasumod; |
|
320
|
|
|
|
|
|
|
*lucasvmod = \&Math::Prime::Util::PP::lucasvmod; |
|
321
|
|
|
|
|
|
|
*lucasuvmod = \&Math::Prime::Util::PP::lucasuvmod; |
|
322
|
|
|
|
|
|
|
*pisano_period = \&Math::Prime::Util::PP::pisano_period; |
|
323
|
|
|
|
|
|
|
*znlog = \&Math::Prime::Util::PP::znlog; |
|
324
|
|
|
|
|
|
|
*znorder = \&Math::Prime::Util::PP::znorder; |
|
325
|
|
|
|
|
|
|
*znprimroot = \&Math::Prime::Util::PP::znprimroot; |
|
326
|
|
|
|
|
|
|
*is_primitive_root = \&Math::Prime::Util::PP::is_primitive_root; |
|
327
|
|
|
|
|
|
|
*qnr = \&Math::Prime::Util::PP::qnr; |
|
328
|
|
|
|
|
|
|
*is_qr = \&Math::Prime::Util::PP::is_qr; |
|
329
|
|
|
|
|
|
|
|
|
330
|
|
|
|
|
|
|
|
|
331
|
|
|
|
|
|
|
*vecequal = \&Math::Prime::Util::PP::vecequal; |
|
332
|
|
|
|
|
|
|
*vecuniq = \&Math::Prime::Util::PP::vecuniq; |
|
333
|
|
|
|
|
|
|
*vecfreq = \&Math::Prime::Util::PP::vecfreq; |
|
334
|
|
|
|
|
|
|
*vecsingleton = \&Math::Prime::Util::PP::vecsingleton; |
|
335
|
|
|
|
|
|
|
*vecsort = \&Math::Prime::Util::PP::vecsort; |
|
336
|
|
|
|
|
|
|
*vecsorti = \&Math::Prime::Util::PP::vecsorti; |
|
337
|
|
|
|
|
|
|
*setbinop = \&Math::Prime::Util::PP::setbinop; |
|
338
|
|
|
|
|
|
|
*sumset = \&Math::Prime::Util::PP::sumset; |
|
339
|
|
|
|
|
|
|
*setunion = \&Math::Prime::Util::PP::setunion; |
|
340
|
|
|
|
|
|
|
*setintersect = \&Math::Prime::Util::PP::setintersect; |
|
341
|
|
|
|
|
|
|
*setminus = \&Math::Prime::Util::PP::setminus; |
|
342
|
|
|
|
|
|
|
*setdelta = \&Math::Prime::Util::PP::setdelta; |
|
343
|
|
|
|
|
|
|
*setinsert = \&Math::Prime::Util::PP::setinsert; |
|
344
|
|
|
|
|
|
|
*setremove = \&Math::Prime::Util::PP::setremove; |
|
345
|
|
|
|
|
|
|
*setinvert = \&Math::Prime::Util::PP::setinvert; |
|
346
|
|
|
|
|
|
|
*setcontains = \&Math::Prime::Util::PP::setcontains; |
|
347
|
|
|
|
|
|
|
*setcontainsany = \&Math::Prime::Util::PP::setcontainsany; |
|
348
|
|
|
|
|
|
|
*toset = \&Math::Prime::Util::PP::toset; |
|
349
|
|
|
|
|
|
|
*is_sidon_set = \&Math::Prime::Util::PP::is_sidon_set; |
|
350
|
|
|
|
|
|
|
*is_sumfree_set = \&Math::Prime::Util::PP::is_sumfree_set; |
|
351
|
|
|
|
|
|
|
*set_is_disjoint = \&Math::Prime::Util::PP::set_is_disjoint; |
|
352
|
|
|
|
|
|
|
*set_is_equal = \&Math::Prime::Util::PP::set_is_equal; |
|
353
|
|
|
|
|
|
|
*set_is_subset = \&Math::Prime::Util::PP::set_is_subset; |
|
354
|
|
|
|
|
|
|
*set_is_proper_subset = \&Math::Prime::Util::PP::set_is_proper_subset; |
|
355
|
|
|
|
|
|
|
*set_is_superset = \&Math::Prime::Util::PP::set_is_superset; |
|
356
|
|
|
|
|
|
|
*set_is_proper_superset = \&Math::Prime::Util::PP::set_is_proper_superset; |
|
357
|
|
|
|
|
|
|
*set_is_proper_intersection = \&Math::Prime::Util::PP::set_is_proper_intersection; |
|
358
|
|
|
|
|
|
|
|
|
359
|
|
|
|
|
|
|
*tozeckendorf = \&Math::Prime::Util::PP::tozeckendorf; |
|
360
|
|
|
|
|
|
|
*fromzeckendorf = \&Math::Prime::Util::PP::fromzeckendorf; |
|
361
|
|
|
|
|
|
|
|
|
362
|
|
|
|
|
|
|
*goldbach_pairs = \&Math::Prime::Util::PP::goldbach_pairs; |
|
363
|
|
|
|
|
|
|
*goldbach_pair_count = \&Math::Prime::Util::PP::goldbach_pair_count; |
|
364
|
|
|
|
|
|
|
*minimal_goldbach_pair = \&Math::Prime::Util::PP::minimal_goldbach_pair; |
|
365
|
|
|
|
|
|
|
|
|
366
|
|
|
|
|
|
|
*prime_count_approx = \&Math::Prime::Util::PP::prime_count_approx; |
|
367
|
|
|
|
|
|
|
*prime_count_lower = \&Math::Prime::Util::PP::prime_count_lower; |
|
368
|
|
|
|
|
|
|
*prime_count_upper = \&Math::Prime::Util::PP::prime_count_upper; |
|
369
|
|
|
|
|
|
|
*nth_prime = \&Math::Prime::Util::PP::nth_prime; |
|
370
|
|
|
|
|
|
|
*nth_prime_approx = \&Math::Prime::Util::PP::nth_prime_approx; |
|
371
|
|
|
|
|
|
|
*nth_prime_lower = \&Math::Prime::Util::PP::nth_prime_lower; |
|
372
|
|
|
|
|
|
|
*nth_prime_upper = \&Math::Prime::Util::PP::nth_prime_upper; |
|
373
|
|
|
|
|
|
|
*prime_power_count_approx = \&Math::Prime::Util::PP::prime_power_count_approx; |
|
374
|
|
|
|
|
|
|
*prime_power_count_lower = \&Math::Prime::Util::PP::prime_power_count_lower; |
|
375
|
|
|
|
|
|
|
*prime_power_count_upper = \&Math::Prime::Util::PP::prime_power_count_upper; |
|
376
|
|
|
|
|
|
|
*perfect_power_count_approx = \&Math::Prime::Util::PP::perfect_power_count_approx; |
|
377
|
|
|
|
|
|
|
*perfect_power_count_lower = \&Math::Prime::Util::PP::perfect_power_count_lower; |
|
378
|
|
|
|
|
|
|
*perfect_power_count_upper = \&Math::Prime::Util::PP::perfect_power_count_upper; |
|
379
|
|
|
|
|
|
|
*lucky_count_approx = \&Math::Prime::Util::PP::lucky_count_approx; |
|
380
|
|
|
|
|
|
|
*lucky_count_lower = \&Math::Prime::Util::PP::lucky_count_lower; |
|
381
|
|
|
|
|
|
|
*lucky_count_upper = \&Math::Prime::Util::PP::lucky_count_upper; |
|
382
|
|
|
|
|
|
|
*nth_prime_power = \&Math::Prime::Util::PP::nth_prime_power; |
|
383
|
|
|
|
|
|
|
*nth_prime_power_approx = \&Math::Prime::Util::PP::nth_prime_power_approx; |
|
384
|
|
|
|
|
|
|
*nth_prime_power_lower = \&Math::Prime::Util::PP::nth_prime_power_lower; |
|
385
|
|
|
|
|
|
|
*nth_prime_power_upper = \&Math::Prime::Util::PP::nth_prime_power_upper; |
|
386
|
|
|
|
|
|
|
*nth_perfect_power = \&Math::Prime::Util::PP::nth_perfect_power; |
|
387
|
|
|
|
|
|
|
*nth_perfect_power_approx = \&Math::Prime::Util::PP::nth_perfect_power_approx; |
|
388
|
|
|
|
|
|
|
*nth_perfect_power_lower = \&Math::Prime::Util::PP::nth_perfect_power_lower; |
|
389
|
|
|
|
|
|
|
*nth_perfect_power_upper = \&Math::Prime::Util::PP::nth_perfect_power_upper; |
|
390
|
|
|
|
|
|
|
*nth_lucky = \&Math::Prime::Util::PP::nth_lucky; |
|
391
|
|
|
|
|
|
|
*nth_lucky_approx = \&Math::Prime::Util::PP::nth_lucky_approx; |
|
392
|
|
|
|
|
|
|
*nth_lucky_lower = \&Math::Prime::Util::PP::nth_lucky_lower; |
|
393
|
|
|
|
|
|
|
*nth_lucky_upper = \&Math::Prime::Util::PP::nth_lucky_upper; |
|
394
|
|
|
|
|
|
|
|
|
395
|
|
|
|
|
|
|
*semiprime_count_approx = \&Math::Prime::Util::PP::semiprime_count_approx; |
|
396
|
|
|
|
|
|
|
*nth_semiprime_approx = \&Math::Prime::Util::PP::nth_semiprime_approx; |
|
397
|
|
|
|
|
|
|
*twin_prime_count_approx = \&Math::Prime::Util::PP::twin_prime_count_approx; |
|
398
|
|
|
|
|
|
|
*nth_twin_prime_approx = \&Math::Prime::Util::PP::nth_twin_prime_approx; |
|
399
|
|
|
|
|
|
|
*nth_semiprime = \&Math::Prime::Util::PP::nth_semiprime; |
|
400
|
|
|
|
|
|
|
|
|
401
|
|
|
|
|
|
|
*almost_prime_count_approx = \&Math::Prime::Util::PP::almost_prime_count_approx; |
|
402
|
|
|
|
|
|
|
*almost_prime_count_lower = \&Math::Prime::Util::PP::almost_prime_count_lower; |
|
403
|
|
|
|
|
|
|
*almost_prime_count_upper = \&Math::Prime::Util::PP::almost_prime_count_upper; |
|
404
|
|
|
|
|
|
|
|
|
405
|
|
|
|
|
|
|
*ramanujan_prime_count_approx= \&Math::Prime::Util::PP::ramanujan_prime_count_approx; |
|
406
|
|
|
|
|
|
|
*ramanujan_prime_count_lower = \&Math::Prime::Util::PP::ramanujan_prime_count_lower; |
|
407
|
|
|
|
|
|
|
*ramanujan_prime_count_upper = \&Math::Prime::Util::PP::ramanujan_prime_count_upper; |
|
408
|
|
|
|
|
|
|
*nth_ramanujan_prime =\&Math::Prime::Util::PP::nth_ramanujan_prime; |
|
409
|
|
|
|
|
|
|
*nth_ramanujan_prime_lower =\&Math::Prime::Util::PP::nth_ramanujan_prime_lower; |
|
410
|
|
|
|
|
|
|
*nth_ramanujan_prime_upper =\&Math::Prime::Util::PP::nth_ramanujan_prime_upper; |
|
411
|
|
|
|
|
|
|
*nth_ramanujan_prime_approx=\&Math::Prime::Util::PP::nth_ramanujan_prime_approx; |
|
412
|
|
|
|
|
|
|
|
|
413
|
|
|
|
|
|
|
*factor = \&Math::Prime::Util::PP::factor; |
|
414
|
|
|
|
|
|
|
*factor_exp = \&Math::Prime::Util::PP::factor_exp; |
|
415
|
|
|
|
|
|
|
*trial_factor = \&Math::Prime::Util::PP::trial_factor; |
|
416
|
|
|
|
|
|
|
*prho_factor = \&Math::Prime::Util::PP::prho_factor; |
|
417
|
|
|
|
|
|
|
*pbrent_factor = \&Math::Prime::Util::PP::pbrent_factor; |
|
418
|
|
|
|
|
|
|
*ecm_factor = \&Math::Prime::Util::PP::ecm_factor; |
|
419
|
|
|
|
|
|
|
*fermat_factor = \&Math::Prime::Util::PP::fermat_factor; |
|
420
|
|
|
|
|
|
|
*holf_factor = \&Math::Prime::Util::PP::holf_factor; |
|
421
|
|
|
|
|
|
|
*squfof_factor = \&Math::Prime::Util::PP::squfof_factor; |
|
422
|
|
|
|
|
|
|
*lehman_factor = \&Math::Prime::Util::PP::lehman_factor; |
|
423
|
|
|
|
|
|
|
*pminus1_factor = \&Math::Prime::Util::PP::pminus1_factor; |
|
424
|
|
|
|
|
|
|
*pplus1_factor = \&Math::Prime::Util::PP::pplus1_factor; |
|
425
|
|
|
|
|
|
|
*cheb_factor = \&Math::Prime::Util::PP::cheb_factor; |
|
426
|
|
|
|
|
|
|
|
|
427
|
|
|
|
|
|
|
*primes = \&Math::Prime::Util::PP::primes; |
|
428
|
|
|
|
|
|
|
*prime_powers = \&Math::Prime::Util::PP::prime_powers; |
|
429
|
|
|
|
|
|
|
*twin_primes = \&Math::Prime::Util::PP::twin_primes; |
|
430
|
|
|
|
|
|
|
*semi_primes = \&Math::Prime::Util::PP::semi_primes; |
|
431
|
|
|
|
|
|
|
*ramanujan_primes = \&Math::Prime::Util::PP::ramanujan_primes; |
|
432
|
|
|
|
|
|
|
*almost_primes = \&Math::Prime::Util::PP::almost_primes; |
|
433
|
|
|
|
|
|
|
*omega_primes = \&Math::Prime::Util::PP::omega_primes; |
|
434
|
|
|
|
|
|
|
|
|
435
|
|
|
|
|
|
|
|
|
436
|
|
|
|
|
|
|
# We are doing the validation here so the PP code doesn't have to do it. |
|
437
|
|
|
|
|
|
|
|
|
438
|
|
|
|
|
|
|
sub nth_twin_prime { |
|
439
|
1
|
|
|
1
|
1
|
4
|
my($n) = @_; |
|
440
|
1
|
|
|
|
|
6
|
_validate_integer_nonneg($n); |
|
441
|
1
|
|
|
|
|
6
|
return Math::Prime::Util::PP::nth_twin_prime($n); |
|
442
|
|
|
|
|
|
|
} |
|
443
|
|
|
|
|
|
|
sub nth_almost_prime { |
|
444
|
20
|
|
|
20
|
1
|
95
|
my($k,$n) = @_; |
|
445
|
20
|
|
|
|
|
73
|
_validate_integer_nonneg($k); |
|
446
|
20
|
|
|
|
|
62
|
_validate_integer_nonneg($n); |
|
447
|
20
|
|
|
|
|
70
|
return Math::Prime::Util::PP::nth_almost_prime($k,$n); |
|
448
|
|
|
|
|
|
|
} |
|
449
|
|
|
|
|
|
|
sub nth_almost_prime_approx { |
|
450
|
1
|
|
|
1
|
1
|
37
|
my($k,$n) = @_; |
|
451
|
1
|
|
|
|
|
5
|
_validate_integer_nonneg($k); |
|
452
|
1
|
|
|
|
|
3
|
_validate_integer_nonneg($n); |
|
453
|
1
|
|
|
|
|
4
|
return Math::Prime::Util::PP::nth_almost_prime_approx($k,$n); |
|
454
|
|
|
|
|
|
|
} |
|
455
|
|
|
|
|
|
|
sub nth_almost_prime_lower { |
|
456
|
12
|
|
|
12
|
1
|
747
|
my($k,$n) = @_; |
|
457
|
12
|
|
|
|
|
44
|
_validate_integer_nonneg($k); |
|
458
|
12
|
|
|
|
|
37
|
_validate_integer_nonneg($n); |
|
459
|
12
|
|
|
|
|
49
|
return Math::Prime::Util::PP::nth_almost_prime_lower($k,$n); |
|
460
|
|
|
|
|
|
|
} |
|
461
|
|
|
|
|
|
|
sub nth_almost_prime_upper { |
|
462
|
2
|
|
|
2
|
1
|
10
|
my($k,$n) = @_; |
|
463
|
2
|
|
|
|
|
7
|
_validate_integer_nonneg($k); |
|
464
|
2
|
|
|
|
|
5
|
_validate_integer_nonneg($n); |
|
465
|
2
|
|
|
|
|
10
|
return Math::Prime::Util::PP::nth_almost_prime_upper($k,$n); |
|
466
|
|
|
|
|
|
|
} |
|
467
|
|
|
|
|
|
|
sub nth_omega_prime { |
|
468
|
5
|
|
|
5
|
1
|
29
|
my($k,$n) = @_; |
|
469
|
5
|
|
|
|
|
26
|
_validate_integer_nonneg($k); |
|
470
|
5
|
|
|
|
|
17
|
_validate_integer_nonneg($n); |
|
471
|
5
|
|
|
|
|
25
|
return Math::Prime::Util::PP::nth_omega_prime($k,$n); |
|
472
|
|
|
|
|
|
|
} |
|
473
|
|
|
|
|
|
|
|
|
474
|
|
|
|
|
|
|
sub is_lucas_pseudoprime { |
|
475
|
4
|
|
|
4
|
1
|
28
|
my($n) = @_; |
|
476
|
4
|
|
|
|
|
27
|
_validate_integer($n); |
|
477
|
4
|
50
|
|
|
|
19
|
return 0 if $n < 0; |
|
478
|
4
|
|
|
|
|
20
|
return Math::Prime::Util::PP::is_lucas_pseudoprime($n); |
|
479
|
|
|
|
|
|
|
} |
|
480
|
|
|
|
|
|
|
sub is_strong_lucas_pseudoprime { |
|
481
|
4
|
|
|
4
|
1
|
24
|
my($n) = @_; |
|
482
|
4
|
|
|
|
|
14
|
_validate_integer($n); |
|
483
|
4
|
50
|
|
|
|
14
|
return 0 if $n < 0; |
|
484
|
4
|
|
|
|
|
17
|
return Math::Prime::Util::PP::is_strong_lucas_pseudoprime($n); |
|
485
|
|
|
|
|
|
|
} |
|
486
|
|
|
|
|
|
|
sub is_extra_strong_lucas_pseudoprime { |
|
487
|
7
|
|
|
7
|
1
|
1539
|
my($n) = @_; |
|
488
|
7
|
|
|
|
|
52
|
_validate_integer($n); |
|
489
|
7
|
50
|
|
|
|
24
|
return 0 if $n < 0; |
|
490
|
7
|
|
|
|
|
166
|
return Math::Prime::Util::PP::is_extra_strong_lucas_pseudoprime($n); |
|
491
|
|
|
|
|
|
|
} |
|
492
|
|
|
|
|
|
|
sub is_almost_extra_strong_lucas_pseudoprime { |
|
493
|
9
|
|
|
9
|
1
|
58
|
my($n, $increment) = @_; |
|
494
|
9
|
|
|
|
|
33
|
_validate_integer($n); |
|
495
|
9
|
50
|
|
|
|
24
|
return 0 if $n < 0; |
|
496
|
9
|
100
|
|
|
|
28
|
if (defined $increment) { _validate_integer_nonneg($increment); } |
|
|
4
|
|
|
|
|
16
|
|
|
497
|
5
|
|
|
|
|
7
|
else { $increment = 1; } |
|
498
|
9
|
50
|
33
|
|
|
39
|
croak "aes lucas pseudoprime parameter must be 1-256" |
|
499
|
|
|
|
|
|
|
if $increment < 1 || $increment > 256; |
|
500
|
9
|
|
|
|
|
40
|
return Math::Prime::Util::PP::is_almost_extra_strong_lucas_pseudoprime($n, $increment); |
|
501
|
|
|
|
|
|
|
} |
|
502
|
|
|
|
|
|
|
sub is_catalan_pseudoprime { |
|
503
|
3
|
|
|
3
|
1
|
7
|
my($n) = @_; |
|
504
|
3
|
|
|
|
|
11
|
_validate_integer($n); |
|
505
|
3
|
50
|
|
|
|
6
|
return 0 if $n < 0; |
|
506
|
3
|
|
|
|
|
14
|
return Math::Prime::Util::PP::is_catalan_pseudoprime($n); |
|
507
|
|
|
|
|
|
|
} |
|
508
|
|
|
|
|
|
|
sub is_frobenius_pseudoprime { |
|
509
|
1
|
|
|
1
|
1
|
3
|
my($n, $P, $Q) = @_; |
|
510
|
1
|
|
|
|
|
7
|
_validate_integer($n); |
|
511
|
1
|
50
|
|
|
|
4
|
return 0 if $n < 0; |
|
512
|
|
|
|
|
|
|
# TODO: validate P & Q |
|
513
|
1
|
|
|
|
|
6
|
return Math::Prime::Util::PP::is_frobenius_pseudoprime($n, $P, $Q); |
|
514
|
|
|
|
|
|
|
} |
|
515
|
|
|
|
|
|
|
sub is_frobenius_underwood_pseudoprime { |
|
516
|
1
|
|
|
1
|
1
|
3
|
my($n) = @_; |
|
517
|
1
|
|
|
|
|
8
|
_validate_integer($n); |
|
518
|
1
|
50
|
|
|
|
5
|
return 0 if $n < 0; |
|
519
|
1
|
|
|
|
|
7
|
return Math::Prime::Util::PP::is_frobenius_underwood_pseudoprime($n); |
|
520
|
|
|
|
|
|
|
} |
|
521
|
|
|
|
|
|
|
sub is_frobenius_khashin_pseudoprime { |
|
522
|
1
|
|
|
1
|
1
|
2
|
my($n) = @_; |
|
523
|
1
|
|
|
|
|
7
|
_validate_integer($n); |
|
524
|
1
|
50
|
|
|
|
3
|
return 0 if $n < 0; |
|
525
|
1
|
|
|
|
|
6
|
return Math::Prime::Util::PP::is_frobenius_khashin_pseudoprime($n); |
|
526
|
|
|
|
|
|
|
} |
|
527
|
|
|
|
|
|
|
sub is_aks_prime { |
|
528
|
10
|
|
|
10
|
1
|
1996
|
my($n) = @_; |
|
529
|
10
|
|
|
|
|
50
|
_validate_integer($n); |
|
530
|
10
|
50
|
|
|
|
46
|
return 0 if $n < 0; |
|
531
|
10
|
|
|
|
|
121
|
return Math::Prime::Util::PP::is_aks_prime($n); |
|
532
|
|
|
|
|
|
|
} |
|
533
|
|
|
|
|
|
|
sub is_ramanujan_prime { |
|
534
|
2
|
|
|
2
|
1
|
1216
|
my($n) = @_; |
|
535
|
2
|
|
|
|
|
19
|
_validate_integer($n); |
|
536
|
2
|
50
|
|
|
|
8
|
return 0 if $n < 0; |
|
537
|
2
|
|
|
|
|
25
|
return Math::Prime::Util::PP::is_ramanujan_prime($n); |
|
538
|
|
|
|
|
|
|
} |
|
539
|
|
|
|
|
|
|
sub is_mersenne_prime { |
|
540
|
3
|
|
|
3
|
1
|
10
|
my($p) = @_; |
|
541
|
3
|
|
|
|
|
13
|
_validate_integer_nonneg($p); |
|
542
|
3
|
|
|
|
|
74
|
return Math::Prime::Util::PP::is_mersenne_prime($p); |
|
543
|
|
|
|
|
|
|
} |
|
544
|
|
|
|
|
|
|
sub lucas_sequence { |
|
545
|
0
|
|
|
0
|
1
|
0
|
my($n, $P, $Q, $k) = @_; |
|
546
|
0
|
|
|
|
|
0
|
my ($vp, $vq) = ($P, $Q); |
|
547
|
0
|
|
|
|
|
0
|
_validate_integer_positive($n); |
|
548
|
0
|
|
|
|
|
0
|
_validate_integer($vp); |
|
549
|
0
|
|
|
|
|
0
|
_validate_integer($vq); |
|
550
|
0
|
|
|
|
|
0
|
_validate_integer_nonneg($k); |
|
551
|
0
|
|
|
|
|
0
|
return Math::Prime::Util::PP::lucas_sequence(@_); |
|
552
|
|
|
|
|
|
|
} |
|
553
|
|
|
|
|
|
|
sub lucasu { |
|
554
|
1
|
|
|
1
|
1
|
12
|
my($P, $Q, $k) = @_; |
|
555
|
1
|
|
|
|
|
4
|
my ($vp, $vq) = ($P, $Q); |
|
556
|
1
|
|
|
|
|
6
|
_validate_integer($vp); |
|
557
|
1
|
|
|
|
|
3
|
_validate_integer($vq); |
|
558
|
1
|
|
|
|
|
4
|
_validate_integer_nonneg($k); |
|
559
|
1
|
|
|
|
|
40
|
return Math::Prime::Util::PP::lucasu($P,$Q,$k); |
|
560
|
|
|
|
|
|
|
} |
|
561
|
|
|
|
|
|
|
sub lucasv { |
|
562
|
1
|
|
|
1
|
1
|
4
|
my($P, $Q, $k) = @_; |
|
563
|
1
|
|
|
|
|
4
|
my ($vp, $vq) = ($P, $Q); |
|
564
|
1
|
|
|
|
|
6
|
_validate_integer($vp); |
|
565
|
1
|
|
|
|
|
4
|
_validate_integer($vq); |
|
566
|
1
|
|
|
|
|
5
|
_validate_integer_nonneg($k); |
|
567
|
1
|
|
|
|
|
21
|
return Math::Prime::Util::PP::lucasv($P,$Q,$k); |
|
568
|
|
|
|
|
|
|
} |
|
569
|
|
|
|
|
|
|
sub lucasuv { |
|
570
|
0
|
|
|
0
|
1
|
0
|
my($P, $Q, $k) = @_; |
|
571
|
0
|
|
|
|
|
0
|
_validate_integer($P); |
|
572
|
0
|
|
|
|
|
0
|
_validate_integer($Q); |
|
573
|
0
|
|
|
|
|
0
|
_validate_integer_nonneg($k); |
|
574
|
0
|
|
|
|
|
0
|
return Math::Prime::Util::PP::lucasuv($P,$Q,$k); |
|
575
|
|
|
|
|
|
|
} |
|
576
|
|
|
|
|
|
|
|
|
577
|
|
|
|
|
|
|
sub kronecker { |
|
578
|
207
|
|
|
207
|
1
|
474
|
my($a, $b) = @_; |
|
579
|
207
|
|
|
|
|
493
|
my ($va, $vb) = ($a, $b); |
|
580
|
207
|
|
|
|
|
605
|
_validate_integer($va); |
|
581
|
207
|
|
|
|
|
486
|
_validate_integer($vb); |
|
582
|
207
|
|
|
|
|
765
|
return Math::Prime::Util::PP::kronecker(@_); |
|
583
|
|
|
|
|
|
|
} |
|
584
|
|
|
|
|
|
|
|
|
585
|
|
|
|
|
|
|
sub factorial { |
|
586
|
36
|
|
|
36
|
1
|
102
|
my($n) = @_; |
|
587
|
36
|
|
|
|
|
148
|
_validate_integer_nonneg($n); |
|
588
|
36
|
|
|
|
|
175
|
return Math::Prime::Util::PP::factorial($n); |
|
589
|
|
|
|
|
|
|
} |
|
590
|
|
|
|
|
|
|
|
|
591
|
|
|
|
|
|
|
sub stirling { |
|
592
|
23
|
|
|
23
|
1
|
66
|
my($n, $k, $type) = @_; |
|
593
|
23
|
|
|
|
|
86
|
_validate_integer_nonneg($n); |
|
594
|
23
|
|
|
|
|
80
|
_validate_integer_nonneg($k); |
|
595
|
23
|
50
|
|
|
|
128
|
_validate_integer_nonneg($type) if defined $type; |
|
596
|
23
|
|
|
|
|
116
|
return Math::Prime::Util::PP::stirling($n, $k, $type); |
|
597
|
|
|
|
|
|
|
} |
|
598
|
|
|
|
|
|
|
|
|
599
|
|
|
|
|
|
|
sub gcd { |
|
600
|
1395
|
|
|
1395
|
1
|
29241
|
my(@v) = @_; |
|
601
|
1395
|
|
|
|
|
8520
|
_validate_integer($_) for @v; |
|
602
|
1395
|
|
|
|
|
5073
|
return Math::Prime::Util::PP::gcd(@v); |
|
603
|
|
|
|
|
|
|
} |
|
604
|
|
|
|
|
|
|
sub vecsum { |
|
605
|
717
|
|
|
717
|
1
|
6014
|
my(@v) = @_; |
|
606
|
717
|
|
|
|
|
2737
|
_validate_integer($_) for @v; |
|
607
|
717
|
|
|
|
|
2568
|
return Math::Prime::Util::PP::vecsum(@v); |
|
608
|
|
|
|
|
|
|
} |
|
609
|
|
|
|
|
|
|
sub vecprod { |
|
610
|
484
|
|
|
484
|
1
|
1151
|
my(@v) = @_; |
|
611
|
484
|
|
|
|
|
1407
|
_validate_integer($_) for @v; |
|
612
|
484
|
|
|
|
|
1168
|
return Math::Prime::Util::PP::vecprod(@v); |
|
613
|
|
|
|
|
|
|
} |
|
614
|
|
|
|
|
|
|
sub vecmin { |
|
615
|
4
|
|
|
4
|
1
|
1527
|
my(@v) = @_; |
|
616
|
4
|
|
|
|
|
38
|
_validate_integer($_) for @v; |
|
617
|
4
|
|
|
|
|
65
|
return Math::Prime::Util::PP::vecmin(@v); |
|
618
|
|
|
|
|
|
|
} |
|
619
|
|
|
|
|
|
|
sub vecmax { |
|
620
|
94
|
|
|
94
|
1
|
407
|
my(@v) = @_; |
|
621
|
94
|
|
|
|
|
559
|
_validate_integer($_) for @v; |
|
622
|
94
|
|
|
|
|
467
|
return Math::Prime::Util::PP::vecmax(@v); |
|
623
|
|
|
|
|
|
|
} |
|
624
|
|
|
|
|
|
|
sub vecmex { |
|
625
|
1
|
|
|
1
|
1
|
785
|
my(@v) = @_; |
|
626
|
1
|
|
|
|
|
8
|
_validate_integer_nonneg($_) for @v; |
|
627
|
1
|
|
|
|
|
25
|
return Math::Prime::Util::PP::vecmex(@v); |
|
628
|
|
|
|
|
|
|
} |
|
629
|
|
|
|
|
|
|
sub vecpmex { |
|
630
|
1
|
|
|
1
|
1
|
6
|
my(@v) = @_; |
|
631
|
1
|
|
|
|
|
3
|
for (@v) { |
|
632
|
4
|
|
|
|
|
15
|
_validate_integer_nonneg($_); |
|
633
|
4
|
50
|
|
|
|
13
|
croak "parameter must be a positive integer (x > 0)" if $_ <= 0; |
|
634
|
|
|
|
|
|
|
} |
|
635
|
1
|
|
|
|
|
24
|
return Math::Prime::Util::PP::vecpmex(@v); |
|
636
|
|
|
|
|
|
|
} |
|
637
|
|
|
|
|
|
|
sub invmod { |
|
638
|
557
|
|
|
557
|
1
|
1315
|
my ($a, $n) = @_; |
|
639
|
557
|
|
|
|
|
1786
|
_validate_integer($a); |
|
640
|
557
|
|
|
|
|
1646
|
_validate_integer($n); |
|
641
|
557
|
|
|
|
|
2281
|
return Math::Prime::Util::PP::invmod($a,$n); |
|
642
|
|
|
|
|
|
|
} |
|
643
|
|
|
|
|
|
|
sub addmod { |
|
644
|
988
|
|
|
988
|
1
|
1790
|
my ($a, $b, $n) = @_; |
|
645
|
988
|
|
|
|
|
2093
|
_validate_integer($a); _validate_integer($b); _validate_integer($n); |
|
|
988
|
|
|
|
|
1963
|
|
|
|
988
|
|
|
|
|
1978
|
|
|
646
|
988
|
|
|
|
|
2249
|
return Math::Prime::Util::PP::addmod($a,$b, $n); |
|
647
|
|
|
|
|
|
|
} |
|
648
|
|
|
|
|
|
|
sub submod { |
|
649
|
615
|
|
|
615
|
1
|
1402
|
my ($a, $b, $n) = @_; |
|
650
|
615
|
|
|
|
|
1566
|
_validate_integer($a); _validate_integer($b); _validate_integer($n); |
|
|
615
|
|
|
|
|
1522
|
|
|
|
615
|
|
|
|
|
1359
|
|
|
651
|
615
|
|
|
|
|
1663
|
return Math::Prime::Util::PP::submod($a,$b, $n); |
|
652
|
|
|
|
|
|
|
} |
|
653
|
|
|
|
|
|
|
sub mulmod { |
|
654
|
4260
|
|
|
4260
|
1
|
27794
|
my ($a, $b, $n) = @_; |
|
655
|
4260
|
|
|
|
|
11556
|
_validate_integer($a); _validate_integer($b); _validate_integer($n); |
|
|
4260
|
|
|
|
|
9991
|
|
|
|
4260
|
|
|
|
|
10133
|
|
|
656
|
4260
|
|
|
|
|
22107
|
return Math::Prime::Util::PP::mulmod($a,$b, $n); |
|
657
|
|
|
|
|
|
|
} |
|
658
|
|
|
|
|
|
|
sub divmod { |
|
659
|
197
|
|
|
197
|
1
|
1655
|
my ($a, $b, $n) = @_; |
|
660
|
197
|
|
|
|
|
600
|
_validate_integer($a); _validate_integer($b); _validate_integer($n); |
|
|
197
|
|
|
|
|
541
|
|
|
|
197
|
|
|
|
|
536
|
|
|
661
|
197
|
|
|
|
|
706
|
return Math::Prime::Util::PP::divmod($a,$b, $n); |
|
662
|
|
|
|
|
|
|
} |
|
663
|
|
|
|
|
|
|
sub powmod { |
|
664
|
654
|
|
|
654
|
1
|
1627
|
my ($a, $b, $n) = @_; |
|
665
|
654
|
|
|
|
|
3768
|
_validate_integer($a); _validate_integer($b); _validate_integer($n); |
|
|
654
|
|
|
|
|
1734
|
|
|
|
654
|
|
|
|
|
1838
|
|
|
666
|
654
|
|
|
|
|
2192
|
return Math::Prime::Util::PP::powmod($a,$b, $n); |
|
667
|
|
|
|
|
|
|
} |
|
668
|
|
|
|
|
|
|
sub muladdmod { |
|
669
|
2320
|
|
|
2320
|
1
|
5378
|
my ($a, $b, $c, $n) = @_; |
|
670
|
2320
|
|
|
|
|
7023
|
_validate_integer($a); _validate_integer($b); _validate_integer($c); _validate_integer($n); |
|
|
2320
|
|
|
|
|
5628
|
|
|
|
2320
|
|
|
|
|
6276
|
|
|
|
2320
|
|
|
|
|
6689
|
|
|
671
|
2320
|
|
|
|
|
7086
|
return Math::Prime::Util::PP::muladdmod($a,$b,$c, $n); |
|
672
|
|
|
|
|
|
|
} |
|
673
|
|
|
|
|
|
|
sub mulsubmod { |
|
674
|
1402
|
|
|
1402
|
1
|
2977
|
my ($a, $b, $c, $n) = @_; |
|
675
|
1402
|
|
|
|
|
3806
|
_validate_integer($a); _validate_integer($b); _validate_integer($c); _validate_integer($n); |
|
|
1402
|
|
|
|
|
3347
|
|
|
|
1402
|
|
|
|
|
3091
|
|
|
|
1402
|
|
|
|
|
2908
|
|
|
676
|
1402
|
|
|
|
|
3387
|
return Math::Prime::Util::PP::mulsubmod($a,$b,$c, $n); |
|
677
|
|
|
|
|
|
|
} |
|
678
|
|
|
|
|
|
|
|
|
679
|
|
|
|
|
|
|
|
|
680
|
|
|
|
|
|
|
sub Pi { |
|
681
|
1
|
|
|
1
|
1
|
1132
|
my($digits) = @_; |
|
682
|
1
|
50
|
|
|
|
10
|
_validate_integer_nonneg($digits) if defined $digits; |
|
683
|
1
|
|
|
|
|
25
|
return Math::Prime::Util::PP::Pi($digits); |
|
684
|
|
|
|
|
|
|
} |
|
685
|
|
|
|
|
|
|
|
|
686
|
|
|
|
|
|
|
############################################################################# |
|
687
|
|
|
|
|
|
|
|
|
688
|
|
|
|
|
|
|
my $_exitloop = 0; |
|
689
|
1
|
|
|
1
|
1
|
4
|
sub lastfor { $_exitloop = 1; } |
|
690
|
3426
|
|
|
3426
|
|
10478
|
sub _get_forexit { $_exitloop; } |
|
691
|
912
|
|
|
912
|
|
1568
|
sub _start_for_loop { my $old = $_exitloop; $_exitloop = 0; $old; } |
|
|
912
|
|
|
|
|
1618
|
|
|
|
912
|
|
|
|
|
1966
|
|
|
692
|
912
|
|
|
912
|
|
2862
|
sub _end_for_loop { $_exitloop = shift; } |
|
693
|
|
|
|
|
|
|
|
|
694
|
1
|
|
|
1
|
|
10
|
no warnings 'prototype'; |
|
|
1
|
|
|
|
|
2
|
|
|
|
1
|
|
|
|
|
1002
|
|
|
695
|
|
|
|
|
|
|
sub forprimes (&$;$) { ## no critic qw(ProhibitSubroutinePrototypes) |
|
696
|
876
|
|
|
876
|
1
|
2937
|
Math::Prime::Util::PP::forprimes(@_); |
|
697
|
|
|
|
|
|
|
} |
|
698
|
|
|
|
|
|
|
sub forcomposites(&$;$) { ## no critic qw(ProhibitSubroutinePrototypes) |
|
699
|
1
|
|
|
1
|
1
|
1046
|
Math::Prime::Util::PP::forcomposites(@_); |
|
700
|
|
|
|
|
|
|
} |
|
701
|
|
|
|
|
|
|
sub foroddcomposites(&$;$) { ## no critic qw(ProhibitSubroutinePrototypes) |
|
702
|
1
|
|
|
1
|
1
|
1100
|
Math::Prime::Util::PP::foroddcomposites(@_); |
|
703
|
|
|
|
|
|
|
} |
|
704
|
|
|
|
|
|
|
sub forsemiprimes(&$;$) { ## no critic qw(ProhibitSubroutinePrototypes) |
|
705
|
2
|
|
|
2
|
1
|
1072
|
Math::Prime::Util::PP::forsemiprimes(@_); |
|
706
|
|
|
|
|
|
|
} |
|
707
|
|
|
|
|
|
|
sub foralmostprimes(&$$;$) { ## no critic qw(ProhibitSubroutinePrototypes) |
|
708
|
0
|
|
|
0
|
1
|
0
|
Math::Prime::Util::PP::foralmostprimes(@_); |
|
709
|
|
|
|
|
|
|
} |
|
710
|
|
|
|
|
|
|
sub forfactored(&$;$) { ## no critic qw(ProhibitSubroutinePrototypes) |
|
711
|
1
|
|
|
1
|
1
|
1271
|
Math::Prime::Util::PP::forfactored(@_); |
|
712
|
|
|
|
|
|
|
} |
|
713
|
|
|
|
|
|
|
sub forsquarefree(&$;$) { ## no critic qw(ProhibitSubroutinePrototypes) |
|
714
|
8
|
|
|
8
|
1
|
30
|
Math::Prime::Util::PP::forsquarefree(@_); |
|
715
|
|
|
|
|
|
|
} |
|
716
|
|
|
|
|
|
|
sub forsquarefreeint(&$;$) { ## no critic qw(ProhibitSubroutinePrototypes) |
|
717
|
1
|
|
|
1
|
1
|
4
|
Math::Prime::Util::PP::forsquarefreeint(@_); |
|
718
|
|
|
|
|
|
|
} |
|
719
|
|
|
|
|
|
|
sub fordivisors (&$) { ## no critic qw(ProhibitSubroutinePrototypes) |
|
720
|
16
|
|
|
16
|
1
|
1322
|
Math::Prime::Util::PP::fordivisors(@_); |
|
721
|
|
|
|
|
|
|
} |
|
722
|
|
|
|
|
|
|
sub forpart (&$;$) { ## no critic qw(ProhibitSubroutinePrototypes) |
|
723
|
1
|
|
|
1
|
1
|
2829
|
Math::Prime::Util::PP::forpart(@_); |
|
724
|
|
|
|
|
|
|
} |
|
725
|
|
|
|
|
|
|
sub forcomp (&$;$) { ## no critic qw(ProhibitSubroutinePrototypes) |
|
726
|
1
|
|
|
1
|
1
|
2953
|
Math::Prime::Util::PP::forcomp(@_); |
|
727
|
|
|
|
|
|
|
} |
|
728
|
|
|
|
|
|
|
sub forcomb (&$;$) { ## no critic qw(ProhibitSubroutinePrototypes) |
|
729
|
1
|
|
|
1
|
1
|
4832
|
Math::Prime::Util::PP::forcomb(@_); |
|
730
|
|
|
|
|
|
|
} |
|
731
|
|
|
|
|
|
|
sub forperm (&$;$) { ## no critic qw(ProhibitSubroutinePrototypes) |
|
732
|
1
|
|
|
1
|
1
|
1817
|
Math::Prime::Util::PP::forperm(@_); |
|
733
|
|
|
|
|
|
|
} |
|
734
|
|
|
|
|
|
|
sub forderange (&$;$) { ## no critic qw(ProhibitSubroutinePrototypes) |
|
735
|
1
|
|
|
1
|
1
|
1785
|
Math::Prime::Util::PP::forderange(@_); |
|
736
|
|
|
|
|
|
|
} |
|
737
|
|
|
|
|
|
|
|
|
738
|
|
|
|
|
|
|
sub forsetproduct (&@) { ## no critic qw(ProhibitSubroutinePrototypes) |
|
739
|
1
|
|
|
1
|
1
|
2567
|
my($sub, @v) = @_; |
|
740
|
1
|
50
|
50
|
|
|
9
|
croak 'Not a subroutine reference' unless (ref($sub) || '') eq 'CODE'; |
|
741
|
1
|
50
|
50
|
|
|
5
|
croak 'Not an array reference' if grep {(ref($_) || '') ne 'ARRAY'} @v; |
|
|
2
|
|
|
|
|
13
|
|
|
742
|
|
|
|
|
|
|
# Exit if no arrays or any are empty. |
|
743
|
1
|
50
|
33
|
|
|
42
|
return if scalar(@v) == 0 || grep { !@$_ } @v; |
|
|
2
|
|
|
|
|
11
|
|
|
744
|
|
|
|
|
|
|
|
|
745
|
1
|
|
|
|
|
5
|
my @outv = map { $v[$_]->[0] } 0 .. $#v; |
|
|
2
|
|
|
|
|
20
|
|
|
746
|
1
|
|
|
|
|
7
|
my @cnt = (0) x @v; |
|
747
|
|
|
|
|
|
|
|
|
748
|
1
|
|
|
|
|
6
|
my $oldforexit = _start_for_loop(); |
|
749
|
1
|
|
|
|
|
4
|
my $i = 0; |
|
750
|
1
|
|
|
|
|
24
|
while ($i >= 0) { |
|
751
|
6
|
|
|
|
|
31
|
$sub->(@outv); |
|
752
|
6
|
50
|
|
|
|
37
|
last if $_exitloop; |
|
753
|
6
|
|
|
|
|
30
|
for ($i = $#v; $i >= 0; $i--) { |
|
754
|
8
|
100
|
|
|
|
12
|
if ($cnt[$i] >= $#{$v[$i]}) { $cnt[$i] = 0; $outv[$i] = $v[$i]->[0]; } |
|
|
8
|
|
|
|
|
21
|
|
|
|
3
|
|
|
|
|
7
|
|
|
|
3
|
|
|
|
|
14
|
|
|
755
|
5
|
|
|
|
|
17
|
else { $outv[$i] = $v[$i]->[++$cnt[$i]]; last; } |
|
|
5
|
|
|
|
|
13
|
|
|
756
|
|
|
|
|
|
|
} |
|
757
|
|
|
|
|
|
|
} |
|
758
|
1
|
|
|
|
|
5
|
_end_for_loop($oldforexit); |
|
759
|
|
|
|
|
|
|
} |
|
760
|
|
|
|
|
|
|
|
|
761
|
|
|
|
|
|
|
sub vecreduce (&@) { ## no critic qw(ProhibitSubroutinePrototypes) |
|
762
|
1
|
|
|
1
|
1
|
5
|
my($sub, @v) = @_; |
|
763
|
|
|
|
|
|
|
|
|
764
|
|
|
|
|
|
|
# Mastering Perl page 162, works with old Perl |
|
765
|
1
|
|
|
|
|
5
|
my $caller = caller(); |
|
766
|
1
|
|
|
1
|
|
9
|
no strict 'refs'; ## no critic(strict) |
|
|
1
|
|
|
|
|
3
|
|
|
|
1
|
|
|
|
|
233
|
|
|
767
|
1
|
|
|
|
|
4
|
local(*{$caller.'::a'}) = \my $a; |
|
|
1
|
|
|
|
|
8
|
|
|
768
|
1
|
|
|
|
|
3
|
local(*{$caller.'::b'}) = \my $b; |
|
|
1
|
|
|
|
|
4
|
|
|
769
|
1
|
|
|
|
|
4
|
$a = shift @v; |
|
770
|
1
|
|
|
|
|
4
|
for my $v (@v) { |
|
771
|
3
|
|
|
|
|
42
|
$b = $v; |
|
772
|
3
|
|
|
|
|
9
|
$a = $sub->(); |
|
773
|
|
|
|
|
|
|
} |
|
774
|
1
|
|
|
|
|
11
|
$a; |
|
775
|
|
|
|
|
|
|
} |
|
776
|
|
|
|
|
|
|
sub vecslide (&@) { ## no critic qw(ProhibitSubroutinePrototypes) |
|
777
|
1
|
|
|
1
|
1
|
5
|
my($sub, @v) = @_; |
|
778
|
|
|
|
|
|
|
|
|
779
|
1
|
|
|
|
|
23
|
my $caller = caller(); |
|
780
|
1
|
|
|
1
|
|
5
|
no strict 'refs'; ## no critic(strict) |
|
|
1
|
|
|
|
|
2
|
|
|
|
1
|
|
|
|
|
945
|
|
|
781
|
1
|
|
|
|
|
4
|
local(*{$caller.'::a'}) = \my $a; |
|
|
1
|
|
|
|
|
8
|
|
|
782
|
1
|
|
|
|
|
3
|
local(*{$caller.'::b'}) = \my $b; |
|
|
1
|
|
|
|
|
4
|
|
|
783
|
1
|
|
|
|
|
4
|
return map { $a = $v[$_-1]; $b = $v[$_]; $sub->(); } 1..$#v; |
|
|
4
|
|
|
|
|
16
|
|
|
|
4
|
|
|
|
|
6
|
|
|
|
4
|
|
|
|
|
11
|
|
|
784
|
|
|
|
|
|
|
} |
|
785
|
|
|
|
|
|
|
|
|
786
|
|
|
|
|
|
|
sub vecany (&@) { ## no critic qw(ProhibitSubroutinePrototypes) |
|
787
|
56
|
|
|
56
|
1
|
112
|
my $sub = shift; |
|
788
|
56
|
|
100
|
|
|
168
|
$sub->() and return 1 foreach @_; |
|
789
|
6
|
|
|
|
|
71
|
0; |
|
790
|
|
|
|
|
|
|
} |
|
791
|
|
|
|
|
|
|
sub vecall (&@) { ## no critic qw(ProhibitSubroutinePrototypes) |
|
792
|
67
|
|
|
67
|
1
|
101
|
my $sub = shift; |
|
793
|
67
|
|
100
|
|
|
157
|
$sub->() or return 0 foreach @_; |
|
794
|
6
|
|
|
|
|
26
|
1; |
|
795
|
|
|
|
|
|
|
} |
|
796
|
|
|
|
|
|
|
sub vecnone (&@) { ## no critic qw(ProhibitSubroutinePrototypes) |
|
797
|
11
|
|
|
11
|
1
|
212
|
my $sub = shift; |
|
798
|
11
|
|
50
|
|
|
69
|
$sub->() and return 0 foreach @_; |
|
799
|
11
|
|
|
|
|
126
|
1; |
|
800
|
|
|
|
|
|
|
} |
|
801
|
|
|
|
|
|
|
sub vecnotall (&@) { ## no critic qw(ProhibitSubroutinePrototypes) |
|
802
|
1
|
|
|
1
|
1
|
4
|
my $sub = shift; |
|
803
|
1
|
|
100
|
|
|
5
|
$sub->() or return 1 foreach @_; |
|
804
|
0
|
|
|
|
|
0
|
undef; |
|
805
|
|
|
|
|
|
|
} |
|
806
|
|
|
|
|
|
|
|
|
807
|
|
|
|
|
|
|
sub vecfirst (&@) { ## no critic qw(ProhibitSubroutinePrototypes) |
|
808
|
1
|
|
|
1
|
1
|
821
|
my $sub = shift; |
|
809
|
1
|
|
100
|
|
|
7
|
$sub->() and return $_ foreach @_; |
|
810
|
0
|
|
|
|
|
0
|
undef; |
|
811
|
|
|
|
|
|
|
} |
|
812
|
|
|
|
|
|
|
|
|
813
|
|
|
|
|
|
|
sub vecfirstidx (&@) { ## no critic qw(ProhibitSubroutinePrototypes) |
|
814
|
1
|
|
|
1
|
1
|
5
|
my $sub = shift; |
|
815
|
1
|
|
|
|
|
3
|
my $i = 0; |
|
816
|
1
|
|
66
|
|
|
9
|
++$i and $sub->() and return $i-1 foreach @_; |
|
|
|
|
100
|
|
|
|
|
|
817
|
0
|
|
|
|
|
0
|
-1; |
|
818
|
|
|
|
|
|
|
} |
|
819
|
|
|
|
|
|
|
|
|
820
|
|
|
|
|
|
|
sub vecextract { |
|
821
|
1
|
|
|
1
|
1
|
7
|
my($aref, $mask) = @_; |
|
822
|
1
|
50
|
|
|
|
7
|
croak "vecextract first argument must be an array reference" |
|
823
|
|
|
|
|
|
|
unless ref($aref) eq 'ARRAY'; |
|
824
|
1
|
|
|
|
|
6
|
return Math::Prime::Util::PP::vecextract(@_); |
|
825
|
|
|
|
|
|
|
} |
|
826
|
|
|
|
|
|
|
|
|
827
|
|
|
|
|
|
|
sub vecsample ($@) { ## no critic qw(ProhibitSubroutinePrototypes) |
|
828
|
1
|
|
|
1
|
1
|
3151
|
_validate_integer_nonneg($_[0]); |
|
829
|
1
|
|
|
|
|
7
|
Math::Prime::Util::PP::vecsample(@_); |
|
830
|
|
|
|
|
|
|
} |
|
831
|
|
|
|
|
|
|
|
|
832
|
|
|
|
|
|
|
1; |
|
833
|
|
|
|
|
|
|
|
|
834
|
|
|
|
|
|
|
__END__ |