// This function finds all divisors of a number, including 1 and the number // itself. This version uses the "multifor" construct to simplify the logic. allFactors[n, include1=true, includeN=true, sort=true, onlyToSqrt=false] := { if n == 1 if include1 or includeN return [1] else return [] factors = factor[n] size = length[factors] if onlyToSqrt == false upperLimit = n else upperLimit = floor[sqrt[n]] /* We can precalculate the size of the results. Each base in the factor list multiplies the total factors by exp+1 */ resultSize = 1 for [base,exp] = factors resultSize = resultSize * (exp+1) results = new array[resultSize] loops = new array[size] for [base,count] = factors loops.push[new range[0,count]] multifor c = loops { product = 1 for i = 0 to length[c]-1 product = product * (factors@i@0)^(c@i) if (product > upperLimit) next if ((product == 1 and include1 == false) or (product == n and includeN == false)) { // Do nothing } else results.push[product] } if sort sort[results] // Sorts in place return results } "allFactors included successfully."