{ Start of file JugglerM.PAS ***********************************************} {$A+,B-,D+,E+,F-,I+,L+,N+,O-,R-,S+,V+} { Turbo Pascal Default options } {$I+} {System i/o error checks} {$N+} {Uses numeric coprocessor} {$R+} {index Range checking} {$V-} {no string length checking} {$M 65520, 0, 655360} {16384, 0, 655360 are defaults; $M 65520 max stack} program JugglerM; { Searches for a Juggler Sequence that does not fall to 1. Also saves to disk n and max x each time an n produces a max x larger than max x for any starting x less than n. } { Juggler Sequence defined in Nov 1990 issue of Algorithm in PERSONAL PROGRAMS by Clifford A. Pickover. } uses Crt, { Turbo Pascal 5.5 interface } MultiID; { Multiple-precision integer decimal algorithms unit} const Name = 'JugglerM - Searches for a Juggler Sequence that does not fall to 1'; Version = 'Version 1.00, last revised: 90/12/27, 0700 hours'; Author = 'Copyright (c) 1981-1990 by author: Harry J. Smith,'; Address = '19628 Via Monte Dr., Saratoga, CA 95070. All rights reserved.'; {***************************************************************************} { Developed in TURBO Pascal 5.5 } { Pickover's definition of a juggler sequence: input positive integer, x repeat if x is even then x <-- [x^(1/2)] else x <-- [x^(3/2)] until x=1 This program by Harry J. Smith tries to find a starting number, n, that does not fall to 1. As a byproduct it outputs n and max x each time an n produces a max x larger than max x for any starting x less than n n <- 1, Max <- 0, NewMax <- False repeat n <- n + 2, x <- n, WriteLn( Screen, 'n = ', n) repeat if x is odd then x <- x * x * x x <- [Sqrt(x)] if x > Max then Max <- x, NewMax <- True until x <= n if NewMax then WriteLn( File, n, ': ', Max), NewMax <- False until x = n WriteLn( File, n, ' Repeats forever ******') Format of output to disk: x_zero: Max_x (digits in Max_x) 113: 20,29245,88924,12533,94245,50328 (27) ... 30817: 11705,...,77326 (45391) Format of output to screen: n=9 UUDUD L=6 } var I : Integer; { Utility index } Ch : Char; { Character input by ReadKey } St : String[128];{ String for starting number input from keyboard } FileSt: String[12]; { Output file name } Disk : Text; { Text file } Size : LongInt; { Size of max x in MultiID super digits } Up : LongInt; { Number of times x was odd except x zero } Down : LongInt; { Number of times x was even except last x } n : ^MultiSI; { Starting x, x zero } x : ^MultiSI; { Current value of x } x2 : ^MultiSI; { Current x squared } x3 : ^MultiSI; { Current x cubed } Max : ^MultiSI; { Max value of x found so far } nMax : ^MultiSI; { Value of n for this Max x } P : ^MultiSI; { Power used to input large n = b ^ P } One : ^MultiSI; { One in MultiSI format } L : LongInt; { Length of sequence } NewMax: Boolean; { True if a new max x found for this n } Done : Boolean; { True if Max x repeats for same n } LSD : LongInt; { Least significant super digit } {--------------------------------------} procedure Init; { Initialize program } begin TextBackground( Blue); TextColor( Yellow); ClrScr; WriteLn; WriteLn( Name); WriteLn( Version); WriteLn( Author); WriteLn( Address); WriteLn; FileSt:= 'JugglerM.Out'; WriteLn( 'Will write file: ', FileSt, ' containing Max_x > all previous Max_x'); WriteLn; MultiIDV.Init( 1); { Init Multiple-precision integer decimal algorithms } MuLenD:= 21; MuErrRep:= True; New( One, Init(1)); One^.SetTo1( 1); New( P, Init(1)); Size:= (3 * (Memavail - 175)) div (20 * 4); { Use all but 100 bytes, heap } if (2 * Size > MuNMax) then Size:= MuNMax div 2; { MuNMax = 16379 } WriteLn( 'MemAvail=', MemAvail); WriteLn; WriteLn( 'Max_x limited to ', MuDMax * Size, ' decimal digits, (57323 digits is max)'); New( n, Init( 2 * Size div 3)); WriteLn; WriteLn( 'Input starting number, x zero (Try 10^255, ENTER => 1):'); ReadLn( St); While (Length( St) > 0) and (St[1] = ' ') do Delete( St, 1, 1); if Length( St) = 0 then St:= '1'; n^.Value( St, I); { Convert String to n, returns I = # of character used } Delete( St, 1, I); While (Length( St) > 0) and (St[1] = ' ') do Delete( St, 1, 1); if (Length( St) > 1) and (St[1] = '^') then begin Delete( St, 1, 1); While (Length( St) > 0) and (St[1] = ' ') do Delete( St, 1, 1); P^.Value( St, I); n^.RPowMB( P^); end; if (n^.Comp( One^) < 0) then n^.SetTo1(1); MuErr:= False; MuAbort:= False; Write( 'Input = '); n^.WritLn( Output); New( nMax, Init( 2 * Size div 3)); New( x, Init( Size)); New( x2, Init( 4 * Size div 3)); New( x3, Init( 2 * Size)); New( Max, Init( Size)); Max^.Clear; NewMax:= False; Done:= False; WriteLn; WriteLn( 'MemAvail=', MemAvail); WriteLn( 'Type any key to continue... (or Esc to quit)'); Ch:= ReadKey; if Ord( Ch) = 27 then Halt(0); end; { Init } {--------------------------------------} begin { Main program, JugglerM } Init; Assign( Disk, FileSt); Rewrite( Disk); WriteLn; WriteLn( Disk, 'Juggler Sequences with Max_x > all previous Max_x (JugglerM)'); WriteLn( Disk); WriteLn( Disk, 'x_zero: Max_x (digits in Max_x)'); WriteLn( Disk); if (n^.Comp( One^) = 0) then begin WriteLn('n=1 U L=1'); WriteLn( Disk, '1: 1 (1)'); WriteLn( Disk); end; x^.SetTo1( 3); if (n^.Comp( x^) < 0) then begin WriteLn('n=2 D L=2'); WriteLn( Disk, '2: 2 (1)'); WriteLn( Disk); n^.SetTo1( 3); end; LSD:= Round( n^.V^[0]); if (LSD mod 2) = 0 then n^.RAdd1( 1); n^.RAdd1( -2); repeat n^.RAdd1( 2); x^.SetTo( n^); Up:= 0; Down:= 0; Write( 'n='); n^.Writ( Output); Write(' '); repeat LSD:= Round( x^.V^[0]); if (LSD mod 2) = 1 then begin Inc( Up); Write('U'); Tracn:= Down; Trace:= Up; x2^.Sq( x^); x3^.Mul( x^, x2^); x^.SqRtRem( x3^, x3^); end else begin Inc( Down); Write('D'); Tracn:= Down; Trace:= Up; x^.SqRtRem( x^, x3^); end; if (x^.Comp( Max^) >= 0) then begin if (x^.Comp( Max^) = 0) and (n^.Comp( nMax^) = 0) then begin Done:= True; end; if (x^.Comp( Max^) > 0) then begin Max^.SetTo( x^); NewMax:= True; nMax^.SetTo( n^); end; end; until (x^.Comp( n^) <= 0) or Done or MuErr or MuAbort; if NewMax then begin n^.Writ( Disk); Write( Disk, ': '); MuLenD:= 0; Max^.ShortWrLn( Disk, 100); MuLenD:= 21; WriteLn( Disk); NewMax:= False; end; L:= Up + Down + 1; if (x^.Comp( n^) = 0) then L:= 1; WriteLn(' L=', L); until (x^.Comp( n^) = 0) or Done or MuErr or MuAbort; n^.Writ( Disk); Write( Disk, ': '); if MuErr then WriteLn( Disk, 'Numbers got too big for memory') else if MuAbort then WriteLn( Disk, 'Run aborted by operator') else WriteLn( Disk, 'Repeats forever ******'); Close( Disk); Ch:= ReadKey; end. { JugglerM } { End of file JugglerM.PAS *************************************************}