From 46a3ee723d4dbd4e22cf2e9400e5ce9ea9186b0a Mon Sep 17 00:00:00 2001 From: trizen Date: Sat, 21 Aug 2021 02:13:24 +0300 Subject: [PATCH] - Added the Number `k.powerfree_part(n)` method. Returns the k-powerfree part of `n`: say 30.of { 2.powerfree_part(_) } # squarefree part (OEIS: A007913) say 30.of { 3.powerfree_part(_) } # cubefree part (OEIS: A050985) --- lib/Sidef/Types/Number/Number.pm | 24 ++++++++++++++++++++---- lib/Sidef/Types/Number/Number.pod | 11 +++++++++++ 2 files changed, 31 insertions(+), 4 deletions(-) diff --git a/lib/Sidef/Types/Number/Number.pm b/lib/Sidef/Types/Number/Number.pm index 9c427be8..92923bf5 100644 --- a/lib/Sidef/Types/Number/Number.pm +++ b/lib/Sidef/Types/Number/Number.pm @@ -14170,20 +14170,36 @@ package Sidef::Types::Number::Number { _set_int($r); } - sub core { # A007913 + sub powerfree_part { + my ($k, $n) = @_; # Multiplicative with: - # a(p^k) = p^(k mod 2) + # a(p^e, k) = p^(e mod k) - my $n = &_big2uistr // goto &nan; + _valid(\$n); + + $k = _any2ui($$k) // goto &nan; + $n = _big2uistr($n) // goto &nan; + + $k <= 0 and goto &nan; my @factor_exp = _factor_exp($n); @factor_exp and $factor_exp[0][0] eq '0' and return ZERO; - my $r = Math::Prime::Util::GMP::vecprod(map { $_->[0] } grep { $_->[1] % 2 } @factor_exp); + my $r = Math::Prime::Util::GMP::vecprod( + map { + ($_->[1] == 1) + ? $_->[0] + : Math::Prime::Util::GMP::powint($_->[0], $_->[1]) + } grep { $_->[1] } map { [$_->[0], $_->[1] % $k] } @factor_exp + ); _set_int($r); } + sub core { # A007913 + (TWO)->powerfree_part($_[0]); + } + sub arithmetic_derivative { my ($x) = @_; diff --git a/lib/Sidef/Types/Number/Number.pod b/lib/Sidef/Types/Number/Number.pod index 894d7048..a9bb069a 100644 --- a/lib/Sidef/Types/Number/Number.pod +++ b/lib/Sidef/Types/Number/Number.pod @@ -5202,6 +5202,17 @@ It efficiently counts the number of k-powerfree numbers <= n, or in the range C< =cut +=head2 powerfree_part + + k.powerfree_part(n) + +Returns the k-powerfree part of C. + + say 30.of { 2.powerfree_part(_) } # squarefree part (OEIS: A007913) + say 30.of { 3.powerfree_part(_) } # cubefree part (OEIS: A050985) + +=cut + =head2 powerfree_sum k.powerfree_sum(n)