70 lines
1.9 KiB
Plaintext
70 lines
1.9 KiB
Plaintext
PRINT "Enter a positive integer"
|
|
INPUT N REM unit column
|
|
LET M = 0 REM 32766 column
|
|
LET C = 1 REM count
|
|
LET P = 1 REM print the sequence?
|
|
LET L = 1 REM finite state label
|
|
GOSUB 10
|
|
LET F = 1 REM current champion
|
|
LET E = 0 REM 32766 part of current champ
|
|
LET Y = 1 REM length of current longest sequence
|
|
LET P = 0 REM no more printing
|
|
LET W = 0 REM currently testing this number
|
|
LET V = 0 REM 32766 column of the number
|
|
PRINT "Testing for longest chain for n<100000..."
|
|
5 LET W = W + 1
|
|
REM PRINT V, " ", W
|
|
LET N = W
|
|
LET M = V
|
|
LET C = 1 REM reset count
|
|
IF W = 32766 THEN GOSUB 50
|
|
GOSUB 10
|
|
IF C > Y THEN GOSUB 60
|
|
IF V = 3 THEN IF W = 1702 THEN GOTO 8
|
|
GOTO 5
|
|
8 PRINT "The longest sequence starts at 32766x",E," + ",F
|
|
PRINT "And goes for ",Y," steps."
|
|
END
|
|
|
|
10 IF P = 1 THEN IF M > 0 THEN PRINT C," 32766x",M," + ",N
|
|
IF P = 1 THEN IF M = 0 THEN PRINT C," ",N
|
|
IF M = 0 THEN IF N = 1 THEN RETURN
|
|
LET C = C + 1
|
|
IF 2*(N/2)=N THEN GOTO 20
|
|
IF M > 10922 THEN GOTO 100
|
|
IF N > 21844 THEN GOTO 30
|
|
IF N > 10922 THEN GOTO 40
|
|
|
|
LET N = 3*N + 1
|
|
LET M = 3*M
|
|
GOTO 10
|
|
|
|
20 LET N = N/2
|
|
IF (M/2)*2<>M THEN LET N = N + 16383 REM account for integer truncation
|
|
LET M=M/2
|
|
GOTO 10
|
|
|
|
30 LET N = N - 21844 REM two ways of accounting for overflow
|
|
LET N = 3*N + 1
|
|
LET M = 3*M + 2
|
|
GOTO 10
|
|
|
|
40 LET N = N - 10922
|
|
LET N = 3*N + 1
|
|
LET M = 3*M + 1
|
|
GOTO 10
|
|
|
|
50 LET W = 0 REM addition with carry
|
|
LET V = V + 1
|
|
RETURN
|
|
|
|
60 LET Y = C REM tracking current champion
|
|
LET F = W
|
|
LET E = V
|
|
RETURN
|
|
|
|
100 PRINT "Uh oh, getting an overflow for 32766x",V," + ",W
|
|
PRINT "at step number ",C
|
|
PRINT "trying to triple 32766x",M," + ",N
|
|
RETURN
|