These define three classifications of positive integers based on their   proper divisors.

Let   P(n)   be the sum of the proper divisors of   n   where the proper divisors are all positive divisors of   n   other than   n   itself.

   if    P(n) <  n    then  n  is classed as  deficient  (OEIS A005100).
   if    P(n) == n    then  n  is classed as  perfect    (OEIS A000396).
   if    P(n) >  n    then  n  is classed as  abundant   (OEIS A005101).



Example

6   has proper divisors of   1,   2,   and   3.

1 + 2 + 3 = 6,   so   6   is classed as a perfect number.



Task

Calculate how many of the integers   1   to   20,000   (inclusive) are in each of the three classes.

Show the results here.



Related tasks

   Aliquot sequence classifications.   (The whole series from which this task is a subset.)
   Proper divisors
   Amicable pairs


% Generate proper divisors from 1 to max
proper_divisors = proc (max: int) returns (array[int])
    divs: array[int] := array[int]$fill(1, max, 0)
    for i: int in int$from_to(1, max/2) do
        for j: int in int$from_to_by(i*2, max, i) do
            divs[j] := divs[j] + i
        end
    end
    return(divs)
end proper_divisors
 
% Classify all the numbers for which we have divisors
classify = proc (divs: array[int]) returns (int, int, int)
    def, per, ab: int
    def, per, ab := 0, 0, 0
    for i: int in array[int]$indexes(divs) do
        if     divs[i]<i then def := def + 1
        elseif divs[i]=i then per := per + 1
        elseif divs[i]>i then ab := ab + 1
        end
    end 
    return(def, per, ab)
end classify 
 
% Find amount of deficient, perfect, and abundant numbers up to 20000
start_up = proc ()
    max = 20000
 
    po: stream := stream$primary_output()
 
    def, per, ab: int := classify(proper_divisors(max))
    stream$putl(po, "Deficient: " || int$unparse(def))
    stream$putl(po, "Perfect:   " || int$unparse(per))
    stream$putl(po, "Abundant:  " || int$unparse(ab))
end start_up