mirror of
https://github.com/Asraelite/littlebigcomputer.git
synced 2025-07-17 16:16:51 +00:00
105 lines
1.5 KiB
Text
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
|