Exemple #1
0
// MCA: BinaryGCD
int integer_gcd(integer_t gcd, integer_t a, integer_t b) {
  integer_t u, v;
  size_t a0, b0, z;

  u = integer_create(0);
  v = gcd;

  a0 = integer_get_trailing_zeros(a);
  b0 = integer_get_trailing_zeros(b);
  z = MIN(a0, b0);

  VERIFY(integer_divide_power_of_two(u, a, a0));
  VERIFY(integer_divide_power_of_two(v, b, b0));

  VERIFY(integer_absolute_value(u, u));
  VERIFY(integer_absolute_value(v, v));

  while(!integers_are_equal(u, v)) {
    if(-1 == integer_compare(u, v)) { SWAP(u, v); }
    VERIFY(integer_subtract(u, u, v));
    VERIFY(integer_divide_power_of_two(u, u, integer_get_trailing_zeros(u)));
  }

  VERIFY(integer_multiply_power_of_two(gcd, u, z));
  if(u != gcd) { integer_destroy(u); } else { integer_destroy(v); }
  
  return 0;
}
void operator_integer() {
    int result;
    char in[USHRT_MAX];
    printf("Entre com o 1º valor: ");
    scanf("%s", in);
    printf("\n");
    result = atoi(in);
    int keep_going = 1;
    while (keep_going) {
        switch (menu_integer()) {
            case 1:
                // Add
                printf("Entre com o próximo valor: ");
                scanf("%s", in);
                printf("\n");
                integer_add(&result, atoi(in));
                break;
            case 2:
                // Subtract
                printf("Entre com o próximo valor: ");
                scanf("%s", in);
                printf("\n");
                integer_subtract(&result, atoi(in));
                break;
            case 3:
                // Multiply
                printf("Entre com o próximo valor: ");
                scanf("%s", in);
                printf("\n");
                integer_multiply(&result, atoi(in));
                break;
            case 4:
                // Power
                printf("Entre com o próximo valor: ");
                scanf("%s", in);
                printf("\n");
                integer_power(&result, atoi(in));
                break;
            case 5:
                // Divide
                while (1) {
                    printf("Entre com o próximo valor: ");
                    scanf("%s", in);
                    printf("\n");
                    if (atoi(in) == 0)
                        printf("Valor inválido!\n\n");
                    else
                        break;
                }
                integer_divide(&result, atoi(in));
                break;
            case 6:
                // Module
                printf("Entre com o próximo valor: ");
                scanf("%s", in);
                printf("\n");
                integer_module(&result, atoi(in));
                break;
            default:
                keep_going = 0;
                break;
        }
        printf("Resultado: %d\n\n", result);
    }
}
Exemple #3
0
// MCA: ExtendedGCD
int integer_gcd_extended(integer_t gcd, integer_t U, integer_t V, integer_t A, integer_t B) {
  integer_t a, b, u, w, v, x, q, r;
  
  INSIST(gcd != U);
  INSIST(gcd != V);
  INSIST(U != V);

  a = integer_create(0);
  b = gcd;

  VERIFY(integer_absolute_value(a, A));
  VERIFY(integer_absolute_value(b, B));

  u = U;
  VERIFY(integer_set_unsigned_value(u, 1));
  w = integer_create(0);

  v = V;
  VERIFY(integer_set_unsigned_value(v, 0));
  x = integer_create(1);

  q = integer_create(0);
  r = integer_create(0);

  while(!integer_is_zero(b)) {
    VERIFY(integer_divide(q, r, a, b));
    SWAP(a, b);
    SWAP(b, r);

    VERIFY(integer_multiply(r, q, w));
    VERIFY(integer_subtract(u, u, r));
    SWAP(u, w);

    VERIFY(integer_multiply(r, q, x));
    VERIFY(integer_subtract(v, v, r));
    SWAP(v, x);
  }

  EXCHANGE(gcd, a);
  EXCHANGE(U, u);
  EXCHANGE(V, v);

  integer_destroy(q);
  /* gcd is passed between a, b, and r */
  if(b == gcd) {
    integer_destroy(a);
    integer_destroy(r);
  }
  else if(a == gcd) {
    integer_destroy(b);
    integer_destroy(r);
  }
  else {
    integer_destroy(a);
    integer_destroy(b);
  }
  
  /* U and V are passed between u, w and v, x respectively */
  if(u == U) {
    integer_destroy(w);
    integer_destroy(x);
  }
  else {
    integer_destroy(u);
    integer_destroy(v);
  }
  
  return 0;
}