Aller au contenu

Représentation maximale de Zeckendorf (Performance)

Représentation minimale de Zeckendorf

À un entier positif n, on peut associer plusieurs tableaux de bits qui indiquent les nombres de Fibonacci présents dans une représentation de Zeckendorf de n.

Exemple de représentation minimale : \(100 = 3 + 8 + 89\)

🐍 Script Python
# Nombres de Fibonacci          1  2  3  5  8 13 21 34 55 89 (144 ...
assert zeckendorf_repr(100) == [0, 0, 1, 0, 1, 0, 0, 0, 0, 1]

La représentation de Zeckendorf de \(100\) est \(3+8+89\), ou sous forme de tableau de bits [0, 0, 1, 0, 1, 0, 0, 0, 0, 1]

  • La liste ne peut pas se terminer avec un 0
  • La liste ne contient pas deux 1 consécutifs.

On dit que c'est la représentation minimale de Zeckendorf. Il n'y en a pas d'autre avec moins de termes.

Représentation maximale de Zeckendorf

On peut démontrer que pour un entier \(n\), il existe une unique représentation de Zeckendorf, comme somme de nombres de Fibonacci distincts, mais avec une liste de bits qui a comme contraintes :

  • La liste ne peut pas se terminer avec un 0
  • La liste ne contient pas deux 0 consécutifs.

On dit alors que c'est la représentation maximale de Zeckendorf. Il n'y en a pas d'autre avec plus de termes.

Exemple
La représentation maximale de Zeckendorf de \(100\) est : \(1 + 2 + 3 + 5 + 13 + 21 + 55\)
🐍 Script Python
# Nombres de Fibonacci  1  2  3  5  8 13 21 34 55 89 (144 ...
assert zeckendorf_eval([1, 1, 1, 1, 0, 1, 1, 0, 1]) == 1 + 2 + 3 + 5 + 13 + 21 + 55 == 100

# n = 100
assert zeckendorf_max([0, 0, 1, 0, 1, 0, 0, 0, 0, 1]) == [1, 1, 1, 1, 0, 1, 1, 0, 1]

Exercice (performance)

Coder une fonction zeckendorf_max qui prend en paramètre une liste bits, une représentation quelconque de Zeckendorf et qui renvoie sa représentation maximale.

⚠ Les fonctions zeckendorf_eval et zeckendorf_repr sont disponibles pour les petits tests, mais impraticables avec les nouvelles contraintes. À ne pas utiliser dans le code !

Contraintes
  • ⚠ La longueur de la liste bits est inférieure à \(10^6\)
  • Fonction récursive interdite
  • Modules math et functools interdits
  • Code source limité à 2000 caractères
###(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 : /
.128013]x59/f.Z78r;nb _o=ylae%pcwgu)vd461z3kRméhtsP(S0+2[-i:050F0w0Q0v0!0u0R0p0z0u0v0R0R0s010Q0!0y010406050R0C0N0N0v0l0t040U0r0u0C0_0r0n050f101214160~0y04051m1f1p0f1m0~0F0!0E0.0:0=0@0P0!0B0P0u1D0P0Q0|050)0o0u0w1y0;0?011C1E1G1E0Q1M1O1K0Q0l1n0Q0P1Q1A010g0+0w0n0v0N0w010.190R0y0v0n0@0X1K1{1}1+1S1.1O1;1?0|0a0p0S0l0r0y0r0R0!1c0n0p0%1_0l0l0w0z2k1f220n1n0f1)2x1$1(1%1L0F240@1G0n1:2h1K1v1x0/1R2H0!2J0n0r2N1K0y2q1n2v2x2#0 1|2l2P1,2U0l130u0|0p0I2u2)0}2(232+1S2-2/2;0X2@1}2_2v2G012~0v2:040p0K322w0~352|0@383a0p0G3e342)363k2;0d3o3g3q3i370r2.392;0H3v2`2*1z2}3A2 3b0j3F3h3I3j3K3C3b0k3O3x3Q3z3B3l0e3W2{3Y3s040I0V3%3H2Q3Z3L0I2?1g2^3w3(3:3*0I313^333`3/2,3S3a0I3d403f3G3r450|0I3n493p3{443!4e3u4h424c4l3+3E4o4b3y3}3N4u3P3|4d3+3V4z3X4B4r0I3$4F4j3J4r0X3-4L434N3L0X3@2#4p4w4C0X3 4X4v3)4!484%4A4k4U4g2%1s2Z1f2N2A0F1(2F3y0z2V1@1n4^1o4?4;2%4~0%2!4G1,0L0|0%0g3o4(3:0A2;5g4-2}0g0|0J2r0L1:0F3A0g0q130c5l5a1S0{040T5A4M3j0|0o2j0R5G4S0@5D0D0#3.365j3b0p5X5N360R0F0|015(5T3y5#2;5X0p0M1:0E0r0!1P0:0p2q2Y0O0R1:0)2k0p5y0!2/1P2n0i5r5t5v2m1P5K0Q5M4R5!5$5W5X5(013v5.0p5h2,0|633o6q5m0@0r0|0s6v6r5C0|0Y0b6o5.6D5I040L6C6x016z046B4h6w5B0@0N0!0|4Q4X6p6K015c040g3A6O6W375J6.5H6Q5V2S6=5O6:046e6g2%6P5D5S4o6p6%6P6*0!5f6U6(0n6;7b6P6R0s6T2#6V6?6Y6!5Z3y726I75757c0|6N7f6/6R0W7j2^7l6{7n3+7s7u770|0w0,0w7p3Y7r747t7J6/787a7k7v6M6`366R0x7#3y7G4$7D6(7h7C337E367G4W2^6(7R6$7T7}7Z6u4h7.0|0h7P3|0|0v0y0y5t851,5D5F816P7G6#7_710|0D7I7~6P7d7!7y6?6R0f0f7:2w7=7*6Z047,417}767V0|797)3)7w8L3:6R020B0Q0m8O1,8i8c6E04737|8G7U6?8r80707z838Y6L888a0n0F8/018e8^7@8^5Q8o8%8A8M048+8k8-04848g6/8r8;8b996?8`9e7F8C7^337`8m8 8%6(6*6,0l8V2}0|0q9u6y6^1e8t6{0n0o0|0l1}0B7O9h369g8,8)8N9C7$0|0Z9y018|9L7q8m8#3_908G7 0v0c0!8^6R989O9D87899d9:9M0|8f9^8B7o9Y7Q9n7S9%7t9)9+9-8.9 86049c8?8}9`8{9jae048na2a37Z7x7Y7g6A9V9X8$9(7K047M5~ai9#8Fa35Y8q6t9*9,a91,9.8^9b9?adaJ8Z9{957mahaQ5Pa1au9%an9V7has8C8jaCaE8I042q0Q0C0l9Bap9aaGa64u0f570w2x2Ya~4@1w4_2A2D2y0v1Nb10f4^0~bb0(0*0,04.