06-12-2022, 05:37 PM
Greetings, while writing this "routine of the month" I stumbled onto a bug in the functions DO-WHILE - duly corrected in the attached ROM/MOD zip.
ULAM's Conjecture
Many versions exist (even one in MCODE) but this one is unique given the instructions used, showcasing the "higher level" programming this module is capable of - take a look at the program listing and you'll see what I mean , then take it for a spin:
Just enter the starting value and XEQ "ULAM$"
The program enumerates all intermediate values of the path down to 4-2-1, then shows the number of steps (which is also left in Y)
Example: The sequence for n = 27 takes 111 steps, climbing as high as 9232 before descending to 1.
27, 82, 41, 124, 62, 31, 94, 47, 142, 71, 214, 107, 322, 161, 484, 242, 121, 364, 182, 91, 274, 137, 412, 206, 103, 310, 155, 466, 233, 700, 350, 175, 526, 263, 790, 395, 1186, 593, 1780, 890, 445, 1336, 668, 334, 167, 502, 251, 754, 377, 1132, 566, 283, 850, 425, 1276, 638, 319, 958, 479, 1438, 719, 2158, 1079, 3238, 1619, 4858, 2429, 7288, 3644, 1822, 911, 2734, 1367, 4102, 2051, 6154, 3077, 9232, 4616, 2308, 1154, 577, 1732, 866, 433, 1300, 650, 325, 976, 488, 244, 122, 61, 184, 92, 46, 23, 70, 35, 106, 53, 160, 80, 40, 20, 10, 5, 16, 8, 4, 2, 1
PS. See below the MCODE listing that does the same job:-
ULAM's Conjecture
Many versions exist (even one in MCODE) but this one is unique given the instructions used, showcasing the "higher level" programming this module is capable of - take a look at the program listing and you'll see what I mean , then take it for a spin:
Code:
1 LBL "ULAM$"
2 "X=0"
3 IF
4 RTN
5 ENDIF
6 "0"
7 EVALY
8 "ABS(IP(X))"
9 EVAL$
10 DO
11 "(X&2)=0" ; MOD(x,2)
12 IF
13 "X/2" ; x was even
14 ELSE
15 "3*X+1" ; x was odd
16 ENDIF
17 EVAL$
18 VIEW X
19 "Y+1"
20 EVALY ; increase count in Y
21 "X#1"
22 WHILE ; repeat until "1"
23 VIEW Y ; show number of steps
24 END
Just enter the starting value and XEQ "ULAM$"
The program enumerates all intermediate values of the path down to 4-2-1, then shows the number of steps (which is also left in Y)
Example: The sequence for n = 27 takes 111 steps, climbing as high as 9232 before descending to 1.
27, 82, 41, 124, 62, 31, 94, 47, 142, 71, 214, 107, 322, 161, 484, 242, 121, 364, 182, 91, 274, 137, 412, 206, 103, 310, 155, 466, 233, 700, 350, 175, 526, 263, 790, 395, 1186, 593, 1780, 890, 445, 1336, 668, 334, 167, 502, 251, 754, 377, 1132, 566, 283, 850, 425, 1276, 638, 319, 958, 479, 1438, 719, 2158, 1079, 3238, 1619, 4858, 2429, 7288, 3644, 1822, 911, 2734, 1367, 4102, 2051, 6154, 3077, 9232, 4616, 2308, 1154, 577, 1732, 866, 433, 1300, 650, 325, 976, 488, 244, 122, 61, 184, 92, 46, 23, 70, 35, 106, 53, 160, 80, 40, 20, 10, 5, 16, 8, 4, 2, 1
PS. See below the MCODE listing that does the same job:-
Code:
0CD "M"
041 "A"
04C "L"
055 "U"
0F8 READ 3(X)
128 WRIT 4(L)
149 ?NC XQ Integer & Positive
134 ->4D52 [CHKZI]
268 WRIT 9(Q)
04E C=0 ALL
0E8 WRIT 3(X) reset the counter
00E A=0 ALL
35C PT= 12 Builds "1" in A
162 A=A+1 @PT
278 READ 9(Q)
36E ?A#C ALL end of the path?
3A0 ?NC RTN yes, end here.
0F8 READ 3(X)
2A0 SETDEC
01D ?NC XQ increase counter
060 ->1807 [AD2_10]
0E8 WRIT 3(X) update value
278 READ 9(Q) get current n
3CD ?NC XQ C= MOD[int(C),2]
100 ->40F3 [MOD2]
2EE ?C#0 ALL it is odd?
02F JC +05 yes, skip
278 READ 9(Q)
3CD ?NC XQ {A,B} = {C} /2
13C ->4FF3 [DIVTWO]
053 JNC +10d show result
04E C=0 ALL
35C PT= 12
0D0 LD@PT- 3
10E A=C ALL
278 READ 9(Q)
135 ?NC XQ 3*n
060 ->184D [MP2_10]
001 ?NC XQ 3*n+1
060 ->1800 [ADDONE]
268 WRIT 9(Q)
099 ?NC XQ Sends C to display - sets HEX
02C ->0B26 [DSPCRG]
1FD ?NC XQ wait a little - CL compatible
12C ->4B7F [WAIT4L] - Enables RAM
1FD ?NC XQ wait a little - CL compatible
12C ->4B7F [WAIT4L] - Enables RAM
2E3 JNC -36d [LOOP1]