# allFactors.frink

``` // 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        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." ```