Crible d'Ératosthène

Nombres premiers

  • \(0\) et \(1\) ne sont pas des nombres premiers, par définition.
  • Pour un entier \(n>1\), on dit que \(n\) est nombre premier s'il ne possède que deux diviseurs entiers \(1\) et \(n\).

Par exemple :

  • \(2\) est premier ; \(1×2\) est le seul produit d'entier égal à \(2\).
  • \(3\) est premier ; \(1×3\) est le seul produit d'entier égal à \(3\).
  • \(4\) n'est pas premier ; il est aussi multiple de \(2\), avec \(2×2 = 4\).
  • \(5\) est premier ; \(1×5\) est le seul produit d'entier égal à \(5\).

Propriété importante : un entier \(n>1\) est toujours multiple d'un nombre premier, parfois lui-même uniquement. C'est cette propriété que nous allons utiliser pour justifier le fonctionnement du crible d'Ératosthène.

On va marquer les multiples des nombres premiers, le plus petit entier non marqué sera donc un nombre premier.

Le crible d'Ératosthène

Un crible est une technique qui permet de répondre sur les caractéristiques d'entiers, non pas un à la fois, mais sur plusieurs à la fois. Il existe des cribles pour autre chose que les nombres premiers.

Le crible d'Ératosthène permet de déterminer les nombres premiers jusqu'à un certain nombre \(n\) fixé. La démarche avec un papier et un crayon est la suivante :

  • On écrit tous les entiers jusqu'à \(n\).
  • On raye \(0\) et \(1\) qui ne sont pas premiers.
  • On répète jusqu'à avoir traité tous les nombres :
    • Le prochain nombre non traité est un nombre premier ; on l'entoure.
    • On raye tous les autres multiples de ce nombre.

Crible d'Ératosthène

Avec Python, si l'on cherche les nombres premiers jusqu'à n :

  • On construit un tableau de \(n+1\) booléens crible, initialement tous égaux à True.
  • On modifie crible[0] et crible[1] à False ; \(0\) et \(1\) ne sont pas premiers. Pour \(1\), il faut vérifier avant que \(n>0\).
  • On parcourt ce tableau de gauche à droite. Pour chaque indice p :
    • Si crible[p] vaut True : le nombre \(p\) est premier.
      • On donne la valeur False à toutes les cellules de crible dont l'indice est un multiple de p, on commence avec 2*p, puis 3*p etc jusqu'à la fin du tableau.
    • Sinon, crible[p] vaut False : le nombre \(p\) n'est pas premier. On n'effectue aucun changement sur le tableau.

Utilisation : On peut établir ensuite la liste des nombres premiers jusqu'à \(n\) en filtrant les indices des cellules de crible valant True.

Astuce

L'expression Python range(2*p, n + 1, p) permet d'itérer sur tous les multiples de p, de 2*p inclus à n inclus.

Compléter la fonction eratosthene :

  • prenant en paramètre un entier n positif,
  • renvoyant le tableau crible de taille \(n+1\) contenant des booléens, crible[p] indique si p est premier.

Compléter la fonction premiers_jusque :

  • prenant en paramètre un entier n positif,
  • renvoyant la liste des nombres premiers jusqu'à \(n\).
