Wasteful equidigital and frugal numbers
use Prime::Factor;
use Lingua::EN::Numbers;
my %cache;
sub factor-char-sum ($n, $base = 10) { sum $n.&prime-factors.Bag.map: { .key.base($base).chars + (.value > 1 ?? .value.base($base).chars !! 0) } }
sub economical ($n, $base = 10) { ($n > 1) && $n.base($base).chars > (%cache{$base}[$n] //= factor-char-sum $n, $base) }
sub equidigital ($n, $base = 10) { ($n == 1) || $n.base($base).chars == (%cache{$base}[$n] //= factor-char-sum $n, $base) }
sub extravagant ($n, $base = 10) { $n.base($base).chars < (%cache{$base}[$n] //= factor-char-sum $n, $base) }
for 10, 11 -> $base {
%cache{$base}[3e6] = Any; # preallocate to avoid concurrency issues
say "\nIn Base $base:";
for &extravagant, &equidigital, &economical -> &sub {
say "\nFirst 50 {&sub.name} numbers:";
say (^∞).grep( {.&sub($base)} )[^50].batch(10)».&comma».fmt("%6s").join: "\n";
say "10,000th: " ~ (^∞).hyper(:2000batch).grep( {.&sub($base)} )[9999].,
}
my $upto = 1e6.Int;
my atomicint ($extravagant, $equidigital, $economical);
say "\nOf the positive integers up to {$upto.&cardinal}:";
(1..^$upto).race(:5000batch).map: { .&extravagant($base) ?? ++⚛$extravagant !! .&equidigital($base) ?? ++⚛$equidigital !! ++⚛$economical };
say " Extravagant: {comma $extravagant}\n Equidigital: {comma $equidigital}\n Economical: {comma $economical}";
%cache{$base} = Empty;
}
Output:
In Base 10:
First 50 extravagant numbers:
4 6 8 9 12 18 20 22 24 26
28 30 33 34 36 38 39 40 42 44
45 46 48 50 51 52 54 55 56 57
58 60 62 63 65 66 68 69 70 72
74 75 76 77 78 80 82 84 85 86
10,000th: 14,346
First 50 equidigital numbers:
1 2 3 5 7 10 11 13 14 15
16 17 19 21 23 25 27 29 31 32
35 37 41 43 47 49 53 59 61 64
67 71 73 79 81 83 89 97 101 103
105 106 107 109 111 112 113 115 118 119
10,000th: 33,769
First 50 economical numbers:
125 128 243 256 343 512 625 729 1,024 1,029
1,215 1,250 1,280 1,331 1,369 1,458 1,536 1,681 1,701 1,715
1,792 1,849 1,875 2,048 2,187 2,197 2,209 2,401 2,560 2,809
3,125 3,481 3,584 3,645 3,721 4,096 4,374 4,375 4,489 4,802
4,913 5,041 5,103 5,329 6,241 6,250 6,561 6,859 6,889 7,203
10,000th: 1,953,125
Of the positive integers up to one million:
Extravagant: 831,231
Equidigital: 165,645
Economical: 3,123
In Base 11:
First 50 extravagant numbers:
4 6 8 9 10 12 18 20 22 24
26 28 30 33 34 36 38 39 40 42
44 45 46 48 50 51 52 54 55 56
57 58 60 62 63 65 66 68 69 70
72 74 75 76 77 78 80 82 84 85
10,000th: 12,890
First 50 equidigital numbers:
1 2 3 5 7 11 13 14 15 16
17 19 21 23 25 27 29 31 32 35
37 41 43 47 49 53 59 61 64 67
71 73 79 81 83 89 97 101 103 107
109 113 121 122 123 127 129 131 133 134
10,000th: 33,203
First 50 economical numbers:
125 128 243 256 343 512 625 729 1,024 1,331
1,369 1,458 1,536 1,681 1,701 1,715 1,792 1,849 1,875 2,048
2,187 2,197 2,209 2,401 2,560 2,809 3,072 3,125 3,481 3,584
3,645 3,721 4,096 4,374 4,375 4,489 4,802 4,913 5,041 5,103
5,120 5,329 6,241 6,250 6,561 6,859 6,889 7,168 7,203 7,921
10,000th: 2,659,171
Of the positive integers up to one million:
Extravagant: 795,861
Equidigital: 200,710
Economical: 3,428
Last updated