Category talk:Wren-gmp: Difference between revisions

Content added Content deleted
(→‎Source code (Wren): Added divisors and properDivisors methods to Mpz.)
(→‎Source code (Wren): Added a second divisors method.)
Line 580: Line 580:
// Returns all the divisors of 'n' including 1 and 'n' itself.
// Returns all the divisors of 'n' including 1 and 'n' itself.
static divisors(n) {
static divisors(n) {
if (n <= Mpz.zero) return []
if (n < 1) return []
var factors = Mpz.primeFactors(n)
if (n is Num) n = from(n)
var divs = [Mpz.one]
var divs = []
var divs2 = []
var i = one
var k = n.isEven ? one : two
var sqrt = n.copy().sqrt
while (i <= sqrt) {
if (n.isDivisible(i)) {
divs.add(i.copy())
var j = n / i
if (j != i) divs2.add(j)
}
i.add(k)
}
if (!divs2.isEmpty) divs = divs + divs2[-1..0]
return divs
}

// Returns all the divisors of 'n' excluding 'n'.
static properDivisors(n) {
var d = divisors(n)
var c = d.count
return (c <= 1) ? [] : d[0..-2]
}

// As 'divisors' method but uses a different algorithm.
// Better for large numbers with a small number of prime factors.
static divisors2(n) {
if (n <= zero) return []
var factors = primeFactors(n)
var divs = [one]
for (p in factors) {
for (p in factors) {
for (i in 0...divs.count) divs.add(divs[i]*p)
for (i in 0...divs.count) divs.add(divs[i]*p)
Line 596: Line 625:
}
}


// Returns all the divisors of 'n' excluding 'n'.
// As 'properDivisors' but uses 'divisors2' method.
static properDivisors(n) {
static properDivisors2(n) {
var d = divisors(n)
var d = divisors2(n)
var c = d.count
var c = d.count
return (c <= 1) ? [] : d[0..-2]
return (c <= 1) ? [] : d[0..-2]