50 lines
963 B
Go
50 lines
963 B
Go
package prime
|
|
|
|
import "fmt"
|
|
|
|
const testVersion = 2
|
|
|
|
var sieve []int64
|
|
var iter int
|
|
|
|
func Factors(num int64) []int64 {
|
|
fmt.Println("Factors Called on ", num)
|
|
if num == 1 {
|
|
return []int64{}
|
|
}
|
|
for i := range sieve {
|
|
if sieve[i] == num {
|
|
// It's a prime already in the sieve
|
|
return []int64{num}
|
|
}
|
|
if num%sieve[i] == 0 {
|
|
div := (num / sieve[i])
|
|
return append([]int64{sieve[i]}, Factors(div)...)
|
|
}
|
|
}
|
|
// If we're here, we don't have the prime factors for this number
|
|
// Add 1 to the highest prime that we have and find the next prime
|
|
i := int64(2)
|
|
if len(sieve) > 0 {
|
|
i = sieve[len(sieve)-1]
|
|
}
|
|
fmt.Println(" Looking for a new prime starting at ", i)
|
|
for ; i <= num; i++ {
|
|
isPrime := true
|
|
for j := range sieve {
|
|
if i%sieve[j] == 0 {
|
|
isPrime = false
|
|
}
|
|
if !isPrime {
|
|
break
|
|
}
|
|
}
|
|
if isPrime {
|
|
sieve = append(sieve, i)
|
|
// New prime in the sieve, try again
|
|
return Factors(num)
|
|
}
|
|
}
|
|
return []int64{}
|
|
}
|