Advertisement
agnishom

Foursquare.py

Dec 15th, 2013
491
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 2.65 KB | None | 0 0
  1. import random
  2. _mrpt_num_trials = 7
  3. def is_probable_prime(n): #This one is copied from rosettacode
  4.     if n == 1:
  5.         return False
  6.     if n == 2:
  7.         return True
  8.     if n % 2 == 0:
  9.         return False
  10.     s = 0
  11.     d = n - 1
  12.     while True:
  13.         quotient, remainder = divmod(d,2)
  14.         if remainder == 1:
  15.             break
  16.         s += 1
  17.         d = quotient
  18.     assert(2**s * d == n-1)
  19.     def try_composite(a):
  20.         if pow(a,d, n) == 1:
  21.             return False
  22.         for i in range(s):
  23.             if pow(a, 2**i * d, n) == n-1:
  24.                 return False
  25.         return True
  26.     for i in range(_mrpt_num_trials):
  27.         a = random.randrange(2,n)
  28.         if try_composite(a):
  29.             return False
  30.     return True
  31.    
  32. def foursquare(n):
  33.     def split(n):
  34.         i = int(n**0.5)
  35.         j = int((n - i**2)**0.5)
  36.         while not i**2 + j**2 == n:
  37.             i -= 1
  38.             j = int((n - i**2)**0.5)
  39.         return i,j
  40.     def stepone(n):
  41.         r = 0
  42.         while not n % 4:
  43.             n /= 4
  44.             r += 1
  45.         return r,n
  46.     def stepthree(n):
  47.         r = 0
  48.         while not n % 2:
  49.             n /= 2
  50.             r += 1
  51.         return r,n
  52.     r, s = stepone(n)
  53.     if (int(s**0.5))**2 == s:
  54.         return int(n**0.5),0,0,0
  55.     if (s % 8) < 7:
  56.         arbsquare = 0
  57.         residue = s
  58.         while True:
  59.             m, k = stepthree(residue)
  60.             if k % 4 == 1:
  61.                 if is_probable_prime(k) or k == 1:
  62.                     if not m % 2:
  63.                         a, b = split(k)
  64.                         a *= 2**(m/2)
  65.                         b *= 2**(m/2)
  66.                     else:
  67.                         a, b = split(2*k)
  68.                         a *= 2**((m-1)/2)
  69.                         b *= 2**((m-1)/2)
  70.                     return (2**r)*a, (2**r)*b, (2**r)*arbsquare,0
  71.             arbsquare += 1
  72.             residue = s - (arbsquare**2)
  73.     else:
  74.         c = 1
  75.         d = 1
  76.         residue = s - 2
  77.         while True:
  78.             m, k = stepthree(residue)
  79.             if k % 4 == 1:
  80.                 if is_probable_prime(k) or k == 1:
  81.                     if not m % 2:
  82.                         a, b = split(k)
  83.                         a *= 2**(m/2)
  84.                         b *= 2**(m/2)
  85.                     else:
  86.                         a, b = split(2*k)
  87.                         a *= 2**((m-1)/2)
  88.                         b *= 2**((m-1)/2)
  89.                     return (2**r)*a, (2**r)*b, (2**r)*c, (2**r)*d
  90.             if c + 1 < n**0.5:
  91.                 c += 1
  92.             else:
  93.                 c = 1
  94.                 d += 1
  95.             residue = s - c**2 - d**2
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement