allFactors2.frink

View or download allFactors2.frink in plain text format


// 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] :=
{
   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."


View or download allFactors2.frink in plain text format


This is a program written in the programming language Frink.
For more information, view the Frink Documentation or see More Sample Frink Programs.

Alan Eliasen was born 17645 days, 8 hours, 38 minutes ago.