Edge Rewrite
// HTMLRewriter · presentation

This page was redesigned at the edge.

Cloudflare fetched the original article and streamed it through HTMLRewriter to apply an entirely new visual system without rebuilding the source page.

Jump to content

Module:Factorization

Permanently protected module
From Wikipedia, the free encyclopedia

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 .. ' '
    end
end

local function format(numString, bold, big, serif)
    if bold then
    	numString = '<b>'..numString..'</b>'
    end

	local ret = (serif or big) and '<span ' or ''
	if serif then ret = ret .. 'class="texhtml"' .. (big and ' ' or '') end
	if big   then ret = ret .. 'style="font-size:165%"' end
	ret = ret .. ((serif or big) and '>' or '') .. numString .. ((serif or big) and '</span>' or '')

    return ret
end

function 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 > 2^53-1 then
        return '<strong class="error">Error: ' .. number .. ' out of range</strong>'
    end

    local result = ""
    local currentNumber = number
    local power
    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 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

    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 mw.text.trim(format(result, bold, big, serif))
end

return p