Module:Q-odd-limit intervals: Difference between revisions

ArrowHead294 (talk | contribs)
No edit summary
ArrowHead294 (talk | contribs)
Restore revision 144934
Line 94: Line 94:
end
end


local function find_error_direct(val, subgroup, monzo_list)
local function find_error(val, subgroup, monzo_list)
local step_size = 1200/val[1]
local step_size = 1200/val[1]
local true_size
local true_size
local approx_size
local approx_size
local error_list_direct = {}
local error_list = {}
for i = 1, #monzo_list do
for i = 1, #monzo_list do
ratio = monzo2ratio(monzo_list[i], subgroup)
ratio = monzo2ratio(monzo_list[i], subgroup)
comp = {2 * ratio.den, ratio.num}
comp = {2 * ratio.den, ratio.num}
true_size = monzo2cent(monzo_list[i], subgroup)
true_size = monzo2cent(monzo_list[i], subgroup)
approx_size = step_size * inner_product(val, monzo_list[i])
nearest_size = math.floor(true_size / step_size + 0.5)
nearest_size = math.floor(true_size / step_size + 0.5)
error_abs_direct = math.abs(nearest_size * step_size - true_size)
error_abs_direct = math.abs(nearest_size * step_size - true_size)
error_abs_val = math.abs(approx_size - true_size)
error_rel_direct = 100 * error_abs_direct / step_size
error_rel_direct = 100 * error_abs_direct / step_size
error_list_direct[i] =  
error_rel_val = 100 * error_abs_val / step_size
error_list[i] =  
{
{
ratio = ratio,  
ratio = ratio,  
comp = comp,  
comp = comp,  
error_abs_direct = error_abs_direct,
error_abs_direct = error_abs_direct,
error_abs_val = error_abs_val,
error_rel_direct = error_rel_direct,
error_rel_direct = error_rel_direct,
}
end
table.sort(error_list_direct, function(a, b) return a.error_abs_direct < b.error_abs_direct end)
return error_list_direct
end
local function find_error_val(val, subgroup, monzo_list)
local step_size = 1200/val[1]
local true_size
local approx_size
local error_list_val = {}
for i = 1, #monzo_list do
ratio = monzo2ratio(monzo_list[i], subgroup)
comp = {2 * ratio.den, ratio.num}
true_size = monzo2cent(monzo_list[i], subgroup)
approx_size = step_size * inner_product(val, monzo_list[i])
nearest_size = math.floor(true_size / step_size + 0.5)
error_abs_val = math.abs(approx_size - true_size)
error_rel_val = 100 * error_abs_val / step_size
error_list_val[i] =
{
ratio = ratio,
comp = comp,
error_abs_val = error_abs_val,
error_rel_val = error_rel_val
error_rel_val = error_rel_val
}
}
end
end
table.sort(error_list_val, 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_val
return error_list
end
end


Line 150: Line 130:
val[i] = utils._round_dec(steps*utils._log(subgroup[i], 2))
val[i] = utils._round_dec(steps*utils._log(subgroup[i], 2))
end
end
errlist_direct = find_error_direct(val, subgroup, monzo_list)
error_list = find_error(val, subgroup, monzo_list)
errlist_val = find_error_val(val, subgroup, monzo_list)
for i = 1, #error_list do
for i = 1, #errlist_val 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", errlist_val[i].ratio.num, errlist_val[i].ratio.den, 2 * errlist_val[i].ratio.den, errlist_val[i].ratio.num)
error_abs_val = string.format("%.3f", error_list[i].error_abs_val)
error_abs_val = string.format("%.3f", errlist_val[i].error_abs_val)
error_rel_val = string.format("%.1f", error_list[i].error_rel_val)
error_rel_val = string.format("%.1f", errlist_val[i].error_rel_val)
error_abs_direct = string.format("%.3f", error_list[i].error_abs_direct)
error_abs_direct = string.format("%.3f", errlist_direct[i].error_abs_direct)
error_rel_direct = string.format("%.1f", error_list[i].error_rel_direct)
error_rel_direct = string.format("%.1f", errlist_direct[i].error_rel_direct)
if bit32.band(error_list[i].ratio.den, error_list[i].ratio.den - 1) == 0 and is_in(error_list[i].ratio.num, subgroup) then -- check power of 2 for den and prime for num
if bit32.band(errlist_val[i].ratio.den, errlist_val[i].ratio.den - 1) == 0 and is_in(errlist_val[i].ratio.num, subgroup) 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 165: Line 144:
error_rel_direct = "'''" .. error_rel_direct .. "'''"
error_rel_direct = "'''" .. error_rel_direct .. "'''"
end
end
if errlist_val[i].error_rel_val > 50 then
if error_list[i].error_rel_val > 50 then
ratiocomp = "''" .. ratiocomp .. "''"
ratiocomp = "''" .. ratiocomp .. "''"
error_abs_val = "''" .. error_abs_val .. "''"
error_abs_val = "''" .. error_abs_val .. "''"