Problème de Brocard

Série d'exercices

Cet exercice fait partie d'une série :

Le problème de Brocard consiste à trouver tous les couples d'entiers (n, m) qui vérifie la solution suivante :

\(n!+1 = m^2\)

Queston 1

Factorielle

La factorielle d'un entier naturel \(n\), noté \(n!\), est le produit des nombres entiers strictement positifs qui sont inférieurs ou égaux à \(n\).

Soit: \(n! = 1×2×3×4×...×n\)

Ainsi :

  • \(0! = 1\), c'est un produit vide, donc égal à \(1\)
  • \(1! = 1\), c'est un produit avec \(1\) comme seul facteur.
  • \(2! = 1×2 = 2\)
  • \(3! = 1×2×3 = 6\)
  • \(4! = 1×2×3×4 = 24\)

La résolution du problème va demander de nombreux calculs de factorielle, ce qui risque d'être coûteux en temps : il est donc judicieux d'utiliser une variable pour enregistrer les valeurs intermédiaires.

Écrire la fonction factorielle qui prend en paramètre un nombre entier positif n et qui renvoie la factorielle de ce nombre, selon le principe suivant :

  • factorielle_mem est initialisé à [1] de sorte que \(0!\) est égal à factorielle_mem[0]
  • factorielle(n) fait plusieurs actions :
    • Elle remplit, si nécessaire, factorielle_mem avec une boucle.
    • Elle renvoie \(n!\) en utilisant factorielle_mem[n] qui sera donc de taille au moins n + 1 à la fin de l'appel.
Contraintes

Le module math est désactivé pour cet exercice.

Il est obligatoire de compléter au fur et à mesure la variable factorielle_mem.

Exemples
>>> factorielle(5)
120
>>> factorielle(10)
3628800

###(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

.128013buS-[,3_4l.(wn/)paPk:hors1*v7c256mgyd]ieft =+050L0O0Q0s0N0k0z0R0E0k0s0z0z0S010Q0N0r010406050z0c0I0I0s0y0K040d0x0k0c0.0x0o050p0^0`0|0~0?0r04171e051h0p1h1j1e0?0L0N0C0$0(0*0,0w0N0J0w0k1x0w0Q0;050X0b0k0O1s0)0+011w1y1A1y0Q1G1I1E0Q0b0x0L0~1F0y1f0Q0w0$110z0r0s0o0,0F011K1u010P0Z0O0o0s0I0O1E1,1.1?1M1_1I1|1~0;0a0R0t0y0x0r0x0z0N140o0R0V1*0y0y0O0E2j17210o1f0p1(2w0Q1$1#1%0L230,1A0o1{2g1E1p1r0%1L2G0N2I0o1Y1q1E0r2p1f2u2w2!0@1-2k2O1@2T0y0{0k0;0A2t2(0=2%222*1M2,2.0;0F2=1.2@2u2F012|0s2/040h302v0?332`0,36380j3b322(343h0;0G3k3d3m3f350x2-370;0H3r2^2)1t2{3w2}040D3k1g2Y172M2z0L2D340E1Y1 1f3O1i3M2$182?053T0V2Z3t3E3g0;0P0s2r3w0N0O0k1I0i1~0I3k0R3C340x0;0S3}3 3u0:040f3K3e3,010I0N2:4a3+2P01470M3r063s2_4c0u0;0V0P4h4q4j0n0;3~3#31454c0o0P3.3:0Q3=3@1I4w3D4j470m4O3n0;164C2v4E4Q0;0q0v3r0R4)3~4b4j4s040P3w444,2+0;0N4=4i1@0x4z042R4`4x2+0b0;0y1.0J0O4T460;4S4X3*522{5404265a4c4R5l4j0o4I3;0y3?3^0O3`0O3|5e4Z1@470q0g514P4@044W2!4+4{1M41040T5G344e4g5A4?1M5D4%5e064*5%5M5g3-4/4J4L5v5x5z2$5X0,5P0l5o5I0s0r0r1{0L5`5Y5c615+4_5e5)5H5O0;0B5S3u5q5,5s5u3_3{644k0;495W5N656d4c5P0e6s4j5U042;6p5*6m040M0q4(4*5B1M4.2p0Q0c0y5K2?684U6g4K5t4M5w6k6B690,476o5=6q354V6l4l3B0p3(0O2w2X6=3N1q3P2z2B2x1X1Z2z0s1H6^0p3O0?750W0Y0!04.
Queston 2

