Op den Inhalt sprangen

Modul:Divisors

Vu Wikipedia
Dokumentatioun vum Modul:Divisors [liesen] [änneren] [Versioune weisen]

D'Dokumentatioun fir dëst Modul steet hei ënnendrënner an ass vun der Säit Modul:Divisors/doc hei agebonne ginn. All Froe sollen och op där hirer Diskussiounssäit gestallt ginn. Kuckt och: Hëllef:Moduler.

local p = {}

---- Arithmeetesch Funktiounen ----
-- Gëtt d'Deeler vun enger natierlecher Zuel als table erëm.
function p.getDivisors(n)
    local divisors = {}
    local sqrt = math.floor(math.sqrt(n))
    for d = 1, sqrt do
        if n % d == 0 then
            table.insert(divisors, d)
            local r = n / d
            if d ~= r then
                table.insert(divisors, r)
            end
        end
    end
    table.sort(divisors)
    return divisors
end

-- Gëtt d'Primfacteure vun enger natierlecher Zuel als table erëm.
-- Falls distinct = false ass, kënnt all Facteur sou oft vir, wéi en d'Zuel
-- deelt; am anere Fall kënnt all Facteur just eng Kéier vir.
function p.getPrimeFactors(n, distinct)
	local factors = {}
	local d = 2
	while d * d <= n do
		seen = false
		while n % d == 0 do
			if not (seen and distinct) then
				table.insert(factors, d)
				seen = true
			end
			n = n / d
		end
		d = d + 1
	end
	if n > 1 then
		table.insert(factors, n)
	end
	return factors
end

---- Formatéierungs- an aner Hëllefsfunktiounen ----
-- Formatéiert eng table als kommagetrennte Lëscht.
function p.formatList(t)
	return table.concat(t, ", ")
end

-- Stellt eng table vun Zuelen an der Schreifweis 2{{Exp|3}}·3·5{{Exp|2}} duer.
function p.formatPrimeFactorProduct(factors)
	if #factors == 0 then return "" end
	local counts, parts = {}, {}
	for _, prime in ipairs(factors) do
		counts[prime] = (counts[prime] or 0) + 1
	end
	for prime in pairs(counts) do
		table.insert(parts, prime)
	end
	table.sort(parts)
	for i, prime in ipairs(parts) do
		local exp = counts[prime]
		if exp == 1 then
			parts[i] = tostring(prime)
		else
			parts[i] = tostring(prime) .. "{{Exp|" .. exp .. "}}"
		end
	end
	return table.concat(parts, "·")
end

-- Iwwerpréift, ob eng Zeecheketten eng ganz Zuel mat Absolutwäert < 10^15 ass.
function p.isSafeNumber(numberStr)
	-- Iwwerpréift, ob den Inputstring eng ganz Zuel duerstellt, déi innerhalb
	-- vun de Limitten ass, déi Scribunto-Lua korrekt duerstelle kann.
	-- Experimentéieren ergëtt Limitte vun [-99999999999999,99999999999999]
	-- (dat si jeeweils 14 9en).
	local s = numberStr:gsub("^%-", "")
    return s:match("^%d+$") and #s < 15
end

---- Benotzerinterface ----
-- Gëtt d'Deeler vun enger natierlecher Zuel als kommagetrennte Lëscht erëm.
function p.formattedDivisorList(frame)
	local s = frame.args[1]
	if not p.isSafeNumber(s) then
		return nil
	end
	local n = tonumber(s)
	local divisors = p.getDivisors(n)
	return p.formatList(divisors)
end

-- Gëtt d'Primfacteure vun enger natierlecher Zuel als kommagetrennte Lëscht
-- erëm. All Facteur kënnt just eng Kéier vir.
function p.formattedPrimeFactorsList(frame)
	local s = frame.args[1]
	if not p.isSafeNumber(s) then
		return nil
	end
	local n = tonumber(s)
	local factors = p.getPrimeFactors(n, true)
	return p.formatList(factors)
end

-- Gëtt d'Faktoriséierung vun enger natierlecher Zuel an der Schreifweis
-- 2{{Exp|3}}·3·5{{Exp|2}} erëm.
function p.formattedPrimeFactorization(frame)
	local s = frame.args[1]
	if not p.isSafeNumber(s) then
		return nil
	end
	local n = tonumber(s)
	local factors = p.getPrimeFactors(n, false)
	return p.formatPrimeFactorProduct(factors)
end

return p