Module:Rational: Difference between revisions
m eq() optimisation |
is_highly_composite() optimisation |
||
Line 394: | Line 394: | ||
return p.eq(a, 1) or p.eq(a, 4) or p.eq(a, 36) | return p.eq(a, 1) or p.eq(a, 4) or p.eq(a, 36) | ||
end | end | ||
-- now we actually check whether it is highly composite | -- now we actually check whether it is highly composite | ||
local n, _m = p.as_pair(a) | local n, _m = p.as_pair(a) | ||
-- precision is very important here | |||
local log2_n = 0 | |||
local t = 1 | |||
while t * 2 <= n do | |||
log2_n = log2_n + 1 | |||
t = t * 2 | |||
end | |||
local divisors = p.divisors(a) | local divisors = p.divisors(a) | ||
-- | local diagram_size = log2_n | ||
local diagram = {log2_n} | |||
if | local primes = {2} | ||
function eval_diagram(d) | |||
while #d > #primes do | |||
local i = primes[#primes] + 1 | |||
while not u.is_prime(i) do | |||
i = i + 1 | |||
end | |||
table.insert(primes, i) | |||
end | |||
local m = 1 | |||
for i = 1, #d do | |||
for j = 1, d[i] do | |||
m = m * primes[i] | |||
end | |||
end | |||
return m | |||
end | |||
-- iterate factorisations of some composite integers <n | |||
while diagram do | |||
while eval_diagram(diagram) >= n do | |||
-- reduce diagram size, preserve diagram width | |||
if diagram_size <= #diagram then | |||
diagram = nil | |||
break | |||
end | |||
diagram_size = diagram_size - 1 | |||
diagram[1] = diagram_size - #diagram + 1 | |||
for i = 2, #diagram do | |||
diagram[i] = 1 | |||
end | |||
end | |||
if diagram == nil then | |||
break | |||
end | |||
local diagram_divisors = 1 | |||
for i = 1, #diagram do | |||
diagram_divisors = diagram_divisors * (diagram[i] + 1) | |||
end | |||
if diagram_divisors >= divisors then | |||
return false | return false | ||
end | end | ||
diagram = u.next_young_diagram(diagram) | |||
end | end | ||
return true | return true |