Loading src/hash_tbl.c +1 −1 Original line number Diff line number Diff line Loading @@ -22,7 +22,7 @@ hash_tbl htbl_empty(size_t (*h)(void*), int htbl_add(hash_tbl htbl, void* x){ } int htbl_in(hash_tbl htbl, void* x){ void * htbl_in(hash_tbl htbl, void* x){ } void htbl_destroy(hash_tbl htbl){ Loading tests/rho_pollard.c +50 −6 Original line number Diff line number Diff line #include <stdio.h> #include <stdlib.h> #include <math.h> #include "bignum.h" #include "../src/list.h" unsigned long int gcd(unsigned long int a, unsigned long int b){ unsigned long int old_r, r = 1; unsigned long int old_r, r = 1l; if(a < b) return gcd(b,a); while(r != 0){ while(r != 0l){ old_r = r; r = a % b; a = b; Loading @@ -16,13 +19,52 @@ unsigned long int gcd(unsigned long int a, unsigned long int b){ return old_r; } unsigned long int f(unsigned long int x) { return x*x + 1l; } unsigned long int Pollard(unsigned long int n) { list_t l = NULL; unsigned long int xj = 2l; unsigned long int * x = malloc(sizeof(unsigned long int)); unsigned long int xi = f(xj) % n; *x = xi; list_push(l, &xj); list_t head = l; while(gcd(xi-xj, n) == 1l) { if (list_is_empty(l)) { l = list_push(head, x); head = l; x = malloc(sizeof(unsigned long int)); xi = f(xi) % n; *x = xi; xj = (unsigned long int)l->val; } else { xj = (unsigned long int)l->val; l = l->next; } } return gcd(xi-xj, n); } unsigned long int Floyd(unsigned long int n) { unsigned long int a = f(0) % n; unsigned long int b = f(a) % n; while(gcd(a-b, n) == 1l) { a = f(a) % n; b = f(f(b)) % n; } return gcd(a-b, n); } int main() { // En utilisant l'algorithme rho de Pollard, factorisez les entiers suivants unsigned long int n1 = 17 * 113; unsigned long int n2 = 239 * 431; unsigned long int n3 = 3469 * 4363; unsigned long int n4 = 15241 * 18119; unsigned long int n1 = 17l * 113l; unsigned long int n2 = 239l * 431l; unsigned long int n3 = 3469l * 4363l; unsigned long int n4 = 15241l * 18119l; unsigned long int n5 = 366127l * 416797l; unsigned long int n6 = 15651941l * 15485863l; Loading @@ -42,6 +84,8 @@ int main() { printf("PGCD(42,24) = %lu\n", gcd(42,24)); printf("PGCD(42,24) = %s\n", bignum_to_str(bignum_gcd(bignum_from_int(42),bignum_from_int(24)))); printf("Pollard(n2) = %lu\n", Pollard(n2)); printf("Floyd(n1) = %lu\n", Floyd(n1)); return 0; } Loading
src/hash_tbl.c +1 −1 Original line number Diff line number Diff line Loading @@ -22,7 +22,7 @@ hash_tbl htbl_empty(size_t (*h)(void*), int htbl_add(hash_tbl htbl, void* x){ } int htbl_in(hash_tbl htbl, void* x){ void * htbl_in(hash_tbl htbl, void* x){ } void htbl_destroy(hash_tbl htbl){ Loading
tests/rho_pollard.c +50 −6 Original line number Diff line number Diff line #include <stdio.h> #include <stdlib.h> #include <math.h> #include "bignum.h" #include "../src/list.h" unsigned long int gcd(unsigned long int a, unsigned long int b){ unsigned long int old_r, r = 1; unsigned long int old_r, r = 1l; if(a < b) return gcd(b,a); while(r != 0){ while(r != 0l){ old_r = r; r = a % b; a = b; Loading @@ -16,13 +19,52 @@ unsigned long int gcd(unsigned long int a, unsigned long int b){ return old_r; } unsigned long int f(unsigned long int x) { return x*x + 1l; } unsigned long int Pollard(unsigned long int n) { list_t l = NULL; unsigned long int xj = 2l; unsigned long int * x = malloc(sizeof(unsigned long int)); unsigned long int xi = f(xj) % n; *x = xi; list_push(l, &xj); list_t head = l; while(gcd(xi-xj, n) == 1l) { if (list_is_empty(l)) { l = list_push(head, x); head = l; x = malloc(sizeof(unsigned long int)); xi = f(xi) % n; *x = xi; xj = (unsigned long int)l->val; } else { xj = (unsigned long int)l->val; l = l->next; } } return gcd(xi-xj, n); } unsigned long int Floyd(unsigned long int n) { unsigned long int a = f(0) % n; unsigned long int b = f(a) % n; while(gcd(a-b, n) == 1l) { a = f(a) % n; b = f(f(b)) % n; } return gcd(a-b, n); } int main() { // En utilisant l'algorithme rho de Pollard, factorisez les entiers suivants unsigned long int n1 = 17 * 113; unsigned long int n2 = 239 * 431; unsigned long int n3 = 3469 * 4363; unsigned long int n4 = 15241 * 18119; unsigned long int n1 = 17l * 113l; unsigned long int n2 = 239l * 431l; unsigned long int n3 = 3469l * 4363l; unsigned long int n4 = 15241l * 18119l; unsigned long int n5 = 366127l * 416797l; unsigned long int n6 = 15651941l * 15485863l; Loading @@ -42,6 +84,8 @@ int main() { printf("PGCD(42,24) = %lu\n", gcd(42,24)); printf("PGCD(42,24) = %s\n", bignum_to_str(bignum_gcd(bignum_from_int(42),bignum_from_int(24)))); printf("Pollard(n2) = %lu\n", Pollard(n2)); printf("Floyd(n1) = %lu\n", Floyd(n1)); return 0; }