• Aucun résultat trouvé

E545. Le triangle de Steinhaus Soit un triangle équilatéral ABC de côté

N/A
N/A
Protected

Academic year: 2022

Partager "E545. Le triangle de Steinhaus Soit un triangle équilatéral ABC de côté"

Copied!
3
0
0

Texte intégral

(1)

E545. Le triangle de Steinhaus

Soit un triangle équilatéral ABC de côté 𝑛 entier ≥ 2. Sur la première ligne du côté horizontal BC, on écrit une suite de 𝑛 caractères constitués de « 0 » et de « 1 » puis sur une deuxième ligne on écrit une suite de 𝑛‒ 1 caractères selon la règle suivante : deux chiffres « 1 » ou deux chiffres « 0 » adjacents de la première ligne génèrent le chiffre « 1 » placé à cheval au-dessus d'eux. Sinon le chiffre généré est un « 0 ». Selon la même règle, on poursuit le remplissage des lignes supérieures avec des suites de 𝑛‒ 2, 𝑛‒ 3, ...caractères jusqu'à la 𝑛- ième ligne du sommet A où on écrit un seul chiffre.

Exemple : avec 𝑛 = 5 et la suite « 1 1 0 1 0 » de la première ligne, on obtient le triangle suivant :

Le triangle est appelé triangle de Steinhaus(1) si à l'intérieur du triangle ABC le nombre de « 0 » est identique au nombre de « 1 ». On note que le triangle de l'exemple ci-dessus avec 7 chiffres « 1 » et 8 chiffres « 0 » n'est pas un triangle de Steinhaus.

Q1. Déterminez les valeurs de 𝑛 ≤ 20 et pour chacune d'elles une suite de la première ligne qui permettent de construire des triangles de Steinhaus.

Q2. Pour quelles valeurs de 𝑛 est-il toujours possible de construire des triangles de Steinhaus ? Justifiez votre réponse.

Q3. Pour un entier 𝑚 quelconque qui rend possible la construction d'un triangle de Steinhaus, trouvez une méthode de construction d'une suite de 𝑚 caractères de la première ligne. Record à battre 𝑚 = 240 ! (1)H.STEINHAUS:ONE HUNDRED PROBLEMS IN ELEMENTARY MATHEMATICS (1963)

Solution

Proposée par Fabien GIGANTE

On triangle de côté 𝑛 contient 𝑛(𝑛 + 1) 2⁄ caractères. Pour qu’il puisse y avoir autant de « 0 » que de « 1 », il est nécessaire que ce nombre soit pair :

𝑛(𝑛 + 1) 2⁄ pair ⇔ 𝑛(𝑛 + 1) ≡ 0 [4] ⇔ 𝑛 ≡ 0 ou 3 [4]

Dans la suite de l’exposé, on montrera en réalité que cette condition est suffisante. C'est-à-dire que pour tout 𝑛 ≡ 0 ou 3 [4], il existe un triangle de Steinhaus de côté 𝑛 (question Q2), dont on donnera une méthode de construction (question Q3).

On optera pour une notation plus concise : une suite de quatre caractères sera désignée par le chiffre de sa représentation hexadécimale, et une suite de trois caractères par le chiffre de sa représentation octale qu’on soulignera.

Par exemple, on désignera par « 027 » la suite « 000 0010 0111 ».

(2)

Pour les petites valeurs de 𝑛 ≤ 20 (question Q1), on peut trouver à la main des exemples triangles de Steinhaus.

Mais un programme informatique (en annexe) permet de les dénombrer tous par l’emploi de la force brute.

𝒏 0 3 4 7 8 11 12 15 16 19 20

Nb. 1 4 6 12 40 171 410 1896 5160 32757 59984

Ex. « » « 0 » « A » « 02 » « A5 » « 027 » « A5D » « 0278 » « A5D7 » « 02782 » « A5D75 »

