Arithmetic numbers

From Rosetta Code
Revision as of 09:40, 13 June 2022 by PureFox (talk | contribs) (Created new draft task and added a Wren solution.)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Arithmetic 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.
Definition

A positive integer n is an arithmetic number if the average of its positive divisors is also an integer.

Clearly all odd primes p must be arithmetic numbers because their only divisors are 1 and p whose sum is even and hence their average must be an integer. However, the prime number 2 is not an arithmetic number because the average of its divisors is 1.5.

Example

30 is an arithmetic number because its 7 divisors are: [1, 2, 3, 5, 6, 10, 15, 30], their sum is 72 and average 9 which is an integer.

Task

Calculate and show here:

1. The first 100 arithmetic numbers.

2. The xth arithmetic number where x = 1,000 and x = 10,000.

3. How many arithmetic numbers <= x are composite.

Note that, technically, the arithmetic number 1 is neither prime nor composite.

Stretch

Carry out the same exercise in 2. and 3. above for x = 100,000 and x = 1,000,000.

References



Wren

Library: Wren-math
Library: Wren-fmt
Library: Wren-sort

<lang ecmascript>import "./math" for Int, Nums import "./fmt" for Fmt import "./sort" for Find

var arithmetic = [1] var primes = [] var limit = 1e6 var n = 3 while (arithmetic.count < limit) {

   var divs = Int.divisors(n)
   if (divs.count == 2) {
       primes.add(n)
       arithmetic.add(n)
   } else {
       var mean = Nums.mean(divs)
       if (mean.isInteger) arithmetic.add(n)
   }
   n = n + 1

} System.print("The first 100 arithmetic numbers are:") Fmt.tprint("$3d", arithmetic[0..99], 10)

for (x in [1e3, 1e4, 1e5, 1e6]) {

   var last = arithmetic[x-1]
   Fmt.print("\nThe $,dth arithmetic number is: $,d", x, last)
   var pcount = Find.nearest(primes, last) + 1
   if (!Int.isPrime(last)) pcount = pcount - 1
   var comp = x - pcount - 1 // 1 is not composite
   Fmt.print("The count of such numbers <= $,d which are composite is $,d.", last, comp)

}</lang>

Output:
The first 100 arithmetic numbers are:
  1   3   5   6   7  11  13  14  15  17 
 19  20  21  22  23  27  29  30  31  33 
 35  37  38  39  41  42  43  44  45  46 
 47  49  51  53  54  55  56  57  59  60 
 61  62  65  66  67  68  69  70  71  73 
 77  78  79  83  85  86  87  89  91  92 
 93  94  95  96  97  99 101 102 103 105 
107 109 110 111 113 114 115 116 118 119 
123 125 126 127 129 131 132 133 134 135 
137 138 139 140 141 142 143 145 147 149 

The 1,000th arithmetic number is: 1,361
The count of such numbers <= 1,361 which are composite is 782.

The 10,000th arithmetic number is: 12,953
The count of such numbers <= 12,953 which are composite is 8,458.

The 100,000th arithmetic number is: 125,587
The count of such numbers <= 125,587 which are composite is 88,219.

The 1,000,000th arithmetic number is: 1,228,663
The count of such numbers <= 1,228,663 which are composite is 905,043.