################################################################################
#
# Run a Seed and print:  N * 2^K  =  Seed * 3^L + D
#                        Ones    N / Seed = 3^L / 2^K + A
#
#   Seed    Starting value
#   N       First value under Seed
#   L       Run length;   number of odd transitions    (3*n + 1) / 2
#   K       ceiling( L ); number of even transitions   n / 2
#   D       For i = 1 to L; Sum 3^(L-i) * 2^Ki-1
#   A       N / Seed - 3^L / 2^K
#   Ones    Number of leading one bits in 3^L
#...............................................................................


import sys

if len(sys.argv) == 1:
   print("ERROR:  Expected an odd integer argument.")

elif len(sys.argv) > 2:
   print("ERROR:  Too many script arguments.")

else:
   if sys.argv[1][0] == '#':
      Seed = int((sys.argv[1])[1:], 16)

   else:
      Seed = int(sys.argv[1])

   if not isinstance(Seed, int):
      print(type( Seed ), "ERROR:  Expected an odd integer argument.")

   else:
      D = A = L = E = K = 0
      N = Seed

      while N >= Seed:
         # print( L, E, K, N, D )
         N  = 3*N + 1
         L += 1
         E  = 0
         D  = 3*D + (1 << K)

         while N & 1 == 0:
            N >>= 1
            K  += 1
            E  += 1

      print( " ", N, " * 2^", K, " = ", Seed, " * 3^", L, " + ", D, sep='' )

      A = 1 << (K - 2)
      Ones = 1

      while (3**L) & A:
         Ones += 1
         A   >>= 1

      A = (N / Seed) - (3**L / 2**K)
      print( " Ones =", Ones, "   N / Seed =", N/Seed, "= 3^L / 2^K +", A )
#
#..............................  length.seed.py  ...............................