Esempio n. 1
0
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
Esempio n. 2
0
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