HP Forums
Ulam's Conjecture - Formula Eval Routine of the Month (and update) - Printable Version

+- HP Forums (https://www.hpmuseum.org/forum)
+-- Forum: HP Software Libraries (/forum-10.html)
+--- Forum: HP-41C Software Library (/forum-11.html)
+--- Thread: Ulam's Conjecture - Formula Eval Routine of the Month (and update) (/thread-18466.html)



Ulam's Conjecture - Formula Eval Routine of the Month (and update) - Ángel Martin - 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:

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]