Par exemple, on vérifie que « 02782 » (c'est-à-dire « 000 0010 0111 1000 0010 ») convient pour 𝑛 = 19 :

1 0 0

1 0 1 0 0 1 1

1 0 1 1 1 0 0 1 1 1 1

0 1 0 0 0 0 0 1 0 0 1 0 1 0 1

1 1 0 1 1 0 0 1 1 1 1 1 0 0 0 1 0 0 0

0 0 0 0 1 0 1 1 0 1 0 0 1 0 1 0 0 1 1 1 0 0 1

1 0 0 1 1 0 1 1 1 1 0 1 1 0 0 1 0 0 0 1 1 1 1 1 0 0 0

1 0 1 1 0 1 0 0 0 0 0 0 1 0 1 1 1 0 0 0 1 1 0 1 0 1 0 1 1 0 0

1 1 1 0 1 0 0 0 1 1 0 0 1 1 1 0 1 1 1 1 1 0 0 1 0 1 1 1 0 1 1 1 1 0 0 0 0 0 0 0 1 0 0 1 1 1 1 0 0 0 0 0 1 0

0 2 7 8 2

Une méthode de recherche plus parcimonieuse consiste à partir d’un triangle de Steinhaus de côté 𝑛 − 4 et d’y adjoindre une bande de largeur 4 dans l’espoir de former un autre triangle de Steinhaus de côté 𝑛.

On automatise cet algorithme dans un programme informatique (en annexe), pour trouver des triangles de Steinhaus quand 𝑛 est grand.

 𝑛 = 320

« BDA3DA3DA3DA3DA3DA3DA3DA3DA3DA3DA3DA3DA3DA3DA3DA3DA3DA3DA3DA3DA3DA3DA3DA3DA3DA3D »

« B78B78B78B78B78B78B78B78B78B78B78B78B78B78B78B78B78B78B78B78B78B78B78B78B78B78B7 »

« A9E79E79E79E79E79E79E79E79E79E79E79E79E79E79E79E79E79E79E79E79E79E79E79E79E79E79 »

« A5D75D75D75D75D75D75D75D75D75D75D75D75D75D75D75D75D75D75D75D75D75D75D75D75D75D75 »

 𝑛 = 323

« 6BDEBDEBDEBDEBDEBDEBDEBDEBDEBDEBDEBDEBDEBDEBDEBDEBDEBDEBDEBDEBDEBDEBDEBDEBDEBDEBD »

« 61CA9CA9CA9CA9CA9CA9CA9CA9CA9CA9CA9CA9CA9CA9CA9CA9CA9CA9CA9CA9CA9CA9CA9CA9CA9CA9C »

« 5EBDEBDEBDEBDEBDEBDEBDEBDEBDEBDEBDEBDEBDEBDEBDEBDEBDEBDEBDEBDEBDEBDEBDEBDEBDEBDEB »

« 5EB43D40B43D40B43D40B43D40B43D40B43D40B43D40B43D40B43D40B43D40B43D40B43D40B43D40B »

« 5E6F66F66F66F66F66F66F66F66F66F66F66F66F66F66F66F66F66F66F66F66F66F66F66F66F66F66 »

« 54A9CA9CA9CA9CA9CA9CA9CA9CA9CA9CA9CA9CA9CA9CA9CA9CA9CA9CA9CA9CA9CA9CA9CA9CA9CA9CA »

« 54A02962A02962A02962A02962A02962A02962A02962A02962A02962A02962A02962A02962A02962A »

« 544D44D44D44D44D44D44D44D44D44D44D44D44D44D44D44D44D44D44D44D44D44D44D44D44D44D44 »

« 3DEBDEBDEBDEBDEBDEBDEBDEBDEBDEBDEBDEBDEBDEBDEBDEBDEBDEBDEBDEBDEBDEBDEBDEBDEBDEBDE »

« 3D3953953953953953953953953953953953953953953953953953953953953953953953953953953 »

« 029CA9CA9CA9CA9CA9CA9CA9CA9CA9CA9CA9CA9CA9CA9CA9CA9CA9CA9CA9CA9CA9CA9CA9CA9CA9CA9 »

« 027827827827827827827827827827827827827827827827827827827827827827827827827827827 »

(3)

Ces résultats mettent en évidence une construction de solutions générales « périodiques » dont on peut vérifier qu’elles conviennent pour tout 𝑛 ≡ 0 ou 3 [4]. Par exemple :

 « 0 », « 02 », « 027 », « 0278 », « 02782 », « 027827 », « 0278278 », … pour 𝑛 ≡ 3 [4].

 « », « A », « A5 », « A5D », « A5D7 », « A5D75 », « A5D75D », « A5D75D7 », … pour 𝑛 ≡ 0 [4].

Il est en particulier possible d’exhiber un triangle de Steinhaus pour un 𝑛 ≡ 0 ou 3 [4] arbitrairement grand.

Annexe informatique

Le programme mentionné est reproduit ci-dessous. Il peut être exécuté en ligne sur http://goo.gl/6EGb6h

using System;

using System.Collections.Generic;

using System.Diagnostics;

using System.Linq;

using System.Text.RegularExpressions;

namespace Diophante { class BigInt {

private const int L = 16; // 1024 bits private ulong[] bits = new ulong[L];

public BigInt() { }

public BigInt(ulong n) { bits[0] = n; }

public BigInt(BigInt a) { System.Buffer.BlockCopy(a.bits, 0, bits, 0, L * 8); } public void Not() { for (int i=0; i<L; i++) bits[i] = ~bits[i]; }

public void Left(int n = 1) { for (int i=L-1; i>0; i--) bits[i] = (bits[i] << n) | (bits[i-1] >> (64-n)); bits[0] = bits[0] << n; } public void Right(int n = 1) { for (int i=0; i<L-1; i++) bits[i] = (bits[i] >> n) | (bits[i+1] << (64-n)); bits[L-1] = bits[L-1] >> n; } public void Incr() { for (int i=0; i<L; i++) { bits[i]++; if (bits[i] != 0) break; } }

public void Decr() { for (int i=0; i<L; i++) { bits[i]--; if (bits[i] != ulong.MaxValue) break; } } public void NotXor(BigInt b) { for (int i=0; i<L; i++) bits[i] ^= ~b.bits[i]; }

public void And(BigInt b) { for (int i=0; i<L; i++) bits[i] &= b.bits[i]; } public void Or(BigInt b) { for (int i=0; i<L; i++) bits[i] |= b.bits[i]; } public bool IsZero() => bits.All(n => n == 0);

public static BigInt Mask(int size) { BigInt mask = new BigInt(); for (int i=0; i<size; i++) { mask.Left(); mask.Incr(); } return mask; } private static int BitCount(ulong i) {

i = i - ((i >> 1) & 0x5555555555555555ul); i = (i & 0x3333333333333333ul) + ((i >> 2) & 0x3333333333333333ul);

return (int)(unchecked(((i + (i >> 4)) & 0xF0F0F0F0F0F0F0Ful) * 0x101010101010101ul) >> 56);

}

public int BitCount() { int c = 0; foreach (ulong n in bits) c += BitCount(n); return c; }

private string ToHex() => bits.Reverse().Select(n => n.ToString("X16")).Aggregate(String.Empty, String.Concat);

public override string ToString() => Regex.Replace(ToHex(), "^0*(?=.)", "0x");

}

class E545 {

static int TriangleBits(BigInt n, BigInt mask, int size) { if (size == 0) return 0;

BigInt newmask = new BigInt(mask); newmask.Right();

BigInt m = new BigInt(n); m.Right(); m.NotXor(n); m.And(newmask);

return n.BitCount() + TriangleBits(m, newmask, size - 1);

}

static IEnumerable<BigInt> BigRange(BigInt m) { BigInt n = new BigInt(m); yield return new BigInt(n);

while (!n.IsZero()) { n.Decr(); yield return new BigInt(n); } }

static IEnumerable<BigInt> BruteFind(int size) {

if (size % 4 != 0 && size % 4 != 3) return Enumerable.Empty<BigInt>();

int bits = (size) * (size + 1) / 4;

BigInt mask = BigInt.Mask(size);

return BigRange(mask).AsParallel().Where(n => TriangleBits(n, mask, size) == bits).ToArray();

}

static IEnumerable<BigInt> Find(int size) {

if (size % 4 != 0 && size % 4 != 3) return Enumerable.Empty<BigInt>();

if (size <= 4) return BruteFind(size);

int bits = (size) * (size + 1) / 4;

BigInt mask = BigInt.Mask(size), f = new BigInt(0xf);

return Find(size - 4).AsParallel().Select(n => { n.Left(4); return n; }) .SelectMany(n => BigRange(f).Select(m => { m.Or(n); return m; })) .Where(n => TriangleBits(n, mask, size) == bits).ToArray();

}

static void Main(string[] args) { Stopwatch w = new Stopwatch(); w.Start();

foreach (int i in new int[] { 0, 3, 4, 7, 8, 11, 12, 15, 16, 19, 20 }) { IEnumerable<BigInt> sol = BruteFind(i);

Console.WriteLine($"Longueur {i,2} : {sol.Count(),5} solutions, ex.:{sol.Last()}");

}

foreach (int i in new int[] { 320, 323 }) {

Console.WriteLine($"Longueur {i} : quelques solutions");

foreach (BigInt n in Find(i)) Console.WriteLine(n);

}

w.Stop(); Console.WriteLine($"Elapsed {w.ElapsedMilliseconds}ms");

} } }

Références

Documents relatifs

Les triangles ACF et CBP qui ont deux côtés égaux (AC=CB, CF=CP) et le même angle (ACF = BCP=60° - ACP) compris entre les deux côtés sont égaux.. Il en résulte que AF=5 et que le

Avec le premier cercle: on a PH*HQ = BH*HK = CH*HL car les quatre points B,C,K,L sont cocycliques avec les triangles rectangles BCK et BCL. Les points Q et Q'

En effet, si IJ coupe la droite EF en K, l’étude des angles montre que sont isocèles les triangles KF J , F GJ et J GK, ces deux derniers semblables

Quel est l’orthocentre du

Pour quelle position de M les périmètres du triangle équilatéral et du carré sont-ils égaux ?... Logiciels

Triangle équilatéral : les trois côtés ont la même longueur, c’est AB. Droites particulières

Triangle équilatéral : les trois côtés ont la même longueur, c’est AB. Droites particulières du

Pour préparer le contrôle Réciter les propriétés du triangle. rectangle, du triangle isocèle et du