Difference between revisions of "Module:Factorization"
Jump to navigation
Jump to search
blackwiki>Ypnypn (fix) |
(better to return an error here, rather than the false impression that the number is prime) |
||
Line 11: | Line 11: | ||
number = math.floor(number) | number = math.floor(number) | ||
if number < 2 or number > 1000000 then | if number < 2 or number > 1000000 then | ||
− | return | + | return "number out of range" |
end | end | ||
Revision as of 15:45, 3 May 2013
![]() | This module is rated as beta, and is ready for widespread use. It is still new and should be used with some caution to ensure the results are as expected. |
This template displays the factorization of a given number. Numbers smaller than 2 or greater than 1,000,000,000 return "number out of range". Fractional numbers are rounded down.
- Parameters
- The first unnamed parameter is the number
- Product - the symbol to be used to indicate times. Defaults to ·
- Bold - set to any value to make it bold
- Serif - set to any value to make it serif
- Big - set to any value to make it big
- Prime - set to any value to have prime numbers return an unformatted link to prime instead of the number
local p = {}
function p.factor(frame)
number = tonumber(frame.args[1])
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 > 1000000 then
return "number out of range"
end
result = ""
currentNumber = number
power = 0
--First take care of 2, the only even prime number.
if currentNumber % 2 == 0 then
result = '2'
currentNumber = currentNumber / 2
power = 1
end
while currentNumber % 2 == 0 do
currentNumber = currentNumber / 2
power = power + 1
end
if power > 1 then
result = result..'<sup>'..power..'</sup>'..productSymbol..' '
elseif power == 1 then
result = result..' '..productSymbol..' '
end
--Now do all odd numbers.
prime = 3
while prime <= math.sqrt(currentNumber) do
power = 0
if currentNumber % prime == 0 then
result = result..prime
currentNumber = currentNumber / prime
power = 1
end
while currentNumber % prime == 0 do
currentNumber = currentNumber / prime
power = power + 1
end
if power > 1 then
result = result..'<sup>'..power..'</sup>'..productSymbol..' '
elseif power == 1 then
result = result..' '..productSymbol..' '
end
prime = prime + 1
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 format(num)
if bold then
num = '<b>'..num..'</b>'
end
if serif then
if big then
num = '<span class="texhtml" style="font-size:165%">'..num..'</span>'
else
num = '<span class="texhtml">'..num..'</span>'
end
elseif big then
num = '<span style="font-size:165%">'..num..'</span>'
end
return num
end
return p