def saturate_prime(E, Q, ell):
norm_bound = 100
w=[]
while len(w) < 5:
w+=nice_prime_finder(E, norm_bound, ell)
norm_bound += 100
psi0 = ReductionMap(E, w[0], ell)
psi1 = ReductionMap(E, w[1], ell)
i = 2
M = matrix(GF(ell), [[psi0(Q[0]), psi0(Q[1])], [psi1(Q[0]),psi1(Q[1])]])
while M[0] == M[1]:
psii = ReductionMap(E, w[i], ell)
M = matrix(GF(ell), [[psi0(Q[0]), psi0(Q[1])], [psii(Q[0]),psii(Q[1])]])
i+=1
while det(M) == 0:
a1 = ZZ(M[0][0])
a2 = ZZ(M[0][1])
if a1 == a2 == 0:
a1 = ZZ(M[1][0])
a2 = ZZ(M[1][1])
g = gcd(a1,a2)
a1/=g
a2/=g
Q2 = (-ZZ(a2)*E(Q[0]) + ZZ(a1)*E(Q[1])).division_points(ell)[0]
if a1 == 0:
Q[0] = Q2
else:
Q[1] = Q2
i = 2
M = matrix(GF(ell), [[psi0(Q[0]), psi0(Q[1])], [psi1(Q[0]),psi1(Q[1])]])
while M[0] == M[1]:
psii = ReductionMap(E, w[i], ell)
M = matrix(GF(ell), [[psi0(Q[0]), psi0(Q[1])], [psii(Q[0]),psii(Q[1])]])
i+=1
return Q