Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <gmp.h>
- typedef mpz_t ll;
- void extended_euclidian(ll a, ll b, ll* d, ll* x, ll* y){
- if(mpz_cmp_ui(b, 0) == 0) {
- mpz_set(*d, a);
- mpz_set_ui(*x, 1);
- mpz_set_ui(*y, 0);
- } else {
- ll r;
- mpz_init(r);
- mpz_tdiv_r(r, a, b);
- extended_euclidian(b, r, d, x, y);
- ll xp, tmp, tmp2;
- mpz_init(tmp);
- mpz_init(tmp2);
- mpz_init_set(xp, *y);
- mpz_tdiv_q(tmp, a, b);
- mpz_mul(tmp2, tmp, *y);
- mpz_sub(tmp, *x, tmp2);
- mpz_set(*y, tmp);
- mpz_set(*x, xp);
- }
- }
- int main(int argc, char *argv[]) {
- if (argc < 3) {
- printf("Usage: example number1 number2\n");
- return 1;
- }
- ll a, b, d, x, y;
- mpz_init(d);
- mpz_init(x);
- mpz_init(y);
- mpz_init_set_str(a, argv[1], 10);
- mpz_init_set_str(b, argv[2], 10);
- extended_euclidian(a, b, &d, &x, &y);
- char* str_a = mpz_get_str(NULL, 10, a);
- char* str_b = mpz_get_str(NULL, 10, b);
- char* str_d = mpz_get_str(NULL, 10, d);
- char* str_x = mpz_get_str(NULL, 10, x);
- char* str_y = mpz_get_str(NULL, 10, y);
- printf("a*x + b*y = mdc(a, b) tal que\na \t= \t%s\nb \t= \t%s\nmdc(a, b) = \t%s\nx \t= \t%s\ny \t= \t%s\n",
- str_a, str_b, str_d, str_x, str_y);
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement