memonization
def lattice(p1, p2): pair = (p1, p2) if pair in memo: return memo[pair] t1, t2 = fabs(p2[0] - p1[0]), fabs(p2[1] - p1[1]) g = gcd(t1, t2) + 1 memo[pair] = g return g main loop
Instead of
count = 0 for a in xrange(1, 101): for b in xrange(1, 101): for c in xrange(1, 101): for d in xrange(1, 101): I = interior((a, 0),(0, b),(-1*c, 0),(0, -1*d)) if I in squares: count += 1 use itertools
import itertools count = sum(1 for a, b, c, d in itertools.product(range(1, 101), repeat=4) if interior((a, 0),(0, b),(-c, 0),(0, -d)) in squares) PolygonArea
Your polygon is always have 4 corners. You don't need to calculate length every time.
def SquareArea(corners): area = 0.0 for i in range(4): j = (i + 1) % 4 area += corners[i][0] * corners[j][1] area -= corners[j][0] * corners[i][1] area = abs(area) / 2.0 return area