<script>
big=Math.pow(2,53)
toobig=false
function hcf(p,q){
var u=Math.max(p,q)
var v=Math.min(p,q)
while(1){
h=v
v=u%v
if(!v)break
u=h
}
return h
}
function lcm(p,q){
var wk=Math.min(p,q)/hcf(p,q)
if(big/wk>=Math.max(p,q))return Math.max(p,q)*wk
return 0
}
function cpy(u){
if(!(u instanceof Array)){if(typeof(u)!='object')return u;wobbler()}
var r=[]
for(var i in u){
r[i]=cpy(u[i])
}
return r
}
function part(n){
if(!('done' in this))done=[]
if(n in done)return cpy(done[n])
var max=[n]
max.v=n
for(var i=n-1;i>=1;i--){
var rest=n-i
rest=part(rest)
if(rest)rest.v=lcm(i,rest.v)
if(!(rest&&rest.v)){toobig=true;return null}
if(rest.v>max.v){
max.v=rest.v
max.length=0
var mx=0
var idone=0
for(var j=0;j<rest.length;j++){
if(!idone&&i>=rest[j]){
max[mx]=i
mx++
idone=1
}
if(i!=rest[j]){
max[mx]=rest[j]
mx++
}
}
if(!idone)max[mx]=i
}
}
done[n]=cpy(max)
return max
}
function doit(n,testlim,parm){
if(!parm)parm=[100,10000]
var pglim=parm[0]?parm[0]:100
var gap=parm[1]?parm[1]:10000
if(!testlim)testlim=n
var upper=n-(n%pglim)+pglim
if(!('upto' in this))upto=document.getElementById('upto')
if(!('blurb' in this))blurb=document.getElementById('blurb')
var show=[]
sp=' ';sp+=sp;sp+=sp;
for(;n<Math.min(upper,testlim+1);n++){
var maxpart=part(n)
if(toobig){show[show.length]='<br>accuracy limit exceeded - terminating';break}
show[show.length]=n+sp+maxpart.v+sp+'('+maxpart+')'
}
upto.innerHTML=n
blurb.innerHTML=(n>pglim?'...<br>':'')+show.join('<br>')+(n<testlim?'<br>...':'')
if(n<testlim&&!toobig)setTimeout('doit('+(n+1)+','+testlim+','+gap+')',gap)
}
</script>
<body onload="doit(1,1000000,[1000,1])">
<div>up to:</div>
<div id=upto></div>
<div>===========<br>n max_order max_cycle</div>
<div id=blurb></div>