Télécharger cet IPython-Notebook : Solution_AlKindi_2020.ipynb

Solution AlKindi 2020


Le mot-clé ALKINDI a servi à permuter les colonnes.

                          A  L  K  I  N  D  I
1  2  3  4  5  6  7       1  6  5  3  7  2  4 
===================       =================== 
3  2  7  8  2  6  6       3  6  2  7  6  2  8 
6  5  7  5  2  7  9       6  7  2  7  9  5  5 
0  1  9  9  5  2  5       0  2  5  9  5  1  9 
6  2  4  1  0  3  3       6  3  0  4  3  2  1 
1  1  4  8  2  0  4       1  0  2  4  4  1  8 
0  0  8  6  2  9  9       0  9  2  8  9  0  6 
1  6  6  3  6  9  6       1  9  6  6  6  6  3 
2  2  4  0  8  7  3       2  7  8  4  3  2  0 
5  6  4  7  4  7  1       5  7  4  4  1  6  7 
3  5  3  7  4  6  1       3  6  4  3  1  5  7 
1  1  9  4  3  4  8       1  4  3  9  8  1  4 
7  6  8  5  0  1  4       7  1  0  8  4  6  5 
4  5  1  3  8  0  1       4  0  8  1  1  5  3 
0  4  6  2  6  9  8       0  9  6  6  8  4  2 
8  6  9  4  7  3  9       8  3  7  9  9  6  4 
7  1  6  1  3  6  2       7  6  3  6  2  1  1 
2  1  1  3  0  3  7       2  3  0  1  7  1  3 
4  4  1  8  3  8  9       4  8  3  1  9  4  8 
3  7  8  6  3  5  7       3  5  3  8  7  7  6 
8  0  4  7  0  0  0       8  0  0  4  0  0  7 
5  2  2  5  1  7  4       5  7  1  2  4  2  5 
7  6  6  4  7  9  2       7  9  7  6  2  6  4 
9  8  0  9  2  1  0       9  1  2  0  0  8  9 
4  0  6  7  9  7  6       4  7  9  6  6  0  7 
2  2  9  3  2  1  1       2  1  2  9  1  2  3 
0  0  5  3  0  9  4       0  9  0  5  4  0  3 
2  1  7  6  1  5  7       2  5  1  7  7  1  6 
6  3  8  6  1  4  1       6  4  1  8  1  3  6 
7  3  2  2  2  5  7       7  5  2  2  7  3  2 
3  1  0  9  8  9  1       3  9  8  0  1  1  9 
1  7  9  3  2  4  1       1  4  2  9  1  7  3 
6  4  0  7  0  6  8       6  6  0  0  8  4  7 
6           3  2          6  2  3

En relevant en ligne, on obtient de nombre :

In [1]:
x = 3627628672795502595196304321102441809289061966663278432057441673643157143981\
47108465408115309668428379964763621123017134831948353877680040075712425797626491\
20089479660721291230905403251771664181367522732398011914291736600847623

Utilisons le module de théorie des nombres de la bibliothèque Python Sympy.

In [2]:
from sympy.ntheory.factor_ import factorint

La fonction factorint renvoie un dict {facteur:exposant} de la décomposition de x.

In [3]:
f = factorint(x)
print(f)
{3: 1, 337: 1, 1091: 1, 1801: 1, 2719: 1, 3631: 1, 3907: 1, 4159: 1, 4451: 1, 5189: 1, 6151: 1, 7193: 1, 8237: 1, 8543: 1, 9403: 1, 10463: 1, 11467: 1, 12589: 1, 12907: 1, 13873: 1, 14879: 1, 15901: 1, 16981: 1, 17317: 1, 18307: 1, 19421: 1, 19709: 1, 20347: 1, 21487: 1, 22541: 1, 23549: 1, 24631: 1, 25867: 1, 26987: 1, 28211: 1, 28559: 1, 29179: 1, 30341: 1, 31151: 1, 32257: 1, 33343: 1, 34337: 1, 35447: 1, 35837: 1, 36343: 1, 36821: 1, 37339: 1, 37957: 1, 38453: 1, 38977: 1, 39461: 1, 40009: 1, 40559: 1, 40903: 1, 41231: 1}

Tous les exposants sont égaux à 1.
On veut la liste des facteurs, dans l'ordre (la méthode keys() ne donne pas toujours les clés dans l'ordre)

In [4]:
factors = list(f.keys())
sorted(factors)
print(factors)
[3, 337, 1091, 1801, 2719, 3631, 3907, 4159, 4451, 5189, 6151, 7193, 8237, 8543, 9403, 10463, 11467, 12589, 12907, 13873, 14879, 15901, 16981, 17317, 18307, 19421, 19709, 20347, 21487, 22541, 23549, 24631, 25867, 26987, 28211, 28559, 29179, 30341, 31151, 32257, 33343, 34337, 35447, 35837, 36343, 36821, 37339, 37957, 38453, 38977, 39461, 40009, 40559, 40903, 41231]
In [5]:
from sympy.ntheory.generate import primepi

La fonction primepi donne le nombre de premiers inférieurs ou égaux à son argument.

In [6]:
primepi(2), primepi(3), primepi(11)
Out[6]:
(1, 2, 5)

Liste des rangs des facteurs :

In [7]:
ranks = [primepi(p) for p in factors]
print(ranks)
[2, 68, 182, 279, 397, 508, 540, 573, 605, 691, 802, 919, 1034, 1066, 1163, 1281, 1382, 1504, 1536, 1638, 1743, 1853, 1958, 1990, 2098, 2199, 2231, 2298, 2409, 2519, 2618, 2729, 2846, 2960, 3075, 3107, 3172, 3280, 3355, 3460, 3570, 3670, 3775, 3807, 3857, 3905, 3954, 4011, 4056, 4106, 4154, 4204, 4252, 4284, 4317]

Différence première de la liste précédente :

In [8]:
diff1 = [ranks[i+1] - ranks[i] for i in range(len(ranks)-1)]
print(diff1)
[66, 114, 97, 118, 111, 32, 33, 32, 86, 111, 117, 115, 32, 97, 118, 101, 122, 32, 102, 105, 110, 105, 32, 108, 101, 32, 67, 111, 110, 99, 111, 117, 114, 115, 32, 65, 108, 75, 105, 110, 100, 105, 32, 50, 48, 49, 57, 45, 50, 48, 50, 48, 32, 33]

Conversion en caractères des codes ASCII de la liste précédente :

In [9]:
car = [chr(x) for x in diff1]
print(''.join(car))
Bravo ! Vous avez fini le Concours AlKindi 2019-2020 !

Le 25/06/2021 - Contact : Rossignol@bribes.org