def pminusone(p,s):
  return Mod(2,p)^s - 1

def ecm(p,s,a):
  x,z = {},{}
  x[1],z[1] = Mod(2,p),Mod(1,p)
  for j in range(2,s+1):
    i = j//2
    if j == 2*i:
      x[j] = (x[i]^2-z[i]^2)^2
      z[j] = 4*x[i]*z[i]*(x[i]^2+a*x[i]*z[i]+z[i]^2)
    else:
      x[j] = 4*(x[i]*x[i+1]-z[i]*z[i+1])^2
      z[j] = 8*(x[i]*z[i+1]-z[i]*x[i+1])^2
  # exercise: do the above in O(log(s)) steps
  return z[s]

s = 60
for p in primes(1,10000):
  if pminusone(p,s) == 0: print('%s divides pminusone(%s)' % (p,s))
  if ecm(p,s,8) == 0: print('%s divides ecm(%s,8)' % (p,s))
  if ecm(p,s,9) == 0: print('%s divides ecm(%s,9)' % (p,s))
