Wasteful, equidigital and frugal numbers

From Rosetta Code
Revision as of 16:32, 16 July 2022 by PureFox (talk | contribs) (→‎{{header|Wren}}: Added output.)
Wasteful, equidigital and frugal numbers is a draft programming task. It is not yet considered ready to be promoted as a complete task, for reasons that should be found in its talk page.
Definitions

Let n be a positive integer and l(n) be the number of its digits in base b.

Express n as the product of its prime factors raised to the appropriate powers. Let D(n) be the total number of its base b digits in all its prime factors and in all their exponents that are greater than 1.

Then n is defined to be:

1. a wasteful (or extravagant) number if l(n) < D(n); or

2. an equidigital number if l(n) = D(n); or

3. a frugal (or economical) number if l(n) > D(n)

in base b.

By convention, the number 1 is considered to be an equidigital number in any base even though it has no prime factors.

An economical number is sometimes defined as being being one for which l(n) >= D(n) though this usage won't be followed here.


Examples

In base 10, the number 30 has a prime factorization of 2 x 3 x 5. The total number of digits is 3 (all exponents being 1) which is more than the 2 digits 30 has. So 30 is wasteful in base 10.

In base 10, the number 49 has a prime factorization of 7². The total number of digits, including those of the exponent, is 2 which is the same as the 2 digits 49 has. So 49 is equidigital in base 10.

In base 10, the number 125 has a prime factorization of 5³. The total number of digits, including those of the exponent, is 2 which is less than the 3 digits 125 has. So 125 is frugal in base 10.

In base 2, the number 100000 (32 decimal) has a prime factorization of 10^101 (2^5 decimal). The total number of binary digits, including those of the exponent, is 5 which is less than the 6 binary digits 100000 has. So 32 is frugal in base 2 (but equidigital in base 10).


Task

Compute and show here the first 50 and the 10,000th number in base 10 for each of the three categories of number defined above.

Also compute and show how many numbers less than 1,000,000 fall into each of the three categories.


Bonus

Do the same for base 11, but show the results in base 10.


References



Wren

Library: Wren-math
Library: Wren-seq
Library: Wren-fmt

<lang ecmascript>import "./math" for Int import "./seq" for Lst import "./fmt" for Fmt

var analyze = Fn.new { |n, b|

   var factors = Int.primeFactors(n)
   var indivs = Lst.individuals(factors)
   var digits = 0
   for (indiv in indivs) {
       digits = digits + Int.digits(indiv[0], b).count
       if (indiv[1] > 1) digits = digits + Int.digits(indiv[1], b).count
   }
   return [Int.digits(n, b).count, digits]

}

for (b in [10, 11]) {

   var w = []
   var e = [1]
   var f = []
   var wc = 0
   var ec = 1
   var fc = 0
   var wc2 = 0
   var ec2 = 1
   var fc2 = 0
   var n = 2
   System.print("FOR BASE %(b):\n")
   while (fc < 10000 || ec < 10000 || wc < 10000) {
       var r = analyze.call(n, b)
       if (r[0] < r[1]) {
           if (w.count < 50 || wc == 9999) w.add(n)
           wc = wc + 1
           if (n < 1e6) wc2 = wc2 + 1
       } else if (r[0] == r[1]) {
           if (e.count < 50 || ec == 9999) e.add(n)
           ec = ec + 1
           if (n < 1e6) ec2 = ec2 + 1
       } else {
           if (f.count < 50 || fc == 9999) f.add(n)
           fc = fc + 1
           if (n < 1e6) fc2 = fc2 + 1
       }
       n = n + 1
   }
   System.print("First 50 Wasteful numbers:")
   Fmt.tprint("$4d", w[0..49], 10)
   System.print()
   System.print("First 50 Equidigital numbers:")
   Fmt.tprint("$4d", e[0..49], 10)
   System.print()
   System.print("First 50 Frugal numbers:")
   Fmt.tprint("$4d", f[0..49], 10)
   System.print()
   System.print("10,000th Wasteful number    : %(w[50])")
   System.print("10,000th Equidigital number : %(e[50])")
   System.print("10,000th Frugal number      : %(f[50])")
   System.print()
   System.print("For natural numbers < 1 million, the breakdown is as follows:")
   Fmt.print("  Wasteful numbers    : $6d", wc2)
   Fmt.print("  Equidigital numbers : $6d", ec2)
   Fmt.print("  Frugal numbers      : $6d", fc2)
   System.print()

}</lang>

Output:
FOR BASE 10:

First 50 Wasteful 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 

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 

First 50 Frugal numbers:
 125  128  243  256  343  512  625  729 1024 1029 
1215 1250 1280 1331 1369 1458 1536 1681 1701 1715 
1792 1849 1875 2048 2187 2197 2209 2401 2560 2809 
3125 3481 3584 3645 3721 4096 4374 4375 4489 4802 
4913 5041 5103 5329 6241 6250 6561 6859 6889 7203 

10,000th Wasteful number    : 14346
10,000th Equidigital number : 33769
10,000th Frugal number      : 1953125

For natural numbers < 1 million, the breakdown is as follows:
  Wasteful numbers    : 831231
  Equidigital numbers : 165645
  Frugal numbers      :   3123

FOR BASE 11:

First 50 Wasteful 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 

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 

First 50 Frugal numbers:
 125  128  243  256  343  512  625  729 1024 1331 
1369 1458 1536 1681 1701 1715 1792 1849 1875 2048 
2187 2197 2209 2401 2560 2809 3072 3125 3481 3584 
3645 3721 4096 4374 4375 4489 4802 4913 5041 5103 
5120 5329 6241 6250 6561 6859 6889 7168 7203 7921 

10,000th Wasteful number    : 12890
10,000th Equidigital number : 33203
10,000th Frugal number      : 2659171

For natural numbers < 1 million, the breakdown is as follows:
  Wasteful numbers    : 795861
  Equidigital numbers : 200710
  Frugal numbers      :   3428