Loading src/bignum.c +6 −0 Original line number Diff line number Diff line Loading @@ -91,6 +91,12 @@ bignum_t bignum_pow(bignum_t x, bignum_t exp){ return z; } bignum_t bignum_gcd(bignum_t a, bignum_t b){ bignum_t g = bignum_zero(); mpz_gcd(*g, *a, *b); return g; } char* bignum_to_str(bignum_t x){ return mpz_get_str(NULL, 10, *x); } src/bignum.h +2 −0 Original line number Diff line number Diff line Loading @@ -24,5 +24,7 @@ bignum_t bignum_mod(bignum_t, bignum_t); bignum_t bignum_powm(bignum_t, bignum_t, bignum_t); bignum_t bignum_pow(bignum_t, bignum_t); bignum_t bignum_gcd(bignum_t, bignum_t); char* bignum_to_str(bignum_t); #endif src/list.c +1 −1 Original line number Diff line number Diff line Loading @@ -29,7 +29,7 @@ list_t list_tail(list_t l){ } void* list_pop(list_t* l){ if(list_is_empty(l)) if(list_is_empty(*l)) return NULL; list_t new_head = (*l)->next; void* res = (*l)->val; Loading tests/rho_pollard.c +42 −15 Original line number Diff line number Diff line #include <stdio.h> #include "bignum.h" unsigned long int gcd(unsigned long int a, unsigned long int b){ unsigned long int old_r, r = 1; if(a < b) return gcd(b,a); while(r != 0){ old_r = r; r = a % b; a = b; b = r; } return old_r; } 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 n5 = 366127 * 416797; unsigned long int n6 = 15651941 * 15485863; unsigned long int n5 = 366127l * 416797l; unsigned long int n6 = 15651941l * 15485863l; bignum_t n7, n8; bignum_t n7 = bignum_mul(bignum_sub(bignum_pow(bignum_from_int(2), bignum_from_int(127)), n7 = bignum_mul(bignum_sub(bignum_pow(bignum_from_int(2), bignum_from_int(127)), bignum_from_int(1)), bignum_sub(bignum_pow(bignum_from_int(2), bignum_from_int(61)), bignum_from_int(1))); bignum_t n8 = bignum_mul(bignum_sub(bignum_pow(bignum_from_int(2), bignum_from_int(607)), n8 = bignum_mul(bignum_sub(bignum_pow(bignum_from_int(2), bignum_from_int(607)), bignum_from_int(1)), bignum_sub(bignum_pow(bignum_from_int(2), bignum_from_int(2203)), bignum_from_int(1))); 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)))); return 0; } Loading
src/bignum.c +6 −0 Original line number Diff line number Diff line Loading @@ -91,6 +91,12 @@ bignum_t bignum_pow(bignum_t x, bignum_t exp){ return z; } bignum_t bignum_gcd(bignum_t a, bignum_t b){ bignum_t g = bignum_zero(); mpz_gcd(*g, *a, *b); return g; } char* bignum_to_str(bignum_t x){ return mpz_get_str(NULL, 10, *x); }
src/bignum.h +2 −0 Original line number Diff line number Diff line Loading @@ -24,5 +24,7 @@ bignum_t bignum_mod(bignum_t, bignum_t); bignum_t bignum_powm(bignum_t, bignum_t, bignum_t); bignum_t bignum_pow(bignum_t, bignum_t); bignum_t bignum_gcd(bignum_t, bignum_t); char* bignum_to_str(bignum_t); #endif
src/list.c +1 −1 Original line number Diff line number Diff line Loading @@ -29,7 +29,7 @@ list_t list_tail(list_t l){ } void* list_pop(list_t* l){ if(list_is_empty(l)) if(list_is_empty(*l)) return NULL; list_t new_head = (*l)->next; void* res = (*l)->val; Loading
tests/rho_pollard.c +42 −15 Original line number Diff line number Diff line #include <stdio.h> #include "bignum.h" unsigned long int gcd(unsigned long int a, unsigned long int b){ unsigned long int old_r, r = 1; if(a < b) return gcd(b,a); while(r != 0){ old_r = r; r = a % b; a = b; b = r; } return old_r; } 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 n5 = 366127 * 416797; unsigned long int n6 = 15651941 * 15485863; unsigned long int n5 = 366127l * 416797l; unsigned long int n6 = 15651941l * 15485863l; bignum_t n7, n8; bignum_t n7 = bignum_mul(bignum_sub(bignum_pow(bignum_from_int(2), bignum_from_int(127)), n7 = bignum_mul(bignum_sub(bignum_pow(bignum_from_int(2), bignum_from_int(127)), bignum_from_int(1)), bignum_sub(bignum_pow(bignum_from_int(2), bignum_from_int(61)), bignum_from_int(1))); bignum_t n8 = bignum_mul(bignum_sub(bignum_pow(bignum_from_int(2), bignum_from_int(607)), n8 = bignum_mul(bignum_sub(bignum_pow(bignum_from_int(2), bignum_from_int(607)), bignum_from_int(1)), bignum_sub(bignum_pow(bignum_from_int(2), bignum_from_int(2203)), bignum_from_int(1))); 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)))); return 0; }