"collatz problem func"

This commit is contained in:
Bedir Tuğra Karaabalı 2025-08-26 06:11:33 +03:00
commit 0a1d4fbb2e
5 changed files with 49 additions and 0 deletions

3
.gitignore vendored Normal file
View File

@ -0,0 +1,3 @@
-test
test
main

0
README.md Normal file
View File

35
collatz.S Normal file
View File

@ -0,0 +1,35 @@
# bedir t karaabalı
# 2025
# collatz problem
.text
# void collatz_len_and_peek(uint64_t x, uint64_t *steps, uint64_t *peek)
.global collatz_len_and_peek
collatz_len_and_peek:
# Collatz problem implementation
# x -> rdi, steps -> rsi, peak -> rdx
movq $0, (%rsi) # *steps=0
movq %rdi, (%rdx) # *peak = x
movq %rdi, %r8 # r8(n) (caller-saved) = x
.loop:
cmpq $1, %r8 # while (n != 1)
je .done
testq $1, %r8 # 1 and n
jz .even
# odd case
leaq (%r8, %r8, 2), %r8 # n *= 3 -> lea base + index * scale
addq $1,%r8 # n += 1
jmp .next_step
.even:
shrq $1, %r8 # n /= 2
.next_step:
cmpq (%rdx), %r8 # if (n > *peek) n - *peek
jle .next
movq %r8, (%rdx) # *peek = n
.next:
addq $1, (%rsi) # (*steps)++
jmp .loop
.done:
ret

BIN
collatz.o Normal file

Binary file not shown.

11
main.c Normal file
View File

@ -0,0 +1,11 @@
#include <stdint.h>
#include <stdio.h>
void collatz_len_and_peek(uint64_t x, uint64_t *steps, uint64_t *peek);
int main() {
uint64_t steps, peak;
collatz_len_and_peek(13, &steps, &peak);
printf("steps=%lu, peak=%lu\n", steps, peak);
return 0;
}