## Multiply Perfect Numbers

### September 25, 2015

This is easy if you have all the machinery for factoring integers and computing divisor-sums:

`> (do ((n 1 (+ n 1))) (#f)`

(when (zero? (modulo (sigma 1 n) n))

(display n) (newline)))

1

6

28

120

496

672

8128

30240

32760

523776

...

You can run the program at http://ideone.com/jUw4Z6, where you will also see all of the functions that support the computation of sigma.

Advertisements

As Scala stram. (Based on the previous implementation)

In Python. Optimized my ‘divisors’ algorithm from the exercise “Fermatâ€™s Divisors Challenges” here couple of weeks ago.

Haskell

A solution in Guile Scheme.

;;; the sum of divisors of a perfect number equals some multiple of that number

;;; example: 6 is 2-perfect, because 2*6 = 1+2+3+6

(define mod modulo)

(define (divisors num)

(let ((sqrt-num (sqrt num)))

(let loop ((d 1) (divs ‘()))

(if (<= d sqrt-num)

(loop (+ d 1)

(if (zero? (mod num d))

(if (= (* d d) num)

(cons d divs)

(cons (/ num d) (cons d divs)))

divs))

divs))))

(define (perfect candidate)

(if (zero? (mod (apply + (divisors candidate)) candidate))

(/ (apply + (divisors candidate)) candidate)

#f))

(let loop ((num 1))

(let ((p? (perfect num)))

(if p?

(begin

(display num)(display ": ")

(display p?)(newline))))

(if (<= num 1000000)

(loop (+ num 1))

#f))

output:

1: 1

6: 2

28: 2

120: 3

496: 2

672: 3

8128: 2

30240: 4

32760: 4

523776: 3

According to Wikipedia it is an open problem how many of these numbers exist…

Creating a “sieve” of divisors was much faster for finding the series for me than factoring each one individually.

I uses a sieve-like method. In Python:

A PhD thesis at https://opus.lib.uts.edu.au/research/bitstream/handle/2100/275/02Whole.pdf?sequence=2021

has lots of interesting history and information on multiperfect numbers. Like current minimum and maximum k-perfect numbers for 1 <= k <= 11. Also, there are no odd multiperfect numbers less than 10^70.

#include

int main()

{

int i,j,n=15,count=0,num;

printf(“Enter the length of sequance\n”);

scanf(“%d”,&num);

for(n=1;n<num;n++)

{

for(i=1;i<n;i++)

if(n%i==0)

count+=i;

if(count==n)

printf("%d is Perfect Number\n",n);

count=0;

}

}

o/p:

10000

6 is Perfect Number

28 is Perfect Number

496 is Perfect Number

8128 is Perfect Number