Skip to content

Commit

Permalink
- Added the Number k.squarefree_almost_primes_each(a, b, { ... }) m…
Browse files Browse the repository at this point in the history
…ethod.

Iterates over the squarefree k-almost primes in the range a..b.

Example:

	# Iterate over squarefree 3-almost primes <= 100
	3.squarefree_almost_primes_each(100, { .say })

	# Iterate over squarefree 3-almost primes in the range 50..100
	3.squarefree_almost_primes_each(50, 100, { . say })
  • Loading branch information
trizen committed Mar 7, 2021
1 parent 3ff722f commit 0a48608
Show file tree
Hide file tree
Showing 3 changed files with 48 additions and 3 deletions.
29 changes: 28 additions & 1 deletion lib/Sidef/Types/Number/Number.pm
Original file line number Diff line number Diff line change
Expand Up @@ -15527,7 +15527,7 @@ package Sidef::Types::Number::Number {
my $x = Math::GMPz::Rmpz_init();

if ($squarefree) {
Math::GMPz::Rmpz_set_str(Math::Prime::Util::GMP::pn_primorial($k), 10);
Math::GMPz::Rmpz_set_str($t, Math::Prime::Util::GMP::pn_primorial($k), 10);
}
else {
Math::GMPz::Rmpz_setbit($t, $k); # t = ipow(2, k)
Expand Down Expand Up @@ -15700,6 +15700,33 @@ package Sidef::Types::Number::Number {
Sidef::Types::Array::Array->new(\@squarefree_almost_primes);
}

sub squarefree_almost_primes_each {
my ($k, $from, $to, $block) = @_;

_valid(\$from);

if (defined($block)) {
_valid(\$to);
$from = _any2mpz($$from) // return ZERO;
$to = _any2mpz($$to) // return ZERO;
}
else {
$block = $to;
$to = _any2mpz($$from) // return ZERO;
$from = $ONE;
}

$k = _any2ui($$k) // return ZERO;

if (Math::GMPz::Rmpz_sgn($from) <= 0) {
$from = $ONE;
}

_generic_each($from, $to, $block, sub { 1e7 }, sub { _sieve_almost_primes($_[0], $_[1], $k, squarefree => 1) });
}

*each_squarefree_almost_prime = \&squarefree_almost_primes_each;

sub semiprimes {
my ($from, $to) = @_;

Expand Down
10 changes: 10 additions & 0 deletions lib/Sidef/Types/Number/Number.pod
Original file line number Diff line number Diff line change
Expand Up @@ -1692,6 +1692,16 @@ Aliases: I<squarefree_each>

=cut

=head2 each_squarefree_almost_prime

Number.each_squarefree_almost_prime() -> I<Obj>

Return the

Aliases: I<squarefree_almost_primes_each>

=cut

=head2 ecm_factor

Number.ecm_factor() -> I<Obj>
Expand Down
12 changes: 10 additions & 2 deletions scripts/Tests/number_methods.sf
Original file line number Diff line number Diff line change
Expand Up @@ -118,27 +118,35 @@ assert_eq(squarefree_count(1e10), 6079270942)
for k in (0..10) {

assert_eq(k.almost_primes(1000), 1..1000 -> grep { .is_almost_prime(k) })
assert_eq(gather { k.almost_primes_each(1000, { take(_) }) }, k.almost_primes(1000))
assert_eq(k.squarefree_almost_primes(1000), k.almost_primes(1, 1000).grep{.is_squarefree})

assert_eq(gather { k.almost_primes_each(1000, { take(_) }) }, k.almost_primes(1000))
assert_eq(gather { k.squarefree_almost_primes_each(1000, { take(_) }) }, k.squarefree_almost_primes(1000))

var from = 1000.irand
var upto = from+1000.irand

assert_eq(k.almost_primes(from, upto), from..upto -> grep { .is_almost_prime(k) })
assert_eq(gather { k.almost_primes_each(from, upto, { take(_) }) }, k.almost_primes(from, upto))
assert_eq(k.squarefree_almost_primes(from, upto), k.almost_primes(from, upto).grep{.is_squarefree})

assert_eq(gather { k.almost_primes_each(from, upto, { take(_) }) }, k.almost_primes(from, upto))
assert_eq(gather { k.squarefree_almost_primes_each(from, upto, { take(_) }) }, k.squarefree_almost_primes(from, upto))
}

if (Number.HAS_PRIME_UTIL) {
with (2**65) {|n|

assert_eq(1.almost_primes(n, n+100), range(n, n+100).grep{.is_prime})
assert_eq(1.squarefree_almost_primes(n, n+100), range(n, n+100).grep{.is_prime})

assert_eq(gather { 1.almost_primes_each(n, n+100, { take(_) } ) }, range(n, n+100).grep{.is_almost_prime(1)})
assert_eq(gather { 1.squarefree_almost_primes_each(n, n+100, { take(_) } ) }, range(n, n+100).primes)

assert_eq(2.almost_primes(n, n+100), range(n, n+100).grep{.is_semiprime})
assert_eq(2.squarefree_almost_primes(n, n+100), range(n, n+100).grep{.is_squarefree && .is_semiprime})

assert_eq(gather { 2.almost_primes_each(n, n+100, { take(_) } ) }, range(n, n+100).grep{.is_almost_prime(2)})
assert_eq(gather { 2.squarefree_almost_primes_each(n, n+100, { take(_) } ) }, range(n, n+100).grep{.is_squarefree && .is_almost_prime(2)})
}
}

Expand Down

0 comments on commit 0a48608

Please sign in to comment.