11 one_ninth = one_third**2
12 one_by_27 = one_third * one_ninth
14 A_times_one_third = A * one_third
17 t = (3 * C_squared - A_squared) * one_ninth
18 r = 16 * (A_squared * A) * one_by_27
19 s = 8 * A_times_one_third
27 setup[
'curt'](-2 * tmp + 8 * aux)
32 s0 = setup[
'sqrt'](r - s)
39 s1 = setup[
'sqrt'](v * s0_squared + u * s0)
40 s2 = setup[
'sqrt'](v * s0_squared - u * s0)
45 assert(s1**2 == (v * s0**2 + u * s0))
46 z.append((-s0_squared + s1) * one_half)
47 z.append((-s0_squared - s1) * one_half)
50 assert(s2**2 == (v * s0**2 - u * s0))
51 z.append((s0_squared + s2) * one_half)
52 z.append((s0_squared - s2) * one_half)
54 num = [zk - s0*A_times_one_third
for zk
in z]
57 p = Fq.characteristic()
61 y_squared = ((C * x**3) + (A * x**2 * den) + (C * den**2 * x)) * (den**3 * C)
62 if y_squared**((p - 1) // 2) != Fq(1):
70 y_squared = x**3 + coeff * x**2 + x
71 assert(y_squared**((p - 1) // 2) == Fq(1))
112 p = Fp.characteristic()
114 scalar = Fp.random_element()
116 scalar = Fp.random_element()
118 sign =
lambda x: -1
if x < 0
else (1
if x > 0
else 0)
119 choice = sign(exponent)
120 t = [num[(choice + 1) // 2], den]
121 for _
in range(0, choice * exponent, 1):
125 assert(
not (EllipticCurve(Fp, [0, a_, 0, 1, 0]).random_element() * (p + 1)))