pi_AGM = new RR((N) => {
const eps = new QQ(1n,N);
let [a1, a2] = sqrt(new QQ(2n)).approx(N*N);
let b1 = new QQ(2n), b2 = b1;
let t1 = new QQ(4n), t2 = t1;
let k = 0n;
while (true) {
const [pi1, pi2] = [a1.power(2n).divide(t2), b2.power(2n).divide(t1)];
if (pi2.subtract(pi1).lessThan(eps)) return [pi1, pi2];
[t1, t2] = [t1.subtract(b2.subtract(a1).power(2n).multiply(2n**k)), t2.subtract(b1.subtract(a2).power(2n).multiply(2n**k))];
[a1, a2, b1, b2] = [sqrt(a1.multiply(b1)).approx(N*N)[0], sqrt(a2.multiply(b2)).approx(N*N)[1], a1.add(b1).divide(2n), a2.add(b2).divide(2n)];
k++;
}
}).multiply(4n)