Commit 92b11924 authored by Matthieu Dien's avatar Matthieu Dien
Browse files

Adding gcd for unsigned long int and bignum_t

parent a858a4f7
Loading
Loading
Loading
Loading
+6 −0
Original line number Diff line number Diff line
@@ -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);
}
+2 −0
Original line number Diff line number Diff line
@@ -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
+1 −1
Original line number Diff line number Diff line
@@ -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;
+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;
}