Module:Utils: Difference between revisions

Fredg999 (talk | contribs)
Added is_prime and prime_factorization
Fredg999 (talk | contribs)
Exponents off by 1? Show exponent only if >1, misc. edits
Line 55: Line 55:
-- returns true if integer n is prime; cannot be used with {{#invoke:}}
-- returns true if integer n is prime; cannot be used with {{#invoke:}}
function p.is_prime(n)
function p.is_prime(n)
  local cached = primes[n]
local cached = primes[n]
  if cached ~= nil then
if cached ~= nil then
    return cached
return cached
  end
end
  for i = 2, math.sqrt(n) do
for i = 2, math.sqrt(n) do
    if n % i == 0 then
if n % i == 0 then
      primes[n] = false
primes[n] = false
      return false
return false
    end
end
  end
end
  primes[n] = true
primes[n] = true
  return true  
return true  
end
end


Line 76: Line 76:


function p._prime_factorization(n)
function p._prime_factorization(n)
  local factors, powers = {}, {}
local factors, powers = {}, {}
  local new_number = n
local new_number = n
  for i = 2, n do
for i = 2, n do
    if p.is_prime(i) then
if p.is_prime(i) then
      if new_number % i == 0 then
if new_number % i == 0 then
        factors[#factors + 1] = i
factors[#factors + 1] = i
        powers[#factors] = 0
powers[#factors] = 1
      end
end
      while new_number % i == 0 do  
while new_number % i == 0 do  
        powers[#factors] = powers[#factors] + 1
powers[#factors] = powers[#factors] + 1
        new_number = new_number / i
new_number = new_number / i
      end
end
      powers[#factors] = factors[#factors] .. "<sup>" .. powers[#factors] .. "</sup>"
if powers[#factors] > 1 then
    end
powers[#factors] = factors[#factors] .. "<sup>" .. powers[#factors] .. "</sup>"
    if new_number == 1 then
end
      break
end
    end
if new_number == 1 then
  end
break
  return table.concat(powers, " × ")
end
end
return table.concat(powers, " × ")
end
end


return p
return p