import numpy as np # import du package 'numpy' avec alias 'np'

# Prise en main de Numpy : génération de matrices
# Dans ces exercices, chaque matrice sera une matrice 6x6 d'entiers

# Créer une matrice de zéros : np.zeros
m = None
# print(m)

# Créer une matrice 1 : np.full
m = None
# print(m)

# Créer une matrice diagonale : np.eye
m = None
# print(m)

# Créer une matrice ne contenant que des 1, sauf sur la diagonale ou il doit y
# avoir des 0 : np.full et np.eye
m = None
# print(m)

# Créer une matrice triangulaire : np.tri
m = None
# print(m)

# Créer une matrice triangulaire supérieure : np.tri et transposée
m = None
# print(m)

# Créer une matrice contenant dans le triangle inférieur des -1, dans le
# triangule supérieur des 1 et sur la diagonale des 0 : np.tri et transposée
m = None
# print(m)

# Créer un vecteur d'entier de 1 à 36 : np.arange
v = None
# print(v)

# transformer ce vecteur en matrice 6x6 : methode reshape
m = None
# print(m)

# ne conserver que le triangle inférieur sans la diagonale : np.tril
m = None
# print(m)

# opération interne et externe (cartésienne)
# créer deux vecteur u et v d'entiers de 1 à 6 et de 7 à 12
u = None
v = None
# print(u,v)

# additionner ces deux vecteurs : np.add
w = None
# print(w)

# additionner les valeurs de ces deux vecteurs de toutes les façons possibles :
# np.add.outer
m = None
# print(m)

# refaire l'exercice A6 gcd_lcm avec numpy :
# np.arange, np.gcd, np.lcm, np.triu, np.tril
# aide : calculer toutes les combinaisons possibles de lcd et gcm
#        ne garder que la partie qui nous intéresse pour chaque
#        combiner le tout

def gcd_lcm(n):
  """return the GCD/LCM table of size 'n' x 'n', as a 2D numpy array"""
  pass
  
#print(gcd_lcm(9))

# refaire l'exercice A8 prime avec numpy :
# np.arange, np.multiply, accès par prédicat
# aide : générer l'ensemble primes des valeurs de 0 jusqu'à n
#        générer l'ensemble prod des produit des valeurs entre 2 et n
#        ne garder que les valeurs infèrieures ou égales à n
#        mettre à 0 les valeur de primes qui sont dans prod
#        ne garder que les valeur de primes supérieures à 1

def prime_eratos(n):
  """compute all prime numbers from 2 to 'n', using the sieve of Eratosthenes"""
  pass

# refaire la même chose en optimisant un peu
# ne faire le produit que sur les impairs, on sait que les pairs mis à part 2
# ne sont pas premiers

def prime_eratos_optim(n):
  """compute all prime numbers from 2 to 'n', using the sieve of Eratosthenes"""
  pass

# print(prime_eratos_optim(261))
