Module:Factorization

From Chalo Chatu, Zambia online encyclopedia

local p = {}

function p.factor(frame) -- Consider calling the parser function #expr -- to simplify a potential mathematical expression?

   number = tonumber(frame.args[1])
   if number == nil then
   	return 'Error: input not recognized as a number'
   end
   productSymbol = frame.args['product'] or '·'
   bold = frame.args['bold'] and true
   big = frame.args['big'] and true
   serif = frame.args['serif'] and true
   primeLink = frame.args['prime'] and true
   number = math.floor(number)
   if number < 2 or number > 1000000000 or number == math.huge then
       return 'Error: ' .. number .. ' out of range'
   end
   result = ""
   currentNumber = number
   power = 0
   divisor = 2
   -- Attempt factoring by the value of the divisor
   --   divisor increments by 2, except first iteration (2 to 3)
   while divisor <= math.sqrt(currentNumber) do
       power = 0
       while currentNumber % divisor == 0 do
           currentNumber = currentNumber / divisor
           power = power + 1
       end

-- Concat result and increment divisor -- when divisor is 2, go to 3. All other times, add 2 result = result .. powerformat(divisor, power, productSymbol)

       divisor = divisor + (divisor == 2 and 1 or 2)
   end
   if currentNumber ~= 1 then
       result = result .. currentNumber .. ' ' .. productSymbol .. ' '
   end
   if currentNumber == number and primeLink then
       return 'prime'
   end
   result = string.sub(result,1,-4)
   return format(result)

end

function powerformat(divisor, power, productSymbol) if power < 1 then return

   elseif power == 1 then return divisor .. ' ' .. productSymbol .. ' '
   else return divisor .. '' .. power .. ' ' .. productSymbol .. ' '
   end

end

function format(numString)

   if bold then
   	numString = ''..numString..''
   end

ret = (serif or big) and '' or ) .. numString .. ''

   return ret

end

return p