p=11
for y in range(p):
print(y, y*y % p)
0 0 1 1 2 4 3 9 4 5 5 3 6 3 7 5 8 9 9 4 10 1
squares = {}
for y in range(p):
square = y*y % p
if square in squares:
squares[square].append(y)
else:
squares[square] = [y]
squares
{0: [0], 1: [1, 10], 4: [2, 9], 9: [3, 8], 5: [4, 7], 3: [5, 6]}
squares = {}
for y in range(p):
square = y*y % p
if not square in squares:
squares[square] = []
squares[square].append(y)
squares
{0: [0], 1: [1, 10], 4: [2, 9], 9: [3, 8], 5: [4, 7], 3: [5, 6]}
from collections import defaultdict
squares = defaultdict(lambda: [])
for y in range(p):
squares[y*y % p].append(y)
squares
defaultdict(<function __main__.<lambda>()>, {0: [0], 1: [1, 10], 4: [2, 9], 9: [3, 8], 5: [4, 7], 3: [5, 6]})
fcia = lambda x: (x**3+1*x+6) % p
fcia(5)
4
squares[4] # points [5, 2] and [5, 9]
[2, 9]