#!/usr/bin/env python ### clumpy_sequence.py -- Sequence of the clumpy heap # scanning across rows. from sys import argv, stderr from math import log ## S( i, r, h )--row r of clump of height >= h with root labeled i. # def S( i, r, h ): if r == 0: # the top node return [ i ] elif r >= h: # find appropriate h in infinite tree return S( i, r, 2*h ) elif r < h/2: # upper rows of the clump are an h/2 clump return S( i, r, h/2 ) else: # concatenation of rows of lower h/2 clumps result = [] for j in xrange( 1, 2**(h/2) + 1 ): # 1 <= j < 2**(h/2)-1 result += S( i + j * ( 2**(h/2) - 1 ), r - h/2, h/2 ) return result ## as a function of n -- n starting at 0, A082007( 0 ) == 0 # def A082007( n ): if n == 0: return 0 y = 2 ** int( log( n + 1, 2 ) ) yc = 2 ** 2 ** int( log( log( y, 2 ), 2 ) ) yr = y / yc return (yc-1) * int( (n+1-y)/yr + 1 ) + A082007( yr + (n+1)%yr - 1 ) A082007.base = 0 # n starting at 1, A082008( 1 ) == 1 def A082008( n ): if n == 1: return 1 y = 2 ** int( log( n, 2 ) ) yc = 2 ** 2 ** int( log( log( y, 2 ), 2 ) ) yr = y / yc return (yc-1) * int( (n-y) / yr + 1 ) + A082008( yr + n % yr ) A082008.base = 1 def map_seq( seq, f ): for x in seq: yield f( x ) def short_list( terms ): bigstring = str( terms.next() ) while True: s = "," + str( terms.next() ) if len(bigstring) + len(s) > 200: break bigstring += s print bigstring def b_file2( seq, base ): n = base for x in seq: print n, x n += 1 def main(): if len( argv ) < 2: short_list( map_seq( xrange(200), A082007 ) ) else: if argv[1] == "A082007": f = A082007 elif argv[1] == "A082008": f = A082008 else: print >>stderr, "usage: %s" % argv[0] print >>stderr, " or %s A082007" % argv[0] print >>stderr, " or %s A082008" % argv[0] return b_file2( map_seq( xrange( f.base, 65536+f.base ), f ), f.base ) main()