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{} }