Ulam's Conjecture - Formula Eval Routine of the Month (and update)
06-12-2022, 05:37 PM (This post was last modified: 06-25-2022 05:20 AM by Ángel Martin.)
Post: #1
 Ángel Martin Senior Member Posts: 1,368 Joined: Dec 2013
Ulam's Conjecture - Formula Eval Routine of the Month (and update)
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:

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]

Attached File(s)