Module:Factorization
From Chalo Chatu, Zambia online encyclopedia
Jump to navigationJump to search
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