def SDiv(a, b, l, kappa, round_nearest=False): theta = int(ceil(log(l / 3.5) / log(2))) alpha = two_power(2 * l) w = types.cint(int(2.9142 * two_power(l))) - 2 * b x = alpha - b * w y = a * w y = y.round(2 * l + 1, l, kappa, round_nearest, signed=False) x2 = types.sint() comparison.Mod2m(x2, x, 2 * l + 1, l, kappa, False) x1 = comparison.TruncZeroes(x - x2, 2 * l + 1, l, True) for i in range(theta - 1): y = y * (x1 + two_power(l)) + (y * x2).round( 2 * l, l, kappa, round_nearest, signed=False) y = y.round(2 * l + 1, l + 1, kappa, round_nearest, signed=False) x = x1 * x2 + (x2**2).round( 2 * l + 1, l + 1, kappa, round_nearest, signed=False) x = x1 * x1 + x.round( 2 * l + 1, l - 1, kappa, round_nearest, signed=False) x2 = types.sint() comparison.Mod2m(x2, x, 2 * l, l, kappa, False) x1 = comparison.TruncZeroes(x - x2, 2 * l + 1, l, True) y = y * (x1 + two_power(l)) + (y * x2).round( 2 * l, l, kappa, round_nearest, signed=False) y = y.round(2 * l + 1, l - 1, kappa, round_nearest) return y
def SDiv(a, b, l, kappa): theta = int(ceil(log(l / 3.5) / log(2))) alpha = two_power(2 * l) beta = 1 / types.cint(two_power(l)) w = types.cint(int(2.9142 * two_power(l))) - 2 * b x = alpha - b * w y = a * w y = TruncPr(y, 2 * l, l, kappa) x2 = types.sint() comparison.Mod2m(x2, x, 2 * l + 1, l, kappa, False) x1 = (x - x2) * beta for i in range(theta - 1): y = y * (x1 + two_power(l)) + TruncPr(y * x2, 2 * l, l, kappa) y = TruncPr(y, 2 * l + 1, l + 1, kappa) x = x1 * x2 + TruncPr(x2**2, 2 * l + 1, l + 1, kappa) x = x1 * x1 + TruncPr(x, 2 * l + 1, l - 1, kappa) x2 = types.sint() comparison.Mod2m(x2, x, 2 * l, l, kappa, False) x1 = (x - x2) * beta y = y * (x1 + two_power(l)) + TruncPr(y * x2, 2 * l, l, kappa) y = TruncPr(y, 2 * l + 1, l - 1, kappa) return y