Écrire la fonction brocard qui prend en paramètres deux nombre entier positif n_max et m_max qui renvoie les couples qui vérifient la relation de Brocard, avec n compris entre 0 et n_max et m compris entre 0 et m_max

>>> brocard(15,15)
[(4, 5), (5, 11)]

Fonction chargée

Une version de la fonction factorielle est déjà chargée en mémoire.

###(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

.337.128013bàuS[,3_è4l.(wnx/R)paPké;:Ehors1*v7c25qm6gyd]jieft =+050T0X0Z0w0W0m0G0!0L0m0w0G0G0#010Z0W0v010406050G0e0P0P0w0F0S040f0E0m0e0`0E0q0!020w0P0v0A0!0t0X140F0O0e0X0G050s111315170 0v041v1C051F0s1F1H1C0 0T0W0J0/0;0?0^0D0W0R0D0m1V0D0Z0}050*0c0m0X1Q0=0@011U1W1Y1W0Z1(1*1$0Z0c0E0T171%0F1D0Z0D0/1a0G0v0w0q0^0M011,1S010Y0,0X0q1i0X1$27292e1.2h1*2k0P2m040b0!0x0F0E0v0E0G0W1d1f0(250F0F0X0L2H1v2o0q1D0s232T0Z2120220T2q0^1Y0q2j2E1$1N1P0:1-2%0W2)0q1}1O1$0v2M1D2R2T2~10281f2/2f2@0F140m0}0H2Q320~312p341.36380}0M3c293e2R2$013j0w39040i3n2S0 3q3h0^3t3v0l3y3p323r3E0}0N3H3A3J3C3s0E373u0}0Q3O3f331R3i3T3k040K3H1E2|1v2-2W0T2!3r0L1}2w0%1O1D2{0X2}3d3+3@0(3 3g3#0^0y0}0(0Y3+3B46010p0}0!4c3Q4e0q0Y0}0c2B0L150T4j452:010|040o4u3!4w0q0}0q0j140r4B3r4y0h3H4i4d4D0}0P4H0w4J1w404Q2f4y0u0B3O0!4)4P4k4R042M110m0*0Z4O3Z3r0E0}0#4@4Z1.4y0g0U4(4*4^3R48040Y3T4}4,354F5b4v2f0E4g042=5f4C350c0}0F290R0X4K3R4y4A4X3o554l4F4U4W2~4+5g1.4`040$5m3r0P0W3a5v4e4#4%5z3z4*5Y5H5n1.57590F5N3R4E040P5*4e5i0}5l5W045!3K5p4.5s5u5@5B4w5x5S4-4T4I5/4w5K5M5@5_3R5P5R5 4~0^5U535Z5Z602f570W4b6b6n3i0}0Y0w2O3T0W0X0m1*634!0}5y306h3s5e6g5c4 0}0u675h0}6a5G6t0^6e043b6s6J5K0#4|6#6N3D4S6R5J0}0I6.6,5-6E6O045V2~066l6~546J5,4/0e4;0w4?6M5I0^5K0n6^6?0w0v0v2j4t785#6i6G6H4Y6+6K040q7d4x0}4N6*797r5.7k4L6P6Q5@6}707q572M0Z0e0F7t7y7l7r7375776|1v423~3,7Z0s3/1v0Z3;7(2Y2U1|1~2W0w1)7#3/1B447R2M4T6w0y0X0j0D0i0}1n1p1r1t0!6{401I3e1C0x0w740!0C0F0T0a0.0w250q0V2N7M0F0z0!1r000,0!0q000X0r0W0G0Z1+860!2X0E8E0!0G1a1c0W1e0.0d0/1+2{0E1)0k2v880!0o0l0h0N0u0h8%0N0h0H0H0u0!0)8%0K0h0K8=1E3e7$0)0+0-04.