-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathperfectnumber.go
58 lines (45 loc) · 1.01 KB
/
perfectnumber.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
package go_kata
import (
"math/big"
)
func isPerfectNumber(num int) bool {
sum := 0
for i := 1; i < num; i++ {
if num%i == 0 {
sum += i
}
}
return sum == num
}
func FindPerfectNumbers(n int) []int {
perfectNumbers := []int{}
num := 1
for len(perfectNumbers) < n {
if isPerfectNumber(num) {
perfectNumbers = append(perfectNumbers, num)
}
num++
}
return perfectNumbers
}
func FindPerfectNumbersEfficient(n int) []*big.Int {
var perfectNumbers = make([]*big.Int, n)
count := 0
var bigInt = new(big.Int)
var base = big.NewInt(2)
for i := 2; count < n; i++ {
if !big.NewInt(int64(i)).ProbablyPrime(20) {
continue
}
var e = big.NewInt(int64(i))
var mersennePrime = bigInt.Exp(base, e, nil)
mersennePrime = bigInt.Sub(mersennePrime, big.NewInt(1))
if mersennePrime.ProbablyPrime(20) {
e = big.NewInt(int64(i - 1))
mersennePrime2 := new(big.Int).Exp(base, e, nil)
perfectNumbers[count] = new(big.Int).Mul(mersennePrime, mersennePrime2)
count++
}
}
return perfectNumbers
}