Commit aee2f518 authored by Celestin Mireux's avatar Celestin Mireux
Browse files

Pollard

parent fe565e01
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -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){
+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;
@@ -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;

@@ -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;
}