class Object(dict):
    def __getattr__(self, key):
        return self[key]
    def __setattr__(self, key, value):
        self[key] = value

# -- Line calculations

from sympy import Line, Point
def intersection(x1, y1, x2, y2, x3, y3, x4, y4):
	p = Line(Point(x1, y1), Point(x2, y2)).intersection(Line(Point(x3, y3), Point(x4, y4)))[0]
	x = float(p.x)
	y = float(p.y)
	return x, y

def x_axis_intersection(x1, y1, x2, y2):
	return intersection(x1, y1, x2, y2, 0, 0, 1, 0)

def y_axis_intersection(x1, y1, x2, y2):
	return intersection(x1, y1, x2, y2, 0, 0, 0, 1)

def multiplicative_inverse_over_prime_finite_field(a, p):
	"""
	NOTE: GIGO if not is_prime(p)
	"""
	def extended_gcd(a, b):
		if a == 0:
			return b, 0, 1
		else:
			gcd, x, y = extended_gcd(b % a, a)
			return gcd, y - (b // a) * x, x
	gcd, x, _ = extended_gcd(a, p)
	return x % p

def print_multiplicative_inverse_over_prime_finite_field_table(p):
	for i in range(1, p):
		inverse = multiplicative_inverse_over_prime_finite_field(i, p)
		print(i, inverse, (i * inverse) % p)