graphe[j][i] = b
Voici le principe de cette boucle qui remplit la partie au-dessus de la diagonale (et aussi la partie en-dessous par symétrie). Cette boucle prend le dernier bit de la liste et le place sur la première case libre au-dessus de la diagonale ; puis l’avant-dernier bit est placé sur la seconde case libre. . . ; le premier bit de la liste remplit la dernière case libre.
1 0 1 0 0 0 1 1 0 1
Écriture de p sur N bits
0 0 1 0 1 0 0 0 0 1 0 1 0 1 0 Remplissage du tableau
N cases sous la diagonale (remplies par symétrie)
N cases au-dessus de la diagonale
3. Transforme la fonction précédente en une fonction
test_tous_graphes(n)
qui teste la conjecture « il y a trois amis ou trois étrangers » pour tous les graphes à n sommets. Tu dois trouver que :• pour n= 4 et n = 5 la conjecture est fausse. Donne un graphe à 4 sommets (puis à 5 sommets) qui n’a ni 3 amis, ni 3 étrangers ;
• pour n= 6 laisse l’ordinateur vérifier que, pour chacun des N = 25×62 = 32 768 graphes ayant 6 sommets, soit il possède 3 amis, soit il possède 3 étrangers.
Activité 6 (Pour aller plus loin).
Objectifs : améliorer ton programme et prouver d’autres conjectures. Activité facultative.
1. Améliore ton programme afin qu’il vérifie la conjecture pour n= 6 en moins d’une seconde.
Idées.
• Il faut générer la liste des triplets une fois pour toute au début du programme (et non à chaque nouveau graphe).
• Il ne faut pas générer une liste de tous les graphes possibles, puis les tester dans un second temps. Il faut en générer un puis le tester avant de passer au suivant.
• Dès que tu as trouvé 3 amis (ou 3 étrangers) c’est gagné ! Stoppe immédiatement la boucle quitte à utiliser l’instruction
break
et passe au graphe suivant.• Tu peux seulement tester les graphes qui correspondent à p entre 0 et 2N/2 (car pour les p suivants cela revient à échanger les segments verts en rouges et inversement).
Nombre de sommets Nombre de graphes Temps de calcul approximatif
n= 6 32 768 < 1 seconde
n= 7 2 097 152 < 1 minute
n= 8 268 435 456 < 1 heure
n= 9 68 719 476 736 < 10 jours
2. Il existe un énoncé plus difficile. Il s’agit de trouver à partir de quelle taille n un graphe contient toujours ou bien 4 amis ou bien 3 étrangers. Être 4 amis signifie que deux à deux ils sont reliés par un segment vert, comme ci-dessous :
(a) Trouve des graphes à n= 6 (puis n = 7) sommets qui ne vérifient pas cet énoncé.
(b) En cherchant un peu avec la machine trouve des graphes à 8 sommets qui ne vérifient pas cet énoncé.
(c) Prouve que n’importe quel graphe ayant 9 sommets contient 4 amis ou bien 3 étrangers !
Indications.Il faut tester tous les graphes correspondants aux entiers p compris entre 0 et 2N=
28×92 = 68 719 476 736. Le temps total de calcul est d’environ 20 jours ! Tu peux partager les calculs entre plusieurs ordinateurs : un ordinateur fait les calculs pour 06p61 000 000, un deuxième ordinateur pour 1 000 0016p62 000 000,. . .
3. • Il existe des raisonnements pour pouvoir démontrer à la main que pour n= 6 il y a toujours 3 amis ou 3 étrangers. Cherche un tel raisonnement ! Avec un peu plus d’efforts, on prouve aussi que c’est n= 9 qui répond au problème des 4 amis/3 étrangers.
• On sait prouver qu’il faut n= 18 sommets pour avoir toujours 4 amis ou 4 étrangers.
• Par contre personne dans le monde ne sait quelle est la valeur du plus petit n pour le problème des 5 amis/5 étrangers !
Bitcoin
22
Lebitcoin est une monnaie dématérialisée et décentralisée. Elle repose sur deux principes informa-
tiques : la cryptographie à clé publique et la preuve de travail. Pour comprendre ce second principe, tu vas créer un modèle simple debitcoin.
Vidéo Bitcoin - partie 1 - principe général
Vidéo Bitcoin - partie 2 - fonction de hachage Vidéo Bitcoin - partie 3 - preuve de travail
Vidéo Bitcoin - partie 4 - tes bitcoins
Activité 1 (Preuve de travail).
Objectifs : comprendre ce qu’est une preuve de travail sur un modèle simple. Cette activité est indépendante du reste de la fiche. L’idée est de trouver un problème difficile à résoudre mais facile à vérifier. Comme les sudokus par exemple : il suffit de dix secondes pour vérifier qu’une grille est remplie correctement, par contre il a fallu plus de dix minutes pour le résoudre.
Le problème mathématique est le suivant : on te donne un nombre premier p et un entier y ; tu dois trouver un entier x tel que :
x2= y (mod p)
Autrement dit x est une racine carrée de y modulo p. Attention, il n’existe pas toujours de solution pour
x.
Exemples.
• Pour p= 13 et y = 10, alors une solution est x = 6. Effet x2= 62= 36. Et 36 = 2 × 13 + 10 donc
x2= 10 (mod 13).
• La solution n’est pas forcément unique. Par exemple, vérifie que x= 7 est aussi solution.
• Il n’y a pas toujours de solution, par exemple pour p= 13 et y = 5, aucun entier x n’est solution. • Exercice : pour p= 13, trouve à la main deux solutions x au problème x2= 9 (mod 13) ; trouve une
solution x au problème x2= 3 (mod 13).
L’entier p est fixé pour toute l’activité. Pour les exemples faciles on prendra p= 101, pour les exemples moyens p= 15 486 869 et pour les exemples difficiles p = 2 276 856 017. Plus l’entier p est grand, plus la preuve de travail est difficile à obtenir.
1. Vérification (facile). Écris une fonction
verification(x,y)
qui renvoie « vrai » si x est bien solution du problème x2= y (mod p) et « faux » sinon.Vérifie que x= 6 543 210 est solution lorsque y = 8 371 779 et p = 15 486 869. Affiche le temps de calcul nécessaire à cette vérification. (Voir le cours plus bas.)
2. Recherche de solution (difficile). Pour trouver une solution x, il n’y a pas vraiment d’autres choix pour nous que de tester tous les x en commençant par x = 0, x = 1. . . Programme une fonction
• Pour p= 101 et y = 17, trouve x tel que x2= y (mod p).
• Pour p= 15 486 869 et y = 8 371 779, tu dois retrouver le x de la première question. Combien de temps a pris la recherche ?
• Pour p= 15 486 869 et y = 13 017 204, trouve x tel que x2= y (mod p).
Conclusion : nous avons trouvé un problème difficile à résoudre, mais pour lequel il est facile de vérifier qu’une solution donnée convient. Pour des valeurs de p plus grandes, la recherche d’une solution x peut être beaucoup trop longue et ne pas aboutir. Nous allons voir comment on peut ajuster la difficulté du problème.
3. Au lieu de chercher une solution exacte à notre problème x2= y (mod p), qui est équivalent à x2− y (mod p) = 0. On cherche une solution approchée, c’est-à-dire qui vérifie :
x2− y (mod p) 6m.
Par exemple si m= 5, alors on peut avoir (modulo p) : x2− y = 0, x2− y = 1, x2− y = 2,. . . ,
x2− y = 5.
Programme une fonction
racine_approchee(y,marge)
qui trouve une solution approchée à notre problème x2= y (mod p).Combien de temps faut-il pour trouver un solution au problème approché lorsque p= 15 486 869,
y= 8 371 779 et m = 20 ? Choisis un nombre premier p assez grand et trouve une marge d’erreur m
de sorte que trouver une solution au problème approché nécessite environ entre 30 et 60 secondes de calculs (pour un y quelconque).
Voici des exemples de nombres premiers que tu peux utiliser pour tes essais :
101 1097 10651 100109 1300573 15486869 179426321 2276856017 32416187567
Cours 1 (Chronomètre).
Le module
time
permet de chronométrer le temps d’exécution mais aussi de savoir la date et l’heure (voir aussi le moduletimeit
expliqué dans la fiche « Arithmétique – Tant que – I »). Voici un petit scriptpour mesurer le temps de calcul d’une instruction.