Module:Mediants: Difference between revisions

Ganaram inukshuk (talk | contribs)
Changed code to accept initial ratios in an array
Ganaram inukshuk (talk | contribs)
Simplify code
Line 10: Line 10:
local ratios = {}
local ratios = {}
local depths = {}
for i = 1, #init_ratios do
for i = 1, #init_ratios do
table.insert(ratios, init_ratios[i])
table.insert(ratios, init_ratios[i])
table.insert(depths, 0)
end
end
for i = 1, depth do
for i = 1, depth do
local new_ratios = {}
local new_ratios = {}
local new_depths = {}
for j = 1, #ratios - 1 do
for j = 1, #ratios - 1 do
Line 23: Line 26:
table.insert(new_ratios, ratio_1)
table.insert(new_ratios, ratio_1)
table.insert(new_ratios, mediant)
table.insert(new_ratios, mediant)
local depth_1 = depths[j]
local depth_2 = depths[j+1]
table.insert(new_depths, depth_1)
table.insert(new_depths, math.max(depth_1, depth_2) + 1)
end
end
table.insert(new_ratios, ratios[#ratios])
table.insert(new_ratios, ratios[#ratios])
table.insert(new_depths, depths[#depths])
ratios = new_ratios
ratios = new_ratios
depths = new_depths
end
end
return ratios
return ratios, depths
end
end


function p.int_limit_filter(ratios, ratio_1, ratio_2, int_limit)
-- Filter functions calculate whether a mediant is allowed to be added to the
-- running set of mediants, and are passed to the find-mediants-by-filter
-- function as a parameter, followed by its arg(s).
function p.int_limit_filter(ratio_1, ratio_2, int_limit)
local mediant = { ratio_1[1] + ratio_2[1], ratio_1[2] + ratio_2[2] }
local mediant = { ratio_1[1] + ratio_2[1], ratio_1[2] + ratio_2[2] }
local new_ratio_added = false
local int_max = math.max(mediant[1], mediant[2])
local int_max = math.max(mediant[1], mediant[2])


if int_max <= int_limit then
return int_max <= int_limit
new_ratio_added = true
table.insert(ratios, mediant)
end
return new_ratio_added
end
 
function p.num_den_sum_filter(ratios, ratio_1, ratio_2, max_sum)
local mediant = { ratio_1[1] + ratio_2[1], ratio_1[2] + ratio_2[2] }
local new_ratio_added = false
local num_den_sum = mediant[1] + mediant[2]
 
if num_den_sum <= max_sum then
new_ratio_added = true
table.insert(ratios, mediant)
end
return new_ratio_added
end
end


Line 63: Line 55:
local ratios = {}
local ratios = {}
local depths = {}
for i = 1, #init_ratios do
for i = 1, #init_ratios do
table.insert(ratios, init_ratios[i])
table.insert(ratios, init_ratios[i])
table.insert(depths, 0)
end
end
Line 71: Line 65:
new_ratios_added = false
new_ratios_added = false
local new_ratios = {}
local new_ratios = {}
local new_depths = {}
for i = 1, #ratios-1 do
for i = 1, #ratios-1 do
Line 76: Line 71:
local ratio_2 = ratios[i+1]
local ratio_2 = ratios[i+1]
table.insert(new_ratios, ratio_1)
table.insert(new_ratios, ratio_1)
new_ratios_added = filter(new_ratios, ratio_1, ratio_2, filter_arg)
if filter(ratio_1, ratio_2, filter_arg) then
local mediant = { ratio_1[1] + ratio_2[1], ratio_1[2] + ratio_2[2] }
table.insert(new_ratios, mediant)
new_ratios_added = true
end
end
end
table.insert(new_ratios, ratios[#ratios])
table.insert(new_depths, depths[#depths])
table.insert(new_ratios, ratios[#ratios])
ratios = new_ratios
ratios = new_ratios
depths = new_depths
end
end
return ratios
return ratios, depths
end
end


Line 88: Line 90:
local func = p.int_limit_filter
local func = p.int_limit_filter
local ratios = p.find_mediants_by_filter({{1,1}, {1,0}}, func, 12)
local ratios, depths = p.find_mediants_by_filter({{1,1}, {1,0}}, func, 12)
ratios = p.find_mediants_by_depth({{1,1}, {1,0}}, 5)
ratios = p.find_mediants_by_depth({{1,1}, {1,0}}, 6)
local generators = {}
local generators = {}
for i = 1, #ratios do
for i = 1, #ratios do