def sample_discrete_gaussian(scale: RBig) -> int:
if scale == 0:
return 0
t = floor(scale) + 1 sigma2 = scale**2
while True:
candidate = sample_discrete_laplace(t)
x = abs(candidate) - sigma2 / t
bias = x**2 / (2 * sigma2)
if sample_bernoulli_exp(bias): return candidate