package factors // Score returns a "factor score" equal to the sum of the reciprocoals // of the number n's factors. // Rationale: // A number's factors are one of the most important things that determines // how well it functions as a number base. An easy way to determine how // good these factors are is to simply count them, but that comes with // the problem that all factors are considered equal when they really aren't // - divisibility by 2 (which ensures 1/2 is a terminating fraction and // you can tell whether a number is even or odd by looking at the last digit) // is more important than divisibility by 23. The most obvious way of // accounting for this is by giving each factor a score and adding those // scores to get the overall score. I chose score(f) = 1/f because it is // the simplest function that captures the intuition that smaller factors // are more valuable than larger ones. It also gives the score a meaning: // a factor's score is the probability a random number is divisible by it. func Score(n uint) float64 { if n == 0 { panic("Cannot get factor score of 0.") } factorSum := uint(0) for _, f := range Factors(n) { factorSum += f } return float64(factorSum) / float64(n) }