scope # Jugglar sequences - starting with a[0] = n, a[k+1] = floor(sqrt(a[k])) if a[k] is even # = floor(sqrt(a[k]))*a[k] otherwise import mapm; # explicit import needed for: Linux, Mac OS X, Windows and Solaris mapm.xdigits( 10_000 ); # enough digits for the first few stretch sequences local constant b0, constant b1 := mapm.xnumber( 0 ), mapm.xnumber( 1 ); # for a[0] = a0, returns the number of terms required to reach a[n] = 1, # the maximum value of the sequence before it reaches 1 # and the index at which the maximum was first reached local proc jugglarStatistics( a0 :: number ) :: table local ak, amax, aindex, mindex := mapm.xnumber( a0 ), b0, 0, 0; while ak <> b1 do if amax < ak then amax, mindex := ak, aindex fi; aindex +:= 1; local constant rootAk := mapm.xsqrt( ak ); ak := mapm.xfloor( if mapm.xisodd( ak ) then rootAk * ak else rootAk fi ) od; return [ "a0" ~ a0, "length" ~ aindex, "max" ~ amax, "maxIndex" ~ mindex ] end; # returns a string representation of the integer portion of n if it is an xnumber, # or n if it is a string or tostring( n ) otherwise local proc bToIntegerString( n ) :: string if typeof n = "string" then return n elif typeof n = "xnumber" then local constant str := mapm.xtostring( n ) local constant point := "." in str return if point <> null then str[ 1 to point - 1 ] else str fi else return tostring( n ) fi end; local proc printJugglarStatistics( jStats :: table ) local maxString := bToIntegerString( jStats.max ); if size maxString > 32 then maxString := tostring( size maxString ) & " digits" fi; printf( "%6.0f%10.0f%10.0f %s\n", jStats.a0, jStats.length, jStats.maxIndex, maxString ); end; scope print( " n l[n] i[n] h[n]" ); print( "=====================================================================" ); for a0 from 20 to 39 do printJugglarStatistics( jugglarStatistics( a0 ) ) od; for a0 in seq( 113, 173, 193, 2183 ) do printJugglarStatistics( jugglarStatistics( a0 ) ) od end end