Difference between revisions of "Module:Factorization/sandbox"
Jump to navigation
Jump to search
blackwiki>Andy M. Wang (consolidating divisor with subroutine (cleaner)) |
blackwiki>Andy M. Wang (compressed format function) |
||
| Line 34: | Line 34: | ||
end | end | ||
| + | -- Concat result and increment divisor | ||
| + | -- when divisor is 2, go to 3. All other times, add 2 | ||
result = result .. powerformat(divisor, power, productSymbol) | result = result .. powerformat(divisor, power, productSymbol) | ||
| − | |||
divisor = divisor + (divisor == 2 and 1 or 2) | divisor = divisor + (divisor == 2 and 1 or 2) | ||
end | end | ||
if currentNumber ~= 1 then | if currentNumber ~= 1 then | ||
| − | result = result..currentNumber..' '..productSymbol..' ' | + | result = result .. currentNumber .. ' ' .. productSymbol .. ' ' |
end | end | ||
if currentNumber == number and primeLink then | if currentNumber == number and primeLink then | ||
| − | return '[[ | + | return '[[prime]]' |
end | end | ||
| Line 59: | Line 60: | ||
end | end | ||
| − | function format( | + | function format(numString) |
if bold then | if bold then | ||
| − | + | numString = '<b>'..numString..'</b>' | |
end | 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 .. '>' .. numString .. '</span>' | |
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | return | + | return ret |
end | end | ||
return p | return p | ||
Revision as of 06:40, 24 April 2016
Documentation for this module may be created at Module:Factorization/sandbox/doc
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 '<strong class="error">Error: input not recognized as a number</strong>'
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 '<strong class="error">Error: ' .. number .. ' out of range</strong>'
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 .. '<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 .. '>' .. numString .. '</span>'
return ret
end
return p