# HP Forums

You're currently viewing a stripped down version of our content. View the full version with proper formatting.
Ulam spiral

64 63 62 61 60 59 58 57
37 36 35 34 33 32 31 56
38 17 16 15 14 13 30 55
39 18 05 04 03 12 29 54
40 19 06 01 02 11 28 53
41 20 07 08 09 10 27 52
42 21 22 23 24 25 26 51
43 44 45 46 47 48 49 50

Code:
``` 01 ENTER  02 ENTER  03 ENTER  04 4 05 * 06 2 07 - 08 √x 09 INTG 10 ENTER  11 + 12 + 13 5 14 + 15 x<>y 16 1 17 - 18 √x 19 FRAC 20 x=0 21 GTO 42 22 Rv 23 x<>y 24 4 25 * 26 3 27 - 28 √x 29 FRAC 30 x=0 31 GTO 42 32 Rv  33 x<>y 34 ENTER  35 + 36 8 37 + 38 x<>y 39 - 40 LASTx 41 GTO 00 42 Rv  43 ENTER  44 ENTER  45 2 46 - 47 GTO 00```

Examples:

22 R/S -> 45
x<>y -> 7

31 R/S -> 56
x<>y -> 58

n1 = 5 + n + 2*INT(√(4*n - 2)) (This formula from Don Shepherd’s recent article on the same subject).

For elements on the main diagonals, where either (n - 1) or (4*n - 3) are perfect squares,

n2 = n1 - 2

Otherwise

n2 = 2*n + 8 - n1

The central element, 1, has three non-trivial neighbors: 4, 6 and 8. The program will return 6 and 8.

Code-optimization is left as an exercise.

Edited to fix a typo in step 04.
Thanks Gerson. Yes, I knew my programs get a sqrt(neg number) error for n=1.
I just noticed something interesting. The two non-trivial neighbors of an odd number are always even numbers, and the two non-trivial neighbors of an even number are always odd numbers. The same is true of trivial neighbors, but that I would naturally expect. I suppose this is due to the natural structure of the spiral.
(01-25-2018 05:27 PM)Don Shepherd Wrote: [ -> ]Yes, I knew my programs get a sqrt(neg number) error for n=1.

Don, I did notice that error, but it was not my intention to fix it. I was just interested in knowing the formulas you have used. After analyzing the first few lines of your 12C program and getting the formula for the first non-trivial neighbor I got lazy and rather than trying to figure out the formula for the second one I decided to find a relationship between them. That was not hard, but probably a straightforward conversion of your program to RPL would have yielded better byte counts. Each of the following is 117.5 bytes long:

« DUP 5 + OVER 4 * 2 - √ IP DUP + + SWAP DUP 4 * 3 - √ FP OVER 1 - √ FP * NOT { DROP DUP 2 - } { 4 + DUP + OVER - } IFTE
»

« DUP 5 + OVER 4 * 2 - √ IP DUP + + 2 OVER - ROT DUP 4 * 3 - √ FP OVER 1 - √ FP * NOT { DROP NEG } { 3 + DUP + + } IFTE
»

« DUP 5 + OVER 4 * 2 - √ IP DUP + + DUP 2 - ROT DUP 4 * 3 - √ FP OVER 1 - √ FP * NOT { DROP } { 3 + DUP + SWAP - } IFTE
»
(01-27-2018 03:26 AM)Gerson W. Barbosa Wrote: [ -> ]
(01-25-2018 05:27 PM)Don Shepherd Wrote: [ -> ]Yes, I knew my programs get a sqrt(neg number) error for n=1.

Don, I did notice that error, but it was not my intention to fix it. I was just interested in knowing the formulas you have used. After analyzing the first few lines of your 12C program and getting the formula for the first non-trivial neighbor I got lazy and rather than trying to figure out the formula for the second one I decided to find a relationship between them. That was not hard, but probably a straightforward conversion of your program to RPL would have yielded better byte counts. Each of the following is 117.5 bytes long:

« DUP 5 + OVER 4 * 2 - √ IP DUP + + SWAP DUP 4 * 3 - √ FP OVER 1 - √ FP * NOT { DROP DUP 2 - } { 4 + DUP + OVER - } IFTE
»

« DUP 5 + OVER 4 * 2 - √ IP DUP + + 2 OVER - ROT DUP 4 * 3 - √ FP OVER 1 - √ FP * NOT { DROP NEG } { 3 + DUP + + } IFTE
»

« DUP 5 + OVER 4 * 2 - √ IP DUP + + DUP 2 - ROT DUP 4 * 3 - √ FP OVER 1 - √ FP * NOT { DROP } { 3 + DUP + SWAP - } IFTE
»
Thanks Gerson.

I continue to be amazed at what can be accomplished with RPL. You have my deepest respect.

Don
Reference URL's
• HP Forums: https://www.hpmuseum.org/forum/index.php
• :