Module:Harmonics in ED: Difference between revisions
From Xenharmonic Reference
Tristanbay (talk | contribs) Fixed colors hopefully |
Tristanbay (talk | contribs) Fixed prime limit logic |
||
| Line 43: | Line 43: | ||
tab = tab .. "! style=\"background-color:#" | tab = tab .. "! style=\"background-color:#" | ||
tab = tab .. p_cols[i] .. "\" |" .. primes[i] .. "\n" | tab = tab .. p_cols[i] .. "\" |" .. primes[i] .. "\n" | ||
if primes[i] > p_lim then break end | if primes[i] >= p_lim then break end | ||
end | end | ||
tab = tab .. "|-\n! rowspan=\"2\" |Error\n!Absolute (¢)\n" | tab = tab .. "|-\n! rowspan=\"2\" |Error\n!Absolute (¢)\n" | ||
| Line 50: | Line 50: | ||
if rel_err(et, primes[i]) > 0 then tab = tab .. "+" end | if rel_err(et, primes[i]) > 0 then tab = tab .. "+" end | ||
tab = tab .. string.format("%.1f", abs_err(et, primes[i])) .. "\n" | tab = tab .. string.format("%.1f", abs_err(et, primes[i])) .. "\n" | ||
if primes[i] > p_lim then break end | if primes[i] >= p_lim then break end | ||
end | end | ||
tab = tab .. "|-\n!Relative (%)\n" | tab = tab .. "|-\n!Relative (%)\n" | ||
| Line 59: | Line 59: | ||
if er > 0 then tab = tab .. "+" end | if er > 0 then tab = tab .. "+" end | ||
tab = tab .. string.format("%.1f", er * 100) .. "\n" | tab = tab .. string.format("%.1f", er * 100) .. "\n" | ||
if primes[i] > p_lim then break end | if primes[i] >= p_lim then break end | ||
end | end | ||
tab = tab .. "|-\n! colspan=\"2\" |Steps\n(reduced)\n" | tab = tab .. "|-\n! colspan=\"2\" |Steps\n(reduced)\n" | ||
for i = 1,p_len do | for i = 1,p_len do | ||
tab = tab .. "|" .. steps(et, primes[i]) .. "\n(" .. steps_re(et, primes[i]) .. ")\n" | tab = tab .. "|" .. steps(et, primes[i]) .. "\n(" .. steps_re(et, primes[i]) .. ")\n" | ||
if primes[i] > p_lim then break end | if primes[i] >= p_lim then break end | ||
end | end | ||
tab = tab .. "|}" | tab = tab .. "|}" | ||
Revision as of 21:19, 16 December 2025
Documentation for this module may be created at Module:Harmonics in ED/doc
local p = {}
local primes = {2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89}
-- TODO: switch out these colors for proper classes
local p_cols = {"888888", "BB4E45", "5B963D", "4C55AB", "A3983F", "924FA3", "AF7E3D", "614B8D", "3A8DA3", "829C3A", "AD6679", "885B2E", "743F34", "25573F", "40445F", "2C617A", "6A752A", "674F58", "604220", "5F2D23", "11493A", "273450", "55203A", "454C19"}
local function steps(et, harm) -- steps of harmonic
return math.floor((math.log(harm) / math.log(2) * et) + 0.5)
end
local function steps_re(et, harm) -- steps of reduced harmonic
return steps(et, harm) - (math.floor(math.log(harm) / math.log(2)) * et)
end
local function rel_err(et, harm) -- relative error of harmonic
st = math.log(harm) / math.log(2) * et
return math.floor(st + 0.5) - st
end
local function abs_err(et, harm) -- absolute error of harmonic
return 1200 / et * rel_err(et, harm)
end
local function rel_col(err) -- color used for relative error
-- TODO: switch out these colors for proper classes
abs_err = math.abs(err)
red = math.pow(abs_err * 2, 1 / 3.0) * 150
green = math.pow(1 - (abs_err * 2), 0.5) * 150
blue = (1 - (abs_err * 10)) * 150
if blue < 10 then blue = 10 end
return string.format("%02x%02x%02x", math.floor(red), math.floor(green), math.floor(blue))
end
function p.table(frame) -- making the table itself
-- TODO: switch out these colors for proper classes
local p_len = #primes
local et = math.floor(frame.args["et"])
local p_lim = math.floor(frame.args["p_lim"])
local tab = "{| class=\"wikitable\"\n"
tab = tab .. "|+Approximation of prime harmonics in "
tab = tab .. et .. "edo\n"
tab = tab .. "! colspan=\"2\" |Harmonic\n"
for i = 1,p_len do
tab = tab .. "! style=\"background-color:#"
tab = tab .. p_cols[i] .. "\" |" .. primes[i] .. "\n"
if primes[i] >= p_lim then break end
end
tab = tab .. "|-\n! rowspan=\"2\" |Error\n!Absolute (¢)\n"
for i = 1,p_len do
tab = tab .. "| "
if rel_err(et, primes[i]) > 0 then tab = tab .. "+" end
tab = tab .. string.format("%.1f", abs_err(et, primes[i])) .. "\n"
if primes[i] >= p_lim then break end
end
tab = tab .. "|-\n!Relative (%)\n"
for i = 1,p_len do
local er = rel_err(et, primes[i])
tab = tab .. "| style=\"background-color:#" .. rel_col(er)
tab = tab .. "\" | "
if er > 0 then tab = tab .. "+" end
tab = tab .. string.format("%.1f", er * 100) .. "\n"
if primes[i] >= p_lim then break end
end
tab = tab .. "|-\n! colspan=\"2\" |Steps\n(reduced)\n"
for i = 1,p_len do
tab = tab .. "|" .. steps(et, primes[i]) .. "\n(" .. steps_re(et, primes[i]) .. ")\n"
if primes[i] >= p_lim then break end
end
tab = tab .. "|}"
return tab
end
return p
