Last active
          October 15, 2021 17:12 
        
      - 
      
- 
        Save paulnbrd/6226fa1b5de960497279b74e96d2e68c to your computer and use it in GitHub Desktop. 
    Fichiers
  
        
  
    
      This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
      Learn more about bidirectional Unicode characters
    
  
  
    
  | import time | |
| import matplotlib.pyplot as plt | |
| def diviseurs(n: int, positifs_uniquement: bool = False) -> list: | |
| """ Fonction pour récupérer tous les diviseurs d'un nombre """ | |
| assert type(n) is int | |
| if positifs_uniquement: | |
| return [i for i in range(1, n + 1) if n % i == 0] | |
| return [i for i in range(-n, n + 1) if i != 0 and n % i == 0] | |
| def diviseurs_stricts(n: int, positifs_uniquement: bool = False) -> list: | |
| """ Récupérer les diviseurs stricts d'un nombre entier """ | |
| l = diviseurs(n, positifs_uniquement) | |
| l.remove(n) | |
| return l | |
| def nombres_amiables(n1: int, n2: int) -> list: | |
| """ Tester si deux nombres sont amiables """ | |
| diviseurs_n1 = diviseurs_stricts(n1, True) | |
| diviseurs_n2 = diviseurs_stricts(n2, True) | |
| sum_1 = sum(diviseurs_n1) | |
| sum_2 = sum(diviseurs_n2) | |
| return sum_1 == n2 and sum_2 == n1 | |
| def nombre_parfait(n: int) -> bool: | |
| """ Tester si un nombre est parfait """ | |
| d = diviseurs_stricts(n, True) | |
| return sum(d) == n | |
| def nombre_premier(n: int) -> bool: | |
| """ Tester si un nombre est premier """ | |
| return diviseurs(n, True) == [1, n] | |
| def crible_eratosthene(n: int) -> list: | |
| """ Fonction non optimisée pour un crible d'Ératosthène """ | |
| l = [i for i in range(2, n + 1)] | |
| p = [] | |
| while len(l) != 0: | |
| p.append(l[0]) | |
| i = l[0] | |
| for k in l: | |
| if n % i != 0: | |
| del (l[l.index(k)]) | |
| return p | |
| def crible(n: int) -> list: | |
| """ Fonction optimisée pour un crible d'Ératosthène """ | |
| liste_crible = [True for _ in range(2, n + 1)] | |
| index = 2 | |
| while index <= (n + 1) / 2: | |
| for i in range(index * 2, n + 1, index): | |
| liste_crible[i - 2] = False | |
| index += 1 | |
| while not liste_crible[index - 2]: | |
| index += 1 | |
| return [i + 2 for i, e in enumerate(liste_crible) if e] | |
| def mesure() -> None: | |
| """ Mesurer les performances des fonctions crible et _crible_eratosthene """ | |
| vals = list(range(0, 2000, 850)) | |
| crible_1_vals = [] | |
| for v in vals: | |
| start = time.monotonic() | |
| crible_eratosthene(v) | |
| end = time.monotonic() | |
| crible_1_vals.append(end - start) | |
| crible_2_vals = [] | |
| for v in vals: | |
| start = time.monotonic() | |
| crible(v) | |
| end = time.monotonic() | |
| crible_2_vals.append(end - start) | |
| plt.plot(vals, crible_1_vals, label="Fonction non optimisée") | |
| plt.plot(vals, crible_2_vals, label="Fonction optimisée") | |
| #plt.xlabel("Valeur de n") | |
| #plt.ylabel("Temps d'éxecution (en s)") | |
| #plt.legend(loc="upper left") | |
| plt.show() | |
| def associes(n: int) -> list: | |
| r = [] | |
| if nombre_premier(n) and False: | |
| return [(n, 1), (-n, -1)] | |
| for x in range(-n, n+1): | |
| for y in range(-n, n+1): | |
| if x*y == n and (y, x) not in r: | |
| r.append((x, y)) | |
| break | |
| return r | |
| def associesf(n: int) -> list: | |
| for i in associes(n): | |
| print(i) | 
  
    Sign up for free
    to join this conversation on GitHub.
    Already have an account?
    Sign in to comment