in reply to Can't call method "forprimes"

Hello pvfki,

Your script has a number of problems:

I think the following code is what you’re looking for:

use warnings; use strict; use ntheory 'forprimes'; use bigint; my $n = 12; my $c = 1; my $k = 10; my $l = 10; my $p = 100; my @candidates = (0 .. $l); my $remove; sieve2(); sub sieve2 { forprimes { for my $i (0 .. $l) { if (($n * ($k + $i) + $c) % $_ == 0) { $remove = $i; @candidates = grep { $_ != $remove } @candidates; } } } $p; print join("\n", @candidates),"\n"; }

Output:

16:58 >perl 2012_SoPW.pl 3 5 6 9 10 16:58 >

Hope that helps,

Athanasius <°(((><contra mundum Iustus alius egestas vitae, eros Piratica,

Replies are listed 'Best First'.
Re^2: Can't call method "forprimes"
by holli (Abbot) on Jul 15, 2019 at 08:14 UTC
    It took me a solid 10 Minutes to parse the logic of that inner block. In german we have an expression for that: Von hinten durch die Brust ins Auge. Consider the following code, I think it makes the intention much clearer and it doesn't use globals.
    use Modern::Perl; use Sub::Signatures; use ntheory 'primes'; use bigint; print join "*", sieve3( 12, 1, 10, 10, 100 ); sub sieve3 ( $n, $c, $k, $l, $p ) { my %candidates = map { $_ => $n * ( $k + $_ ) + $c } ( 0 .. $l ); foreach my $prime ( @{primes $p} ) { foreach my $candidate ( keys %candidates ) { delete $candidates{$candidate} if defined $candidates{$candidate} && $candidates{$can +didate} % $prime == 0; } } return sort { $a <=> $b } keys %candidates; }


    holli

    You can lead your users to water, but alas, you cannot drown them.