summaryrefslogtreecommitdiff
path: root/factors/score.go
blob: 707120d2accb2bef29cdb89e38e946369ea3fe3c (plain)
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
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)
}