import math
import sys, getopt
"""
	programme qui trouve les nombres premiers dans un intervalle
"""


def est_premier(n):
	"""
		est_premier(n)
		
		Détermine si un nombre est premier ou non.
		Cette version compte le nombre de diviseurs.
		
		Parameters
		----------
		n : int
			nombre pour lequel on veut déterminer s'il est premier ou non
		
		Returns:
			True si n est premier, False sinon
	"""
	if n <= 1:
		return False
	
	if n <= 3:
		return True
		
	if n % 2 == 0:
		return False
		
	for i in range(3, int(math.sqrt(n)+1), 2):
		if n % i == 0:
			return False
	
	return True
	
	
def trouve_nombres_premiers(maximum):	
	"""
		trouve_premiers(n)
		
		Trouve tous les nombres premiers dans un
		intervalle donné
		
		Parameters
		----------
		maximum : int
			borne supérieure de l'intervalle de recherche
		
		Returns:
			liste des nombres premiers
	"""
	# liste des nombres premiers
	nombres_premiers = []	

	# recherche des nombres premiers entre 1 et 100
	for n in range(1,maximum+1):
		if est_premier(n):
			nombres_premiers.append(n)

	return nombres_premiers
				

def main():
	"""
		fonction principale
		
		on peut passer en argument du programme la borne supérieure
		de l'intervalle de recherche en utilisant l'argument '-m val'
		ou '--maximum=val'
	"""
	maximum = 100000
	try:
		opts, args = getopt.getopt(sys.argv[1:], "hm:", ["help", "maximum="])
	except getopt.GetoptError as err:
		# print help information and exit:
		print(err) # will print something like "option -a not recognized"
		usage()
		sys.exit(2)
	for o, a in opts:
		if o == "-m":
			maximum = int(a)
		elif o in ("-h", "--help"):
			usage()
		else:
			assert False, "unhandled option"

	l = trouve_nombres_premiers(maximum)
	print( l )
	print( "dans l'intervalle [1..{}]".format(maximum) )
	print( "il y a ", len(l), " nombres premiers")
	print( "leur somme est égale à ", sum(l) )


if __name__ == "__main__":
    main()
			
