1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195
|
#!/usr/bin/env perl
use strict;
use warnings;
use Test::More;
use Math::Prime::Util qw/partitions forpart forcomp is_prime/;
my $extra = defined $ENV{EXTENDED_TESTING} && $ENV{EXTENDED_TESTING};
my @parts = qw/
1
1
2
3
5
7
11
15
22
30
42
56
77
101
135
176
231
297
385
490
627
792
1002
1255
1575
1958
2436
3010
3718
4565
5604
6842
8349
10143
12310
14883
17977
21637
26015
31185
37338
44583
53174
63261
75175
89134
105558
124754
147273
173525
204226
/;
my %bparts = (
101 => "214481126",
256 => "365749566870782",
501 => "2431070104309287327876",
1001 => "25032297938763929621013218349796",
2347 => "56751384003004060684283391440819878903446789803099",
4128 => "13036233928924552978434294180871407270098426394166677221003078079504",
#9988 => "31043825285346179203111322344702502691204288916782299617140664920755263693739998376431336412511604846065386",
#13337 => "4841449229081281114351180373774137636239639013054790559544724995314398354517477085116206336008004971541987422037760634642695",
#37373 => "885240148270777711759915557428752066370785294706979437063536090533501018735098279767013023483349639513395622225840616033227700794918506274833787569446519667398089943122156454986205555766363295867812094833219935",
);
if (!$extra) {
my @ns = grep { $_ > 300 } keys %bparts;
foreach my $n (@ns) { delete $bparts{$n} }
}
plan tests => scalar(@parts) + scalar(keys(%bparts)) + 20 + 6;
foreach my $n (0..$#parts) {
is( partitions($n), $parts[$n], "partitions($n)" );
}
while (my($n, $epart) = each (%bparts)) {
is( partitions($n), $epart, "partitions($n)" );
}
################### forpart
{ my @p=(); forpart { push @p, [@_] } 0;
is_deeply( [@p], [[]], "forpart 0" ); }
{ my @p=(); forpart { push @p, [@_] } 1;
is_deeply( [@p], [[1]], "forpart 1" ); }
{ my @p=(); forpart { push @p, [@_] } 2;
is_deeply( [@p], [[1,1],[2]], "forpart 2" ); }
{ my @p=(); forpart { push @p, [@_] } 3;
is_deeply( [@p], [[1,1,1],[1,2],[3]], "forpart 3" ); }
{ my @p=(); forpart { push @p, [@_] } 4;
is_deeply( [@p], [[1,1,1,1],[1,1,2],[1,3],[2,2],[4]], "forpart 4" ); }
{ my @p=(); forpart { push @p, [@_] } 6;
is_deeply( [@p], [[1,1,1,1,1,1],[1,1,1,1,2],[1,1,1,3],[1,1,2,2],[1,1,4],[1,2,3],[1,5],[2,2,2],[2,4],[3,3],[6]], "forpart 6" ); }
{ my @p=(); forpart { push @p, [@_] } 17,{n=>2};
is_deeply( [@p], [[1,16],[2,15],[3,14],[4,13],[5,12],[6,11],[7,10],[8,9]], "forpart 17 restricted n=[2,2]" ); }
{ my @p1 = (); my @p2 = ();
forpart { push @p1, [@_] if @_ <= 5 } 27;
forpart { push @p2, [@_] } 27, {nmax=>5};
is_deeply( [@p1], [@p2], "forpart 27 restricted nmax 5" ); }
{ my @p1 = (); my @p2 = ();
forpart { push @p1, [@_] if @_ >= 20 } 27;
forpart { push @p2, [@_] } 27, {nmin=>20};
is_deeply( [@p1], [@p2], "forpart 27 restricted nmin 20" ); }
{ my @p1 = (); my @p2 = ();
forpart { push @p1, [@_] if @_ >= 10 && @_ <= 13 } 19;
forpart { push @p2, [@_] } 19, {nmin=>10,nmax=>13};
is_deeply( [@p1], [@p2], "forpart 19 restricted n=[10..13]" ); }
{ my @p1 = (); my @p2 = ();
forpart { push @p1, [@_] unless scalar grep { $_ > 4 } @_ } 20;
forpart { push @p2, [@_] } 20, {amax=>4};
is_deeply( [@p1], [@p2], "forpart 20 restricted amax 4" ); }
{ my @p1 = (); my @p2 = ();
forpart { push @p1, [@_] unless scalar grep { $_ < 4 } @_ } 15;
forpart { push @p2, [@_] } 15, {amin=>4};
is_deeply( [@p1], [@p2], "forpart 15 restricted amin 4" ); }
{ my @p1 = (); my @p2 = ();
forpart { push @p1, [@_] unless scalar grep { $_ < 3 || $_ > 6 } @_ } 21;
forpart { push @p2, [@_] } 21, {amin=>3,amax=>6};
is_deeply( [@p1], [@p2], "forpart 21 restricted a=[3..6]" ); }
#{ my @p1 = (); my @p2 = ();
# forpart { push @p1, [@_] unless @_ != 4 || scalar grep { $_ < 2 || $_ > 8 } @_ } 22;
# forpart { push @p2, [@_] } 22, {amin=>2,amax=>8,n=>4};
# is_deeply( [@p1], [@p2], "forpart 22 restricted n=4 and a=[3..6]" ); }
{ my @p=(); forpart { push @p, [@_] } 22, {amin=>2,amax=>8,n=>4};
is_deeply( [@p], [[2,4,8,8],[2,5,7,8],[2,6,6,8],[2,6,7,7],[3,3,8,8],[3,4,7,8],[3,5,6,8],[3,5,7,7],[3,6,6,7],[4,4,6,8],[4,4,7,7],[4,5,5,8],[4,5,6,7],[4,6,6,6],[5,5,5,7],[5,5,6,6]], "forpart 22 restricted n=4 and a=[3..6]" ); }
{ my @p = ();
forpart { push @p, [@_] unless scalar grep {!is_prime($_)} @_ } 20,{amin=>3};
is_deeply( [@p], [[3,3,3,3,3,5],[3,3,3,11],[3,3,7,7],[3,5,5,7],[3,17],[5,5,5,5],[7,13]], "forpart 20 restricted to odd primes" );
}
{ my @p=(); forpart { push @p, [@_] } 21, {amax=>0};
is_deeply( [@p], [], "forpart 21 restricted amax 0" );
}
{ my $c = 0;
forpart { $c++ } 2*89+1,{n=>3,amin=>3,prime=>1};
is($c, 86, "A007963(89) = number of odd-prime 3-tuples summing to 2*89+1 = 86");
}
{ my $c = 0;
forpart { $c++ } 23,{n=>4,amin=>2};
is($c, 54, "23 partitioned into 4 with mininum 2 => 54");
}
{ my $c = 0;
forpart { $c++ } 23,{n=>4,amin=>2,prime=>1};
is($c, 5, "23 partitioned into 4 with mininum 2 and prime => 5");
}
{ my $c = 0;
forpart { $c++ } 23,{n=>4,amin=>2,prime=>0};
is($c, 1, "23 partitioned into 4 with mininum 2 and composite => 1");
}
################### forcomp
{ my @p=(); forcomp { push @p, [@_] } 0;
is_deeply( [@p], [[]], "forcomp 0" ); }
{ my @p=(); forcomp { push @p, [@_] } 1;
is_deeply( [@p], [[1]], "forcomp 1" ); }
{ my @p=(); forcomp { push @p, [@_] } 2;
is_deeply( [@p], [[1,1],[2]], "forcomp 2" ); }
{ my @p=(); forcomp { push @p, [@_] } 3;
is_deeply( [@p], [[1,1,1],[1,2],[2,1],[3]], "forcomp 3" ); }
{ my @p=(); forcomp { push @p, [@_] } 5,{n=>3};
is_deeply( [@p], [[1,1,3],[1,2,2],[1,3,1],[2,1,2],[2,2,1],[3,1,1]], "forcomp 5 restricted n=3" ); }
{ my @p=(); forcomp { push @p, [@_] } 12,{n=>3,amin=>3,amax=>5};
is_deeply( [@p], [[3,4,5],[3,5,4],[4,3,5],[4,4,4],[4,5,3],[5,3,4],[5,4,3]], "forcomp 12 restricted n=3,a=[3..5]" ); }
|