# --- 1. SETUP CONSTANTS --- # We need a Loop Limit (M) and a One (O) for counters. # We construct M using exponential doubling to save space. # Set O to 1 INCREASE O # Set M to 512 (2^9) to ensure we have enough loops for the sequence. # 1 -> 2 -> 4 -> 8 ... -> 512 INCREASE M REPEAT M TIMES (INCREASE M) REPEAT M TIMES (INCREASE M) REPEAT M TIMES (INCREASE M) REPEAT M TIMES (INCREASE M) REPEAT M TIMES (INCREASE M) REPEAT M TIMES (INCREASE M) REPEAT M TIMES (INCREASE M) REPEAT M TIMES (INCREASE M) REPEAT M TIMES (INCREASE M) # Set Flag F to 1. F controls if the program is "Running". # If F is 0, we stop doing work. CLEAR F INCREASE F # --- 2. MAIN LOOP --- # Repeats 512 times. Code inside only acts if F is 1. REPEAT M TIMES ( # --- STEP A: PRINT CURRENT X --- REPEAT F TIMES ( PRINT X ) # --- STEP B: CHECK IF X IS 1 --- # If X is 1, we are done. We must set F to 0. # Optimization: We check "Is X == 1" in O(X) time, not O(X^2). # S will be our "Is One" flag. Assume it is 1 initially. CLEAR S INCREASE S # H will be "Has Run Once". Start at 0. CLEAR H # Loop X times. # Iteration 1: H is 0. S stays 1. H becomes 1. # Iteration 2+: H is 1. S becomes 0. H stays 1. REPEAT X TIMES ( REPEAT H TIMES (CLEAR S) CLEAR H INCREASE H ) # If S is still 1, then X was 1. We clear the main run flag F. REPEAT S TIMES (CLEAR F) # --- STEP C: CALCULATE NEXT NUMBER --- # Only run if F is still 1 (meaning X was not 1) REPEAT F TIMES ( # Copy X to Y for calculation CLEAR Y REPEAT X TIMES (INCREASE Y) # Division by 2 and Modulo # Q = Quotient, R = Remainder (0 or 1), E = Even Flag (1 or 0) CLEAR Q CLEAR R CLEAR E INCREASE E # We iterate Y times (count up to X) REPEAT Y TIMES ( # If R is 1, we are completing a pair -> Increase Quotient REPEAT R TIMES (INCREASE Q) # Swap R and E (Toggle Even/Odd state) # T is a temp variable CLEAR T REPEAT R TIMES (INCREASE T) CLEAR R REPEAT E TIMES (INCREASE R) CLEAR E REPEAT T TIMES (INCREASE E) ) # --- STEP D: APPLY COLLATZ RULES --- CLEAR X # If Even (E=1): X = Q REPEAT E TIMES ( REPEAT Q TIMES (INCREASE X) ) # If Odd (R=1): X = 3Y + 1 REPEAT R TIMES ( REPEAT Y TIMES ( INCREASE X INCREASE X INCREASE X ) INCREASE X ) ) )