[seqfan] Re: A122036
Richard Mathar
mathar at strw.leidenuniv.nl
Mon Mar 28 15:37:18 CEST 2011
This is the Maple function that checks entries in A122036;
hastily commented, hazardous if swallowed with an empty stomach etc:
# This function checks whether the argument n is a member of A005231
# it is if the sigma function of the argument is larger than 2n.
isA005231 := proc(n)
is(numtheory[sigma](n) > 2*n );
end proc:
# recursive function which tests whether n can be written as a sum
# over a subset of elements of the set s
isA136446a := proc(s, n)
if n in s then
# if n is a member of s, the answer is yes (just take n)
return true;
elif add(i, i=s) < n then
# if the sum over all elements of s is smaller than n,
# the answer is no
return false;
elif nops(s) = 1 then
# if there is exactly one element in s, the answer is yes
# if that element equals n, otherwise the anise is no
is(op(1, s)=n) ;
else
# Put the set s in a sorted state
sl := sort(convert(s, list), `>`) ;
for i from 1 to nops(sl) do
# assume that the maximum element of the subset that adds to n
# is m and take m in decreasing order from the sorted list.
m := op(i, sl) ;
if n -m = 0 then return
# if taking m exactly matches n, the answer is yes
# (this is probably redundant as a check, see above)
true;
end if ;
# If that largest m in the subset is not larger than n,
# try to find other elements to complete n
if n-m > 0 then
# the recursive call: define the subset of elements
# which are each smaller than n
sr := [op(i+1..nops(sl), sl)] ;
# .. and test whether (assuming m is taken) the remainder n-m
# can be matched by another subset
if procname(convert(sr, set), n-m) then
return true;
end if;
end if;
end do;
return false;
end if;
end proc:
# test whether the argument n is a member o fA136446
# return true if yes
isA136446 := proc(n)
# this is done by taking the set of divisors without 1 and n,
# testing whether n can be written as a sum of a subset of these
isA136446a( numtheory[divisors](n) minus {1, n}, n) ;
end proc:
# Main loop over all odd n
for n from 1 by 2 do
#if n is in A005231 then check whether it is in A136446
if isA005231(n) then
if not isA136446(n) then
printf("%d,\n",n) ;
end if;
end if;
# print progress bars
if n mod 150000 = 1 then
printf("%d,...\n",n);
end if;
end do:
More information about the SeqFan
mailing list