From 21b9fd715a59ac2e1f942fa525812fc38d71a117 Mon Sep 17 00:00:00 2001
From: Arnaud Lefebvre <arnaud.lefebvre@student.uclouvain.be>
Date: Tue, 24 Mar 2020 11:05:56 +0100
Subject: [PATCH] Add LICENSE

---
 prime_divs.py | 111 ++++++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 111 insertions(+)
 create mode 100644 prime_divs.py

diff --git a/prime_divs.py b/prime_divs.py
new file mode 100644
index 0000000..bf8ae88
--- /dev/null
+++ b/prime_divs.py
@@ -0,0 +1,111 @@
+#!/usr/bin/env python3
+
+"""Factorise la liste des diviseurs premiers de nombres entiers.
+
+Ce script lit dans un fichier d'entrée une liste d'entiers (tous naturels plus grand ou égal à 2).
+Pour chaque entier dans cette liste, il calcule la liste de ses diviseurs premiers.
+Ensuite, il écrit dans un fichier de sortie une ligne pour chaque entier avec sa liste de diviseurs premiers.
+
+Par exemple pour un fichier d'entrée :
+
+	20414363521583006011
+	13
+	100
+
+Le fichier de sortie sera :
+
+	20414363521583006011 283 72135560146936417
+	13
+	100 2 5
+
+Ce script s'utilise comme :
+	$ python3 prime_divs.py input_filename output_filename
+Pour plus d'information, lancez :
+	$ python3 prime_divs.py -h
+
+Pour tester le script, lancez :
+	$ python3 -m pytest
+Si vous avez une erreur, installez d'abord pytest :
+	$ pip3 install -U pytest
+"""
+
+
+import argparse
+import logging
+import os
+import sys
+
+logger = logging.getLogger()
+
+
+def is_div(number, i):
+	"""Vérifie si i est un diviseur de number."""
+	return number % i == 0
+
+def is_prime(number):
+	"""Vérifie si number est un nombre premier."""
+	for i in range(2, number):
+		if is_div(number, i):
+			return False
+	return True
+
+def prime_divs(number):
+	"""Calcule la liste des diviseurs premiers de number."""
+	prime_dividers = []
+	for i in range(2, number):
+		if is_prime(i) and is_div(number, i):
+			prime_dividers.append(i)
+	return prime_dividers
+
+
+def main(input, output):
+	"""Lit chaque entier en entrée, trouve ses disviseurs premiers et écrit en sortie."""
+	logger.info("Début de la boucle principale")
+	for line in input:
+
+		try:
+			number = int(line)
+		except ValueError:
+			logger.warning("Entier mal formatté : %s", line[:-1])
+			continue
+		if number < 2:
+			logger.warning("Entier plus petit que 2 : %s", line[:-1])
+			continue
+
+		prime_dividers = prime_divs(number)
+		res = str(number) + " " + " ".join(str(div) for div in prime_dividers)
+
+		output.write(res + "\n")
+		logger.debug(res)
+
+
+def parse_args(args=sys.argv[1:]):
+	"""Analyse les arguments."""
+	parser = argparse.ArgumentParser(description=sys.modules[__name__].__doc__,
+	                                 formatter_class=argparse.RawDescriptionHelpFormatter)
+
+	parser.add_argument("input_file", type=argparse.FileType('r'), help="Nom du fichier d'entrée")
+	parser.add_argument("output_file", type=argparse.FileType('w'), help="Nom du fichier de sortie")
+
+	group = parser.add_mutually_exclusive_group()
+	group.add_argument("-v", "--verbose", default=False, action="store_true", help="Active les informations de débug")
+	group.add_argument("-q", "--quiet", default=False, action="store_true", help="Désactive toutes les informations")
+
+	arguments = parser.parse_args(args)
+
+	logging.basicConfig(level=logging.INFO, stream=sys.stderr, format="%(levelname)s: %(message)s")
+	if arguments.quiet:
+		logger.setLevel(logging.WARNING)
+	if arguments.verbose:
+		logger.setLevel(logging.DEBUG)
+
+	return arguments.input_file, arguments.output_file
+
+
+if __name__ == '__main__':
+	input_file, output_file = parse_args()
+	logger.info("Fichiers ouverts")
+	main(input_file, output_file)
+	logger.info("Fermeture des fichiers")
+	input_file.close()
+	output_file.close()
-- 
GitLab