Module:Q-odd-limit intervals: Difference between revisions
ArrowHead294 (talk | contribs) mNo edit summary |
experiment with a larger limit |
||
| (21 intermediate revisions by one other user not shown) | |||
| Line 1: | Line 1: | ||
local p = {} | |||
bit32 = require("bit32") | bit32 = require("bit32") | ||
ET = require("Module:ET") | ET = require("Module:ET") | ||
getArgs = require("Module:Arguments").getArgs | |||
limits = require("Module:Limits") | limits = require("Module:Limits") | ||
utils = require("Module:Utils") | |||
yesno = require("Module:Yesno") | |||
local PRIME_LIST = {2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61} | local PRIME_LIST = {2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61} | ||
| Line 109: | Line 111: | ||
} | } | ||
end | end | ||
table.sort(error_list, function(a, b) return a.error_abs_val < b.error_abs_val end) | |||
table.sort(error_list, function(a, b) | |||
return a.error_abs_val < b.error_abs_val | |||
end) | |||
return error_list | return error_list | ||
end | end | ||
| Line 119: | Line 125: | ||
local errlist_val = {} | local errlist_val = {} | ||
local val = {} | local val = {} | ||
local bgclr | local bgclr, result | ||
for i = 1, #subgroup do | for i = 1, #subgroup do | ||
| Line 126: | Line 132: | ||
error_list = find_error(val, subgroup, monzo_list) | error_list = find_error(val, subgroup, monzo_list) | ||
for i = 1, #error_list do | for i = 1, #error_list do | ||
ratiocomp = string.format("%d/%d, %d/%d", error_list[i].ratio.num, error_list[i].ratio.den, 2 * error_list[i].ratio.den, error_list[i].ratio.num) | ratiocomp = string.format("%d/%d, %d/%d", | ||
error_list[i].ratio.num, error_list[i].ratio.den, | |||
2 * error_list[i].ratio.den, error_list[i].ratio.num) | |||
eav = error_list[i].error_abs_val | eav = error_list[i].error_abs_val | ||
erv = error_list[i].error_rel_val | erv = error_list[i].error_rel_val | ||
| Line 135: | Line 143: | ||
error_abs_direct = string.format("%.3f", ead) | error_abs_direct = string.format("%.3f", ead) | ||
error_rel_direct = string.format("%.1f", erd) | error_rel_direct = string.format("%.1f", erd) | ||
if bit32.band(error_list[i].ratio.den, error_list[i].ratio.den - 1) == 0 and utils.table_contains(subgroup, error_list[i].ratio.num) then -- check power of 2 for den and prime for num | |||
if bit32.band(error_list[i].ratio.den, error_list[i].ratio.den - 1) == 0 | |||
and utils.table_contains(subgroup, error_list[i].ratio.num) then -- check power of 2 for den and prime for num | |||
ratiocomp = "'''" .. ratiocomp .. "'''" | ratiocomp = "'''" .. ratiocomp .. "'''" | ||
error_abs_val = "'''" .. error_abs_val .. "'''" | error_abs_val = "'''" .. error_abs_val .. "'''" | ||
| Line 173: | Line 183: | ||
end | end | ||
table.sort(errlist_direct, function(a, b) return a.ead < b.ead end) | table.sort(errlist_direct, function(a, b) | ||
return a.ead < b.ead | |||
end) | |||
for i = 1, #error_list do | for i = 1, #error_list do | ||
t_body_direct[i] = "|- | t_body_direct[i] = string.format("|-%s\n| %s || %s || %s", | ||
errlist_direct[i].bgclr, | |||
t_body_val[i] = "|- | errlist_direct[i].ratiocomp, | ||
errlist_direct[i].error_abs_direct, | |||
errlist_direct[i].error_rel_direct) | |||
t_body_val[i] = string.format("|-%s\n| %s || %s || %s", | |||
errlist_val[i].bgclr, | |||
errlist_val[i].ratiocomp, | |||
errlist_val[i].error_abs_val, | |||
errlist_val[i].error_rel_val) | |||
end | end | ||
| Line 185: | Line 203: | ||
.. "|+ style=\"font-size: 105%; white-space: nowrap;\" | " | .. "|+ style=\"font-size: 105%; white-space: nowrap;\" | " | ||
local t_head_1 = "|-\n" | local t_head_1 = "|-\n" | ||
.. "! class=\"unsortable\" | Interval and complement !! Error (abs, [[Cent| | .. "! class=\"unsortable\" | Interval and complement" | ||
.. " !! Error (abs, [[Cent|¢]])" | |||
.. " !! Error (rel, [[Relative cent|%]])\n" | |||
local t_foot = "\n|}" | local t_foot = "\n|}" | ||
| Line 197: | Line 217: | ||
if approx_t == "direct" then | if approx_t == "direct" then | ||
result = t_head_0 .. t_title .. tag_direct .. "\n" .. t_head_1 .. table.concat(t_body_direct, "\n") .. t_foot | |||
elseif approx_t == "val" then | elseif approx_t == "val" then | ||
result = t_head_0 .. t_title .. tag_val .. "\n" .. t_head_1 .. table.concat(t_body_val, "\n") .. t_foot | |||
else | else | ||
result = "" | |||
end | end | ||
return result | |||
end | end | ||
function p.q_odd_limit_intervals(frame) | function p.q_odd_limit_intervals(frame) | ||
local args = getArgs(frame) | |||
local steps = tonumber(frame.args["steps"]) | local steps = tonumber(frame.args["steps"]) | ||
local limit = math.max(tonumber(frame.args["limit"]), 2) | local limit = math.max(tonumber(frame.args["limit"]), 2) | ||
local constcy = limits.consistency_limit(ET.parse(steps .. "edo"), false, | local constcy = limits.consistency_limit(ET.parse(steps .. "edo"), false, 63) | ||
local wtext = yesno(frame.args["wtext"] or args["wtext"]) | |||
local note = frame.args["note"] | local note = frame.args["note"] | ||
local title = frame.args["title"] | local title = frame.args["title"] | ||
| Line 221: | Line 240: | ||
if not utils.value_provided(title) then | if not utils.value_provided(title) then | ||
title = string.format("%d-odd-limit intervals in | title = string.format("%d-odd-limit intervals in %dedo", limit, steps) | ||
end | end | ||
local subgroup = table_filter(PRIME_LIST, limit) | local subgroup = table_filter(PRIME_LIST, limit) | ||
local monzo_list = odd_limit_monzo_list_gen(limit) | local monzo_list = odd_limit_monzo_list_gen(limit) | ||
local | local result | ||
if header ~= "none" then | if header ~= "none" then | ||
if constcy >= limit then | if constcy >= limit then | ||
apx = "val" | apx = "val" | ||
end | end | ||
result = string.format("The following %s how [[%d-odd-limit]] intervals are represented in %dedo. ", | |||
string.gsub("table show", "()", {[((apx == "direct" or apx == "val") and 11 or 6)] = "s"}), limit, steps) | |||
.. "Prime harmonics are in '''bold'''" | |||
.. (constcy >= limit and string.format(".\n\nAs %dedo is consistent in the %d-odd-limit, " | |||
.. | .. "the mappings by direct approximation and through the patent val are identical.", steps, limit) | ||
or "; inconsistent intervals are in ''italics''.") | |||
.. "\n\n" | .. "\n\n" | ||
if constcy >= limit then | if constcy >= limit then | ||
| Line 241: | Line 261: | ||
end | end | ||
if note ~= "" then | if note ~= "" then | ||
result = result .. note .. "\n\n" | |||
end | end | ||
if steps == 12 then | if steps == 12 then | ||
result = result .. "Note that, since the [[cent]] was defined in terms of 12edo, the absolute and relative errors for 12edo are identical.\n\n" | |||
end | end | ||
else | else | ||
tag = string.lower(frame.args["tag"]:gsub("%s+", "")) | tag = string.lower(frame.args["tag"]:gsub("%s+", "")) | ||
result = "" | |||
end | end | ||
if utils.value_provided(apx) then | if utils.value_provided(apx) then | ||
result = result .. approx(steps, subgroup, monzo_list, title, tag, apx) | |||
else | else | ||
result = result .. approx(steps, subgroup, monzo_list, title, tag, "direct") .. "\n\n" .. approx(steps, subgroup, monzo_list, title, tag, "val") | |||
end | end | ||
return | |||
if wtext then | |||
result = "<syntaxhighlight lang=\"wikitext\">" .. result .. "</syntaxhighlight>" | |||
end | |||
return frame:preprocess(result) | |||
end | end | ||
return p | return p | ||