#!/bin/sh
exec /usr/bin/env gp <<'EOF'
L(x, n) = (x-1)\n
powermod(x,k,m) = lift(Mod(x,m)^k)
p = 0xD9F527F669E88B9B
q = 0x8FE58598AC79C551
g = 0x897F46E630ACB6605C260D0A90EB9B8887395B7E0A337B89DABFAAC40B1F594
m = 5
r = 0x2FAA538E62D89F9B67DC69356FBFAE62
n = p * q
lambda = lcm(p - 1, q - 1)
mu = (1/L(powermod(g, lambda, n * n), n)) % n
c = (powermod(g, m, n*n) * powermod(r, n, n*n)) % (n*n)
d = (L(powermod(c, lambda, n*n), n) * mu) % n
print("User input")
print("==========")
print("p = " p)
print("q = " q)
print("g = " g)
print("r = " r)
print("m = " m)
print("")
print("Key generation")
print("==============")
print("n = " n)
print("n² = " n * n)
print("λ = " lambda)
print("μ = " mu)
print("")
print("Ecrypt")
print("======")
print("c = " c)
print("")
print("Decrypt")
print("=======")
/* print("powermod(c, lambda, n*n) = ", powermod(c, lambda, n*n))
print("L(powermod(c, lambda, n*n), n) = ", L(powermod(c, lambda, n*n), n))
print("(L(powermod(c, lambda, n*n), n) * mu) = ", (L(powermod(c, lambda, n*n), n) * mu)) */
print("d = " d)
quit
EOF