Skip to content

Commit

Permalink
- Added the Number n.pyramidal_root(k) method.
Browse files Browse the repository at this point in the history
Returns the k-gonal pyramidal root of `n`. Also defined for complex numbers.

Example:

	say pyramidal_root(pyramidal(1234, 3), 3)     #=> 1234
  • Loading branch information
trizen committed Dec 13, 2022
1 parent 30ab5cf commit 0396413
Show file tree
Hide file tree
Showing 7 changed files with 121 additions and 16 deletions.
2 changes: 1 addition & 1 deletion lib/Sidef/Parser.pm
Original file line number Diff line number Diff line change
Expand Up @@ -1048,7 +1048,7 @@ package Sidef::Parser {
}
}

# Embedded comments (http://perlcabal.org/syn/S02.html#Embedded_Comments)
# Embedded comments (https://docs.raku.org/language/syntax#Multi-line_/_embedded_comments)
if (/\G#`(?=[[:punct:]])/gc) {
$self->get_quoted_string(code => $opt{code});
redo;
Expand Down
37 changes: 31 additions & 6 deletions lib/Sidef/Types/Number/Number.pm
Original file line number Diff line number Diff line change
Expand Up @@ -27237,19 +27237,44 @@ package Sidef::Types::Number::Number {
#

sub polygonal_root {
my ($x, $y) = @_;
_valid(\$y);
bless \__polygonal_root__(_any2mpfr_mpc($$x), _any2mpfr_mpc($$y));
my ($n, $k) = @_;
_valid(\$k);
bless \__polygonal_root__(_any2mpfr_mpc($$n), _any2mpfr_mpc($$k));
}

#
## Second k-gonal root of `n`
#

sub polygonal_root2 {
my ($x, $y) = @_;
_valid(\$y);
bless \__polygonal_root__(_any2mpfr_mpc($$x), _any2mpfr_mpc($$y), 1);
my ($n, $k) = @_;
_valid(\$k);
bless \__polygonal_root__(_any2mpfr_mpc($$n), _any2mpfr_mpc($$k), 1);
}

sub pyramidal_root {
my ($n, $k) = @_;
_valid(\$k);

# cubic_formula(-(1/3 - k/6), 1/2, -(k/6 - 5/6), -n)

$n = $$n;
$k = $$k;

my $k_over_6 = __div__($k, 6);

my $A = __add__(__div__(-1, 3), $k_over_6);
my $B = __div__(1, 2);
my $C = __add__(__neg__($k_over_6), __div__(5, 6));
my $D = __neg__($n);

my $root = [(bless \$A)->cubic_formula((bless \$B), (bless \$C), (bless \$D))]->[1];

if (__is_real__($n) and __cmp__($n, 0) >= 0) {
$root = $root->real;
}

$root;
}

sub is_palindrome {
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 @@ -6625,6 +6625,16 @@ Returns the n-th k-gonal pyramidal number.

=cut

=head2 pyramidal_root

n.pyramidal_root(k)

Returns the k-gonal pyramidal root of C<n>. Also defined for complex numbers.

say pyramidal_root(pyramidal(1234, 3), 3) #=> 1234

=cut

=head2 qnr

qnr(n)
Expand Down
8 changes: 8 additions & 0 deletions scripts/Extended tests/is_almost_prime.sf
Original file line number Diff line number Diff line change
Expand Up @@ -104,6 +104,14 @@ assert_eq(A358865.map(3..21), %n[20, 140, 405, 2856, 25296, 111720, 25984, 54740

assert(6378421230653912273852177516895163581869770560831402039659052275307515868158149242183187027058743269083585164524698761215608346720446543721867890772992768450030990772124462439643369906993789153742999577997533023369718005328697704646795653340413290216914429581800198907520670422145782789421503445838438309411889963011879677086315079680346076913198656865252722018507700079241053301126985375100206013999932788906892043402372100794021347723757962214999239405763985925478958053765385390392428991093620063803159748213554713516270836566432768442321417273611613661964043740485967874546203158330542419346172965725208847889307596664965692982489236584360678086793885224312622009679624680125435713130901431548084498643988804235541146098681538248403808764459574030837406569943265425119945515620987942036623366002995111745100363660322741847883390914005559246543930659653872917345326198079665168962285351976979752322993704768006328130917743545206406358713737580633683126888580933576598622705103763505867769189580877823254445988109717369710491787515696906699326587144119103036177901022625401163297714167068028230540962534246165735639040001.is_almost_prime(2))

assert(1536502117117468999680.is_almost_prime(28))

assert(
%n[28, 16, 176, 4950, 8910, 1408, 346500, 277992, 7542080, 326656, 544320, 120400000, 145213440, 48549888, 4733575168, 536813568, 2149576704, 3057500160, 938539560960, 1358951178240, 36324805836800, 99956555776, 49212503949312, 118747221196800, 59461613912064, 13749193801728, 7526849672380416, 98516240758210560, 4969489493917696, 78673429816934400, 4467570822566903808, 1013309912383488000].map_kv{|k,v|
v.is_almost_prime(k+3)
}.all
)

assert_eq(
%n[1, 3, 9, 43, 46, 47, 245, 1697, 109, 565, 3938, 3255, 30089, 18951, 2217].map_kv{|n,k| is_almost_prime(k**(n+1) + 1, n+1) },
15.of(true)
Expand Down
7 changes: 7 additions & 0 deletions scripts/Extended tests/is_omega_prime.sf
Original file line number Diff line number Diff line change
Expand Up @@ -61,6 +61,13 @@ assert_eq(A358864.map(3..11), %n[84, 1785, 299880, 1020510, 8897460, 102612510,

assert(6378421230653912273852177516895163581869770560831402039659052275307515868158149242183187027058743269083585164524698761215608346720446543721867890772992768450030990772124462439643369906993789153742999577997533023369718005328697704646795653340413290216914429581800198907520670422145782789421503445838438309411889963011879677086315079680346076913198656865252722018507700079241053301126985375100206013999932788906892043402372100794021347723757962214999239405763985925478958053765385390392428991093620063803159748213554713516270836566432768442321417273611613661964043740485967874546203158330542419346172965725208847889307596664965692982489236584360678086793885224312622009679624680125435713130901431548084498643988804235541146098681538248403808764459574030837406569943265425119945515620987942036623366002995111745100363660322741847883390914005559246543930659653872917345326198079665168962285351976979752322993704768006328130917743545206406358713737580633683126888580933576598622705103763505867769189580877823254445988109717369710491787515696906699326587144119103036177901022625401163297714167068028230540962534246165735639040001.is_omega_prime(2))

assert(2383985537862979050.is_omega_prime(14))
assert(239213805711830629680.is_omega_prime(15))
assert(45573558879962759570353.is_omega_prime(12))
assert(15633689593760207970.is_omega_prime(14))
assert(3792821921183752657200.is_omega_prime(15))
assert(1536502117117468999680.is_almost_prime(9))

assert_eq(
[1, 3, 9, 43, 46, 47, 245, 1697, 109, 565, 3938, 3255, 30089, 18951, 2217].map_kv{|n,k| is_omega_prime(k**(n+1) + 1, n+1) },
15.of(true)
Expand Down
51 changes: 42 additions & 9 deletions scripts/Extended tests/number_methods.sf
Original file line number Diff line number Diff line change
Expand Up @@ -70,18 +70,16 @@ assert_eq(A358860.map(3..9), %n[56, 140, 4200, 331800, 611520, 8385930, 10718568
assert_eq(A358860(11), 78540000)
assert_eq(A358860(14), 22241349900)

assert_eq(
assert(
%n[56, 140, 4200, 331800, 611520, 8385930, 1071856800, 41086892000, 78540000, 38102655397426620, 59089382788800, 22241349900, 2326493030400, 7052419469195100, 886638404171520].map_kv {|k,v|
v.divisors.count {|d| d.is_pyramidal(k+3) } == (k+3)
},
15.of(true)
}.all
)

assert_eq(
assert(
%n[6, 36, 210, 4560, 6426, 326040, 4232250, 1969110, 296676380, 4798080, 166289760, 73765692000, 712750500, 50561280, 33944067893736, 2139168754800, 4292572951800, 1414764341760, 72461756727360, 180975331456920, 1870768457500800, 5498331930000, 153698278734000].map_kv{ |k,v|
v.divisors.count {|d| d.is_polygonal(k+3) } == (k+3)
},
23.of(true),
}.all
)

func A358861(n) {
Expand All @@ -95,11 +93,46 @@ func A358861(n) {

assert_eq(A358861.map(3..9), %n[64, 925, 2976, 93457, 866272, 11025, 3036880])

assert_eq(
assert(
%n[64, 925, 2976, 93457, 866272, 11025, 3036880, 18412718645101, 9283470627432, 201580440699781, 92839099743040, 5236660451226975, 66779973961058176].map_kv {|k,v|
v.divisors.count {|d| d.is_centered_polygonal(k+3) } == (k+3)
},
13.of(true)
}.all,
)

assert(
%n[316, 1625, 456, 3964051, 21568, 6561, 346528, 3588955448828761, 1684992, 210804461608463437, 36865024, 835904150390625, 2052407296].map_kv {|k,v|
v.is_centered_polygonal(k+3)
}.all,
)

assert(
%n[460, 99905, 463326, 808208947, 23089262218, 12442607161209225, 53780356630, 700326051644920151, 46634399568693102, 45573558879962759570353].map_kv{|k,v|
v.is_centered_polygonal(k+3)
}.all
)

assert(
%n[20, 140, 405, 2856, 25296, 111720, 25984, 5474000, 237600, 223826688, 3852800, 268565760, 1834725376, 175861400000, 335674368, 2863363937280, 4383831556096, 206015846400, 3400704000, 938209120583680, 2981338216980480, 21463949229465600, 45410367307776, 72056803765911552, 4803826408397209600, 1536502117117468999680, 10823784744326529024].map_kv{|k,v|
v.is_pyramidal(k+3)
}.all
)

assert(
%n[84, 1785, 299880, 1020510, 8897460, 102612510, 33367223274, 249417828660, 9177835927260, 10064864238489060, 5558913993302670, 15633689593760207970, 3792821921183752657200].map_kv{|k,v|
v.is_pyramidal(k+3)
}.all
)

assert(
%n[66, 44100, 11310, 103740, 3333330, 185040240, 15529888374, 626141842326, 21647593547580, 351877410344460, 82634328555218440, 2383985537862979050, 239213805711830629680].map_kv{|k,v|
v.is_polygonal(k+3)
}.all
)

assert(
%n[28, 16, 176, 4950, 8910, 1408, 346500, 277992, 7542080, 326656, 544320, 120400000, 145213440, 48549888, 4733575168, 536813568, 2149576704, 3057500160, 938539560960, 1358951178240, 36324805836800, 99956555776, 49212503949312, 118747221196800, 59461613912064, 13749193801728, 7526849672380416, 98516240758210560, 4969489493917696, 78673429816934400, 4467570822566903808, 1013309912383488000].map_kv{|k,v|
v.is_polygonal(k+3)
}.all
)

assert(256.is_centered_polygonal(8) -> not)
Expand Down
22 changes: 22 additions & 0 deletions scripts/Tests/arrays.sf
Original file line number Diff line number Diff line change
Expand Up @@ -114,4 +114,26 @@ assert_eq(
%n[0, 0, 0, 0, 0, 702, 0, 0, 0, 0, 0, -1],
)

assert([false].all -> not)
assert([false, false].all -> not)
assert([true].all)
assert([true, true].all)
assert([].all)
assert([true, false].all -> not)
assert([false, true].all -> not)

assert([true].any)
assert([true, false].any)
assert([false, true].any)
assert([false].any -> not)
assert([false, false].any -> not)
assert([].any -> not)

assert([false, true].none -> not)
assert([true, false].none -> not)
assert([true].none -> not)
assert([false].none)
assert([false, false].none)
assert([].none)

say "** Test passed!"

0 comments on commit 0396413

Please sign in to comment.