From 66e261165cd3483067b62908c59c38e7d9c19fb6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Hatvani=20Tam=C3=A1s?= Date: Sun, 29 Mar 2026 16:41:04 +0200 Subject: [PATCH] extended euklidian algorithm --- main.c | 48 ++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 46 insertions(+), 2 deletions(-) diff --git a/main.c b/main.c index e5b8414..faa1e72 100644 --- a/main.c +++ b/main.c @@ -1,4 +1,5 @@ #include +#include #include #include #include @@ -28,7 +29,7 @@ uint64_t quick_pow(uint64_t *d_binary, uint64_t a, uint64_t n, uint64_t length) powed[0] = a; for (int i = 1; i <= length; i++) { powed[i] = (uint64_t)(((unsigned __int128)powed[i - 1] * powed[i - 1]) % n); - printf("powed: %ju, index: %d; ", powed[i], (i)); + // printf("powed: %ju, index: %d; ", powed[i], (i)); } // check where in the binary are ones @@ -39,7 +40,7 @@ uint64_t quick_pow(uint64_t *d_binary, uint64_t a, uint64_t n, uint64_t length) } } - printf("\nbm quick math: %ju; %ju ", multiplied, n); + // printf("\nbm quick math: %ju; %ju ", multiplied, n); free(powed); @@ -115,6 +116,46 @@ void *prime_thread_worker(void *arg) { return NULL; } +typedef struct { + uint64_t lnko; + __int128 x; + __int128 y; +} euklidian_result_t; + +euklidian_result_t euklidian_algorigthm_extended(unsigned __int128 a, unsigned __int128 b) { + __int128 r = a % b, q = a / b, k = 1, xk = 0, yk = 1, next_r; + __int128 prev_r = b, prev_q, prev_xk = 0, prev_yk = 1, prev_prev_xk = 1, prev_prev_yk = 0; + euklidian_result_t res = {0, 0, 0}; + + while (r != 0) { + k++; + + prev_q = q; + q = prev_r / r; + + next_r = prev_r % r; + prev_r = r; + r = next_r; + + xk = xk * prev_q + prev_prev_xk; + prev_prev_xk = prev_xk; + prev_xk = xk; + + yk = yk * prev_q + prev_prev_yk; + prev_prev_yk = prev_yk; + prev_yk = yk; + } + + __int128 x = k % 2 == 0 ? prev_xk : -prev_xk; + __int128 y = k % 2 == 0 ? -prev_yk : prev_yk; + + res.lnko = prev_r; + res.x = x; + res.y = y; + + return res; +} + int main() { srand(time(NULL)); @@ -145,5 +186,8 @@ int main() { e = rand64(); } while (e <= 1 && e >= fi_n && prime_test(e, base)); + euklidian_result_t test = euklidian_algorigthm_extended(192, 11); + printf("test lnko: %ju\n", test.lnko); + return 0; }