Category talk:Wren-math: Difference between revisions
Content added Content deleted
(Added efficient divisorSum, divisorCount and reverse methods to Int class.) |
(→Source code: Improved algorithm for Int.divisors2.) |
||
Line 632: | Line 632: | ||
// As 'divisors' method but uses a different algorithm. |
// As 'divisors' method but uses a different algorithm. |
||
// Better for |
// Better for larger numbers. |
||
static divisors2(n) { |
static divisors2(n) { |
||
var pf = Int.primeFactors(n) |
|||
if (pf.count == 0) return (n == 1) ? [1] : pf |
|||
var |
var arr = [] |
||
if (pf.count == 1) { |
|||
arr.add([pf[0], 1]) |
|||
} else { |
|||
var prevPrime = pf[0] |
|||
var count = 1 |
|||
for (i in 1...pf.count) { |
|||
if (pf[i] == prevPrime) { |
|||
count = count + 1 |
|||
} else { |
|||
arr.add([prevPrime, count]) |
|||
prevPrime = pf[i] |
|||
count = 1 |
|||
} |
|||
} |
|||
arr.add([prevPrime, count]) |
|||
} |
} |
||
var divisors = [] |
|||
var |
var generateDivs |
||
generateDivs = Fn.new { |currIndex, currDivisor| |
|||
if (currIndex == arr.count) { |
|||
divisors.add(currDivisor) |
|||
return |
|||
} |
|||
for (i in 0..arr[currIndex][1]) { |
|||
generateDivs.call(currIndex+1, currDivisor) |
|||
currDivisor = currDivisor * arr[currIndex][0] |
|||
} |
} |
||
} |
} |
||
generateDivs.call(0, 1) |
|||
return divisors.sort() |
|||
} |
} |
||