littlebigcomputer/programs/parva/pythagorean_triples_1.lbpasm
2023-10-30 17:50:05 +01:00

105 lines
1.5 KiB
Text

; calculate all primitive pythogorean triples (a^2 + b^2 = c^2) where c <= 32
nop
b _start
results:
.repeat 0 15
table:
.repeat 0 33
result_index:
.data 0
_start:
li x7, 32 ; limit
li x0, 1 ; prime
li x2, 1 ; prime factor bit
slli x2, x2, 23
loop_prime:
addi x0, x0, 1
bgt x0, x7, squares
lw x4, table(x0)
srli x4, x4, 12
bnez x4, loop_prime
mv x3, x0 ; multiple
loop_index:
lw x4, table(x3) ; x4 = current prime factor bits
or x4, x4, x2 ; x4 |= add current prime factor bit
sw x4, table(x3)
add x3, x3, x0
ble x3, x7, loop_index
srli x2, x2, 1 ; update prime bit
b loop_prime
squares:
li x0, 0 ; n
li x1, 0 ; n^2
loop_squares:
lw x4, table(x0) ; 70
or x4, x4, x1
sw x4, table(x0)
add x1, x1, x0
add x1, x1, x0
addi x1, x1, 1
addi x0, x0, 1
ble x0, x7, loop_squares
li x0, 1 ; a = 1
iterate_a:
addi x0, x0, 1 ; 79
bgt x0, x7, end
lw x2, table(x0) ; a^2 (with prime bits)
mv x6, x0 ; b = a
iterate_b:
addi x6, x6, 1 ; 83
bgt x6, x7, iterate_a
lw x3, table(x6) ; b^2 (with prime bits)
and x4, x2, x3 ; check if a and b are coprime
srli x4, x4, 12
bnez x4, iterate_b ; 87
add x3, x2, x3
andi x3, x3, 0o77 ; a^2 + b^2
mv x5, x6 ; x5 = c = b
; x0 = a, x1 = sp, x2 = a^2, x3 = a^2+b^2, x4 = (unused)
; x5 = c, x6 = b, x7 = limit
iterate_c:
addi x5, x5, 1 ; c++ ; 92
bgt x5, x7, iterate_b
lw x4, table(x5) ; x4 = c^2|cp
andi x4, x4, 0o77 ; x4 = c^2
bgt x4, x3, iterate_b
bne x5, x3, iterate_c
; found triple
; x0 = a, x6 = b, x5 = c
lw x4, result_index
sw x0, 0(x4)
sw x6, 1(x4)
sw x5, 2(x4)
addi x4, x4, 3
sw x4, result_index
b iterate_a
end:
wfi