Une bijection entre \(\mathbb N\) et \(\mathbb N^2\)
Le cadre
On considère tous les points du plan dont les coordonnées sont des entiers positifs (on note cet ensemble \(\mathbb N^2\)).
On peut associer à chaque point un indice entier positif (dans \(\mathbb N\) donc).

On souhaite construire deux fonctions qui sont en lien avec le schéma ci-dessus :
vers_N pour renvoyer l'indice d'un point du plan donné.
vers_N2 pour renvoyer le point du plan d'indice donné.
🐍 Console Python>>> vers_N(2, 3)
18
>>> vers_N2(18)
(2, 3)
Exercice 1 💥
Coder une fonction récursive vers_N qui prend en paramètres deux entiers positifs x et y et qui renvoie l'indice du point d'après la construction présentée au-dessus.
.128013x,59/f.q78rnb N_oO=ylaepcwgu)vd4613kRméhtsP(S0+2-i:050F0x0P0w0Y0v0Q0o0z0v0w0Q0Q0t010P0Y0y010406050Q0C0M0M0w0l0u040T0r0v0C0@0r0m050f0~1012140|0y04051k1d1n0f1k0|0F0Y0E0,0.0:0=0O0Y0B0O0v1B0O0P0`050%0n0v0x1w0/0;011A1C1E1C0P1K1M1I0P0l1l0P0O1O1y010g0)0x0m0w0M0x010,170Q0y0w0m0=0W1I1_1{1)1Q1,1M1/1;0`0a0o0R0l0r0y0r0Q0Y1a0m0o0#1@0l0l0x0z2i1d200m1l0f1%2v1!1$1#1J0F220=1E0m1.2f1I1t1v0-1P2F0Y2H0m0r2L1I0y2o1l2t2v2Z0}1`2j2N1*2S0l110v0`0o0I2s2%0{2$212)1Q2+2-2/0W2=1{2@2t2E012|0w2.040o0J302u0|332`0=36380o0G3c322%343i2/0d3m3e3o3g350r2,372/0H3t2^2(1x2{3y2}390j3D3f3G3h3I3A390k3M3v3O3x3z3j0e3U2_3W3q040I0U3#3F2O3X3J0I2;1e2?3u3$3.3(0I2 3?311o2X1d2L2y0F1$2D3w0z2T1=1l431m412#3~2u05490#2Y3V3.0K0`0#0g3m3E340A2/4t3N3`0g0`0E0x0l0Q0q0p4y4n1*0_040S4J3_2*0`0b4P3-4L0`0c3m0o4u3w0m0`0u4U344M0D0Z3,4v2/0o4=4*3w0Q0F0`014|0L1.0E0r0Y1N0v002Q1t0z1N0F0C0o2e2Q0P2k1N493y0F1b0m0N1N0S0b0c0o0u0D4Y4h3n4Q1Q4_4;4=0X0o0~1u1{5f0.1@0m0Q1!0C2q0Y1b2k5l5n0h4/4^4`394=0o5D0s2j0B125H2h0o0i0C1N0b0o0$5s5E1b5f1.0@4E0+2e2g0@0g0Q5V5w3^4V5z5Y5!0o4|013t6a4#3W4p040Y4s5w4!4z4R044)6m6g3.0r0`0t0t4Z6t1*0M0Y0`3+5w6A1Q4M4.656a6f6o1Q6i6k6z6O3h4S6S4K1Q6v046x6W5y0=6C6E4@3W6J6e6M6/6H0=6i2o0P0C0l1c6s6T016)046F2Z066/4?6}6i0x0*0x6+3.6-6L746N6X6=0`6@6_6{2Z6n7h6~6D3)6$670=6Z0V7t3p4C5}4H7b4W4N7D1Q6 712?6;014M5v7n7L4%044T6|7p6Z0X7y3w6 3=2#6}4,6.757p77797G0=7d727f7L6?0$7l7Y3W7!7`6u0`7x7U6%357A4F7C6G7%0`4O877p7R7T7P6}7w7}6B7r7#7K88047O2?7o827R6r8f7V0`7X817u7q0`8l3 8n0D3D0f4k0x2v2W8K421u442y2B2w0w1L8N0f430|8X0$0(0*04.
La réciproque
On vient de construire une fonction bijective de \(\mathbb N^2\) vers \(\mathbb N\).
Naturellement, dans cette situation, on s'intéresse à la construction de sa réciproque.
Il s'agit presque de sa réciproque, à un petit détail près. Il aurait fallu que la fonction vers_N prenne en argument un tuple à deux éléments, et non deux paramètres entiers. Mais on aura les tests suivants valides
🐍 Script Pythonfor n in range(100):
x, y = vers_N2(n)
m = vers_N(x, y)
assert n == m
Exercice 2 💥💥
Coder une fonction récursive vers_N2 qui prend en paramètre un entier positif n et qui renvoie un couple (x, y) coordonnées du point d'indice n d'après la construction présentée au-dessus.
.128013x,59/f.q78rnb N_oO=ylaepcwgu)vd4613kméhtsP(S0+2èD-i:050F0x0O0w0Z0v0P0o0z0v0w0P0P0t010O0Z0y010406050P0C0L0L0w0l0u040S0r0v0C0^0r0m050f0 1113150}0y04051l1e1o0f1l0}0F0Z0E0-0/0;0?0N0Z0B0N0v1C0N0O0{050(0n0v0x1x0:0=011B1D1F1D0O1L1N1J0O0l1m0O0N1P1z010g0*0x0m0w0L0x010-180P0y0w0m0?0V1J1`1|1*1R1-1N1:1=0{0a0o0Q0l0r0y0r0P0Z1b0m0o0$1^0l0l0x0z2j1e210m1m0f1(2w1#1%1$1K0F230?1F0m1/2g1J1u1w0.1Q2G0Z2I0m0r2M1J0y2p1m2u2w2!0~1{2k2O1+2T0l120v0{0o0I2t2(0|2%222*1R2,2.2:0V2?1|2^2u2F012}0w2/040o0J312v0}342{0?37390o0G3d332(353j2:0d3n3f3p3h360r2-382:0H3u2_2)1y2|3z2~3a0j3E3g3H3i3J3B3a0k3N3w3P3y3A3k0e3V2`3X3r040I0T3$3G2P3Y3K0I2=1f2@1p2Y1e2M2z0F1%2E3x0z2U1?1m3|1n3`2$3@3205420$2Z3W3/0K0{0$0g3n3F350A2:4m3O3/0m0g0{0E0x0l0P0q0p304a2v4n3x0`040R4r4g2+0{1d4E4f3%3/4I0c3n0o4G3(0{0b4L4S1+0r0{0t4$3.1+0L0Z0{3,4Q4Y4T0{4V4Q4X4s4N040u4,354)044+4?4}1R4/4;514H0{0D0!3-4o2:0o5j5b3X0P0F0{015q0X0M0y0/0z1O1N0o2f2R0O2l1O423z0F1c0m0M0x0,1/0^0W2p0,0R0b0c0o0u0D5g3x5n5i5j0Y5D0o2k0M0(0y5L0o1/0o0 1v1|5C0/1^0m0P1#0C2r0Z1c2l5I5K0h5Y5m5o3a5j0o5%0s2k0B135@2i0o0i0C1O2k5L5C0C6n0m0^4y5z2g2i0Z0g654Q3v4%1R5!695j5q013u6a4|4M1R4i046y4W4@4~4P2!6M6D0?530t556W6T584:044=2$570?4I5f6B6L6L6(0?6P2p0O0C0l6V2@6X4-1R4I4K566N3i4!5l4^044`6%6.360{50766Y014I5X6=6a6^016P0x1F4l4{7q0m797w7f6!6$707q596+7a1+6:6K6?5k7f6`0%6}6 32713q4w4y4A4C7I730{756-777g047S2v7U3x530Y6S7f7G3?7(7k4U7=7)7y4 7|7k530U80720?7@7!6/4_84357G6,3^7f7m7L7N7)7s0+0x887l0{6;2!067M8j7k7P6|6~8b3x7~4x4z4B4D7_858p4J8o7~7,3a7q7:8A3X877j8I7{7A7}7z7e7)8Q8X7k8T8H358W8!7k7~7i8-8I828R3/8)8f7)8h6B1e4d0x2w2X903{1v3}2z2C2x0w1M930f3|0}9d0%0)0+04.
# Tests(insensible à la casse)(Ctrl+I)
(Alt+: ; Ctrl pour inverser les colonnes)
(Esc)