for q in range(200): q = Integer(q) if not q.is_prime(): continue if q % 4 != 3: continue Fq. = GF(q) def chi(a): return a^((q-1)//2) for s in Fq: if s == 0: continue if (s^2-2)*(s^2+2) == 0: continue c = 2/s^2 r = c+1/c d = -(c+1)^2/(c-1)^2 def phi(t): if t == 1: return (Fq(0),Fq(1)) if t == -1: return (Fq(0),Fq(1)) u = (1-t)/(1+t) v = u^5 + (r^2-2)*u^3 + u X = chi(v)*u Y = (chi(v)*v)^((q+1)//4)*chi(v)*chi(u^2+1/c^2) x = (c-1)*s*X*(1+X)/Y y = (r*X-(1+X)^2)/(r*X+(1+X)^2) return (x,y) b = 0 while 2^(b+1) <= q: b += 1 def sigma(t): return Fq(sum([t[i]*2^i for i in range(b)])) S = [] for j in range(2^b): t = [(j>>i)%2 for i in range(b)] if sigma(t) <= (q-1)//2: S.append(t) print len(S) == (q+1)//2 def iota(t): return phi(sigma(t)) for t in S: x,y = iota(t) print x^2+y^2 == 1+d*x^2*y^2 iotaS = set() for t in S: iotaS.add(iota(t)) print len(iotaS) == len(S) phiFq = set() for t in Fq: phiFq.add(phi(t)) print iotaS == phiFq