#!/bin/env python3

import argparse
import matplotlib.pyplot as plt

def is_prime(x):
	if x <= 1: return False
	i = 2
	while i*i <= x:
		if x % i == 0:
			return False
		i += 1
	return True

def norm(x):
	return x.real**2 + x.imag**2

def is_gaussian_prime(x):
	if x.real != 0 and x.imag != 0:
		return is_prime(norm(x))
	elif x.real != 0:
		return is_prime(abs(x.real)) and (abs(x.real)-3) % 4 == 0
	elif x.imag != 0:
		return is_prime(abs(x.imag)) and (abs(x.imag)-3) % 4 == 0
	else:
		return False

def plot(centerx=0, centery=0, delta=100, deltax=None, deltay=None):
	if deltax is None:
		deltax = delta
	if deltay is None:
		deltay = delta
	data = []
	for xi in range(centerx-deltax, centerx+deltax+1):
		for yi in range(centery-deltay, centery+deltay+1):
			if is_gaussian_prime(xi+yi*1j):
				data.append([xi, yi])
	# make a plot
	plt.scatter([d[0] for d in data], [d[1] for d in data])
	plt.show()

if __name__ == "__main__":
	parser = argparse.ArgumentParser()
	parser.add_argument("--centerx", type=int, default=0)
	parser.add_argument("--centery", type=int, default=0)
	parser.add_argument("--delta", type=int, default=50)
	parser.add_argument("--deltax", type=int, default=None)
	parser.add_argument("--deltay", type=int, default=None)
	args = parser.parse_args()
	plot(args.centerx, args.centery, args.delta, args.deltax, args.deltay)

