#include <pari/pari.h>
/*
GP;install("extgcd", "GG&&", "gcdex", "./libextgcd.so");
*/
/* return d = gcd(a,b), sets u, v such that au + bv = gcd(a,b) */
GEN
extgcd(GEN A, GEN B, GEN *U, GEN *V)
{
pari_sp av = avma;
GEN ux = gen_1, vx = gen_0, a = A, b = B;
if (typ(a) != t_INT || typ(b) != t_INT) pari_err(typeer, "extgcd");
if (signe(a) < 0) { a = negi(a); ux = negi(ux); }
while (!gcmp0(b))
{
GEN r, q = dvmdii(a, b, &r), v = vx;
vx = subii(ux, mulii(q, vx));
ux = v;
a = b; b = r;
}
*U = ux;
*V = diviiexact( subii(a, mulii(A,ux)), B );
gerepileall(av, 3, &a, U, V); return a;
}
int
main()
{
GEN x, y, d, u, v;
pari_init(1000000,2);
printf("x = "); x = gp_read_stream(stdin);
printf("y = "); y = gp_read_stream(stdin);
d = extgcd(x, y, &u, &v);
pariprintf("gcd = %Z\nu = %Z\nv = %Z\n", d,u,v);
return 0;
}
syntax highlighted by Code2HTML, v. 0.9.1