File Coverage

blib/lib/Math/Prime/Util/PPFE.pm
Criterion Covered Total %
statement 287 322 89.1
branch 28 64 43.7
condition 21 37 56.7
subroutine 78 89 87.6
pod 69 69 100.0
total 483 581 83.1


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__