Jump to content

Module:Factorization: Difference between revisions

From Wikipedia, the free encyclopedia
Content deleted Content added
m Protected "Module:Factorization": High-risk Lua module: request at WP:RFPP ([Edit=Require autoconfirmed or confirmed access] (indefinite) [Move=Require autoconfirmed or confirmed access] (indefinite))
use locals, move var use to where used
 
Line 1: Line 1:
local p = {}
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" ' 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)
function p.factor(frame)
-- Consider calling the parser function #expr
local number = tonumber(frame.args[1])
-- to simplify a potential mathematical expression?
number = tonumber(frame.args[1])
if number == nil then
if number == nil then
return '<strong class="error">Error: input not recognized as a number</strong>'
return '<strong class="error">Error: input not recognized as a number</strong>'
end
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)
number = math.floor(number)
if number < 2 or number > 1000000000 or number == math.huge then
if number < 2 or number > 1000000000 or number == math.huge then
Line 20: Line 32:
end
end


result = ""
local result = ""
currentNumber = number
local currentNumber = number
power = 0
local power = 0
divisor = 2
local divisor = 2
local productSymbol = frame.args['product'] or '·'

-- Attempt factoring by the value of the divisor
-- Attempt factoring by the value of the divisor
-- divisor increments by 2, except first iteration (2 to 3)
-- divisor increments by 2, except first iteration (2 to 3)
while divisor <= math.sqrt(currentNumber) do
while divisor <= math.sqrt(currentNumber) do
power = 0
power = 0
Line 44: Line 56:
end
end


local primeLink = frame.args['prime'] and true
if currentNumber == number and primeLink then
if currentNumber == number and primeLink then
return '[[prime number|prime]]'
return '[[prime number|prime]]'
Line 50: Line 63:
result = string.sub(result,1,-4)
result = string.sub(result,1,-4)


local bold = frame.args['bold'] and true
return format(result)
local big = frame.args['big'] and true
end
local serif = frame.args['serif'] and true

return format(result, bold, big, serif)
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

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

ret = (serif or big) and '<span ' or ''
if serif then ret = ret .. 'class="texhtml" ' 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
end



Latest revision as of 23:50, 8 February 2023

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" ' 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 > 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 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 format(result, bold, big, serif)
end

return p