Exemples
>>> eratosthene(5)
[False, False, True, True, False, True]
>>> eratosthene(6)
[False, False, True, True, False, True, False]
>>> premiers_jusque(5)
[2, 3, 5]
>>> premiers_jusque(6)
[2, 3, 5]
>>> premiers_jusque(20)
[2, 3, 5, 7, 11, 13, 17, 19]
###(Dés-)Active le code après la ligne # Tests (insensible à la casse)
(Ctrl+I)
Entrer ou sortir du mode "deux colonnes"
(Alt+: ; Ctrl pour inverser les colonnes)
Entrer ou sortir du mode "plein écran"
(Esc)
Tronquer ou non le feedback dans les terminaux (sortie standard & stacktrace / relancer le code pour appliquer)
Si activé, le texte copié dans le terminal est joint sur une seule ligne avant d'être copié dans le presse-papier
Évaluations restantes : 10/10
.128013s3o_8;bcdufvg/T0lyq n7apSr1Fme,(P2=4:+jtwki9][5h*)6050j0E0O0x0R0r0b0u0i0r0x0b0b0J010O0R0y010406050b0k0D0D0x0A0s040z0d0r0k0@0d0v050o0~1012140|0y041d1k051n0o1n1p1k0|0j0R0m0,0.0:0=0W0R0n0W0r1D0W0O0`050%0h0r0E1y0/0;011C1E1G1E0O1M1O1K0O0h0d0j141L0A1l0O0W0,170b0y0x0v0=0I011Q1A010l0)0E0v0x0D0E1K1=1@1|1S1 1O22240`0a0u0H0A0d0y0d0b0R1a0v0u0#1:0A0A0E0i2p1d270v1l0o1.2C0O1,1+1-0j290=1G0v212m1K1v1x0-1R2M0R2O0v1(1w1K0y2v1l2A2C2*0}1?2q2U1}2Z0A110r0`0u0B2z2.0{2-282:1S2=2@2_0I2|1@2~2A2L01330x2^040u0c372B0|3a310=3d3f0u0K3j392.3b3p2_0V3t3l3v3n3c0d2?3e2_0Z3A2 2/1z323F343g0w3K3m3N3o3P3H3g0f3T3C3V3E3G3q0S3#303%3x040B0q3,3M2V3(3Q0B2{1e2}3B3-3^3/0B363}383 3@2;3X3f0B3i453k3L3w4a0`0B3s4e3u40493)4j3z4m474h4q3:3J4t4g3D423S4m1m2(1d2S2F0j2J3b0i1(251l4I1o4G2,4E4N0#2)3$3^0Q0`0#0l3t4A3%0P2_4)3U410l0`0E0A0x0O2m1.210E4.4Z1}0_040G4~4o320`1c4E4/500`0Y0L3A0u5g0u4*410`0i0A0R1N4}4m5i5a1S0d0`0J3t5s4 1S510U54481S0Q0i0`0p0A0k5q2,5t0=510T5y5j1}5v040X5T5P015153595A3o575Z5)015W0M5,550=0D0R4j5E3b510Y5f5h5U56045m5o1O5`3D5C663%5@0`3=5(5=5#0`5S5r600=5W5x6j5!5H0`0C3e0b5N3~5h5z6f4#040R4(6o5-0v5+6E6f5W020n0O0g5;5F5?5^046d5O5-515e4t6x6x6k3c5l5n5p693^686e6Q016b3:6+5b046i2*6y6/6m6P3b6q046s0*6v466#6p0`0l3F6~4B0`0y7b3%0d4,6B586`6$0v0h0`4@0v0n742B6$5$6?617k2}6{3b5/7f3^6;3|6V6f5|6Y2*066!5 776B6D7l5!6G626)656.5{0`5D7Z7c047e7%3%5R7E5V7i0R0b7.5G5I045K5M7x5Q0`7L6w7O6!6$0i0B0`030u0y0u0E0b0O882v5@4?5~817P5-6A790A7?5*040Q7*7T5-7h0`2X8p3c7o047q7s7|6g528F6;448u6J0`5Y6I6/7V8t2}7v0`0F8z7V7z387B3D7D8P3b7G8F518W8(7(8S388U045d8i8j827U6(647t4Y7J7#8F7V8s8+6h8z6}8.3%70726u8^6$6A2v0O0k0A8Z2B8#3.8|6*4t064u3D6A4%8F7i5i7+4:7d8f0R4?0b0e0N0k0b0t7{9A6@5%7I8Q6H9Q7!8?7 758k6f7V639q8L6|5w8X4=4@4_8c0W4|958H9N7y9;5}6Z9Y9R7)9D9F979)996,919?8q8:9m9f787aa22;7d977:9l3g7m8B8D8~8=9P8T8{04ah9n3^8%9%8)6S7Hap6W5c8z6A6C9*7W8}9;7$9T8/9;0T6_805ga98C0$9jas7m9C0E8g0A7=4z0o4W0E2C2%a*4H1w4J2F2H2D1%1)2F0x5p2C4I0|0o0#0%0)0b04.