Module:Factorization

local p = {}local function powerformat(divisor, power, productSymbol)if power < 1      then return ''    elseif power == 1 then return divisor .. ' ' .. productSymbol .. ' '    else return divisor .. '<sup>' .. power .. '</sup> ' .. productSymbol .. ' '    endendlocal function format(numString, bold, big, serif)    if bold then    numString = '<b>'..numString..'</b>'    endlocal ret = (serif or big) and '<span ' or ''if serif then ret = ret .. 'class="texhtml" ' endif big   then ret = ret .. 'style="font-size:165%" ' endret = ret .. ((serif or big) and '>' or '') .. numString .. ((serif or big) and '</span>' or '')    return retendfunction p.factor(frame)    local number = tonumber(frame.args[1])    if number == nil then    return '<strong class="error">Error: input not recognized as a number</strong>'    end    number = math.floor(number)    if number < 2 or number > 1000000000 or number == math.huge then        return '<strong class="error">Error: ' .. number .. ' out of range</strong>'    end    local result = ""    local currentNumber = number    local power = 0    local divisor = 2    local productSymbol = frame.args['product'] or '·'    -- 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 2result = result .. powerformat(divisor, power, productSymbol)        divisor = divisor + (divisor == 2 and 1 or 2)    end    if currentNumber ~= 1 then        result = result .. currentNumber .. ' ' .. productSymbol .. ' '    end    local primeLink = frame.args['prime'] and true    if currentNumber == number and primeLink then        return '[[prime number|prime]]'    end    result = string.sub(result,1,-4)    local bold = frame.args['bold'] and true    local big = frame.args['big'] and true    local serif = frame.args['serif'] and true    return format(result, bold, big, serif)endreturn p