Salut, Habr.
Il y a déjà eu plusieurs articles sur l'hypothèse abc au
Geektimes Habr (par exemple,
en 2013 et
2018 ). L'histoire elle-même d'un théorème qui ne peut être prouvé au départ pendant de nombreuses années, puis qui ne peut pas être vérifiée pendant le même nombre d'années, mérite certainement au moins un long métrage. Mais à l'ombre de cette merveilleuse histoire, le théorème lui-même est considéré trop superficiellement, bien qu'il n'en soit pas moins intéressant. Déjà au moins par le fait que l'hypothèse abc est l'un des rares problèmes non résolus de la science moderne, l'énoncé du problème que même un élève de cinquième année peut comprendre. Si cette hypothèse est vraiment vraie, elle découle facilement de la preuve d'autres théorèmes importants, par exemple la preuve
du théorème de Fermat .
Sans revendiquer les lauriers de Motizuki, j'ai
également décidé d'essayer et décidé de vérifier avec un ordinateur à quel point l'égalité promise dans l'hypothèse est remplie. En fait, pourquoi pas - les processeurs modernes ne sont pas seulement destinés à jouer à des jeux - pourquoi ne pas utiliser un ordinateur pour son objectif principal (calcul) ...
Peu importe ce qui s'est passé, s'il vous plaît, sous le chat.
Énoncé du problème
Commençons par le début. Quel est le théorème? Comme le dit
Wikipedia (la formulation dans la version anglaise est un peu plus claire), pour les nombres mutuellement premiers (n'ayant pas de diviseurs communs) a, b et c tels que a + b = c, pour tout ε> 0, il y a un
nombre limité de triplets a + b = c, tel que:

La fonction rad est appelée le
radical et désigne le produit des facteurs premiers d'un nombre. Par exemple, rad (16) = rad (2 * 2 * 2 * 2) = 2, rad (17) = 17 (17 est un nombre premier), rad (18) = rad (2 * 3 * 3) = 2 * 3 = 6, rad (1 000 000) = rad (2 ^ 6 ⋅ 5 ^ 6) = 2 * 5 = 10.
En fait, l'essence du théorème est que le nombre de ces triplets est assez petit. Par exemple, si nous prenons au hasard ε = 0,2 et l'égalité 100 + 27 = 127: rad (100) = rad (2 * 2 * 5 * 5) = 10, rad (27) = rad (3 * 3 * 3) = 3, rad (127) = 127, rad (a * b * c) = rad (a) * rad (b) * rad (c) = 3810, 3810 ^ 1,2 est clairement supérieur à 127, l'inégalité ne tient pas. Mais il y a des exceptions, par exemple, pour l'égalité 49 + 576 = 625, la condition du théorème est remplie (ceux qui le souhaitent peuvent vérifier par eux-mêmes).
Le prochain moment clé pour nous est un nombre limité de ces égalités, selon le théorème. C'est-à-dire cela signifie que vous pouvez simplement essayer de tout trier sur un ordinateur. En conséquence, cela nous donne le
prix Nobel une tâche de programmation assez intéressante.
Commençons donc.
Code source
La première version a été écrite en Python, et bien que ce langage soit trop lent pour de tels calculs, écrire du code dessus est facile et simple, ce qui est pratique pour le prototypage.
Obtenir le radical : nous décomposons le nombre en facteurs premiers, puis supprimons les répétitions, convertissant le tableau en un ensemble. Ensuite, obtenez simplement le produit de tous les éléments.
def prime_factors(n): factors = []
Nombres mutuellement premiers : factorisez les nombres et vérifiez simplement l'intersection des ensembles.
def not_mutual_primes(a,b,c): fa, fb, fc = prime_factors(a), prime_factors(b), prime_factors(c) return len(fa.intersection(fb)) == 0 and len(fa.intersection(fc)) == 0 and len(fb.intersection(fc)) == 0
Vérifiez : nous utilisons des fonctions déjà créées, tout est simple ici.
def check(a,b,c): S = 1.2
Ceux qui le souhaitent peuvent expérimenter indépendamment en copiant le code ci-dessus dans n'importe quel éditeur de langage Python en ligne. Bien sûr, le code s'exécute comme prévu comme prévu et énumérer tous les triplets à au moins un million serait trop long. Sous le spoiler se trouve une version optimisée, il est recommandé de l'utiliser.
La version finale a été réécrite en C ++ en utilisant le multithreading et une certaine optimisation (travailler en C avec des ensembles qui se croisent serait trop hardcore, bien que probablement plus rapide). Le code source est sous le spoiler, il peut être compilé dans le compilateur gratuit g ++, le code fonctionne sous Windows, OSX et même sur le Raspberry Pi.
Pour ceux qui sont trop paresseux pour installer le compilateur C ++, une version Python légèrement optimisée est fournie, qui peut être exécutée dans n'importe quel éditeur en ligne (j'ai utilisé
https://repl.it/languages/python ).
Version Python from __future__ import print_function import math import time import multiprocessing prime_factors_list = [] rad_list = [] def prime_factors(n): factors = []
Résultats
Les triplets a, b, c sont vraiment très peu nombreux.
Quelques résultats sont donnés ci-dessous:
N = 10 : 1 «trois», délai <0,001 c
1 + 8 = 9
N = 100 : 2 «triples», durée d'exécution <0,001c
1 + 8 = 9
1 + 80 = 81
N = 1000 : 8 "triples", temps d'exécution <0,01c
1 + 8 = 9
1 + 80 = 81
1 + 242 = 243
1 + 288 = 289
1 + 512 = 513
3 + 125 = 128
13 + 243 = 256
49 + 576 = 625
N = 10000 : 23 "triples", temps d'exécution 2s
Triples A, B, C jusqu'à 100001 + 8 = 9
1 + 80 = 81
1 + 242 = 243
1 + 288 = 289
1 + 512 = 513
1 + 2400 = 2401
1 + 4374 = 4375
1 + 5831 = 5832
1 + 6560 = 6561
1 + 6655 = 6656
1 + 6859 = 6860
3 + 125 = 128
5 + 1024 = 1029
10 + 2187 = 2197
11 + 3125 = 3136
13 + 243 = 256
49 + 576 = 625
1331 + 9604 = 10935
81 + 1250 = 1331
125 + 2187 = 2312
243 + 1805 = 2048
289 + 6272 = 6561
625 + 2048 = 2673
N = 100000 : 53 triplets, durée d'exécution 50c
Trois, A, B, C jusqu'à 100 0001 + 8 = 9
1 + 80 = 81
1 + 242 = 243
1 + 288 = 289
1 + 512 = 513
1 + 2400 = 2401
1 + 4374 = 4375
1 + 5831 = 5832
1 + 6560 = 6561
1 + 6655 = 6656
1 + 6859 = 6860
1 + 12167 = 12168
1 + 14336 = 14337
1 + 57121 = 57122
1 + 59048 = 59049
1 + 71874 = 71875
3 + 125 = 128
3 + 65533 = 65536
5 + 1024 = 1029
7 + 32761 = 32768
9 + 15616 = 15625
9 + 64000 = 64009
10 + 2187 = 2197
11 + 3125 = 3136
13 + 243 = 256
28 + 50625 = 50653
31 + 19652 = 19683
37 + 32768 = 32805
49 + 576 = 625
49 + 16335 = 16384
73 + 15552 = 15625
81 + 1250 = 1331
121 + 12167 = 12288
125 + 2187 = 2312
125 + 50176 = 50301
128 + 59049 = 59177
169 + 58880 = 59049
243 + 1805 = 2048
243 + 21632 = 21875
289 + 6272 = 6561
343 + 59049 = 59392
423 + 16384 = 16807
507 + 32768 = 33275
625 + 2048 = 2673
1331 + 9604 = 10935
1625 + 16807 = 18432
28561 + 89088 = 117649
28561 + 98415 = 126976
3584 + 14641 = 18225
6561 + 22000 = 28561
7168 + 78125 = 85293
8192 + 75843 = 84035
36864 + 41261 = 78125
Avec
N = 1 000 000, nous n'avons que 102 "triplets", une liste complète est donnée sous le spoiler.
Triples A, B, C jusqu'à 10000001 + 8 = 9
1 + 80 = 81
1 + 242 = 243
1 + 288 = 289
1 + 512 = 513
1 + 2400 = 2401
1 + 4374 = 4375
1 + 5831 = 5832
1 + 6560 = 6561
1 + 6655 = 6656
1 + 6859 = 6860
1 + 12167 = 12168
1 + 14336 = 14337
1 + 57121 = 57122
1 + 59048 = 59049
1 + 71874 = 71875
1 + 137780 = 137781
1 + 156249 = 156250
1 + 229375 = 229376
1 + 263168 = 263169
1 + 499999 = 500000
1 + 512000 = 512001
1 + 688127 = 688128
3 + 125 = 128
3 + 65533 = 65536
5 + 1024 = 1029
5 + 177147 = 177152
7 + 32761 = 32768
9 + 15616 = 15625
9 + 64000 = 64009
10 + 2187 = 2197
11 + 3125 = 3136
13 + 243 = 256
13 + 421875 = 421888
17 + 140608 = 140625
25 + 294912 = 294937
28 + 50625 = 50653
31 + 19652 = 19683
37 + 32768 = 32805
43 + 492032 = 492075
47 + 250000 = 250047
49 + 576 = 625
49 + 16335 = 16384
49 + 531392 = 531441
64 + 190269 = 190333
73 + 15552 = 15625
81 + 1250 = 1331
81 + 123823 = 123904
81 + 134375 = 134456
95 + 279841 = 279936
121 + 12167 = 12288
121 + 255879 = 256000
125 + 2187 = 2312
125 + 50176 = 50301
128 + 59049 = 59177
128 + 109375 = 109503
128 + 483025 = 483153
169 + 58880 = 59049
243 + 1805 = 2048
243 + 21632 = 21875
289 + 6272 = 6561
338 + 390625 = 390963
343 + 59049 = 59392
423 + 16384 = 16807
507 + 32768 = 33275
625 + 2048 = 2673
864 + 923521 = 924385
1025 + 262144 = 263169
1331 + 9604 = 10935
1375 + 279841 = 281216
1625 + 16807 = 18432
2197 + 583443 = 585640
2197 + 700928 = 703125
3481 + 262144 = 265625
3584 + 14641 = 18225
5103 + 130321 = 135424
6125 + 334611 = 340736
6561 + 22000 = 28561
7153 + 524288 = 531441
7168 + 78125 = 85293
8192 + 75843 = 84035
8192 + 634933 = 643125
9583 + 524288 = 533871
10816 + 520625 = 531441
12005 + 161051 = 173056
12672 + 117649 = 130321
15625 + 701784 = 717409
18225 + 112847 = 131072
19683 + 228125 = 247808
24389 + 393216 = 417605
28561 + 89088 = 117649
28561 + 98415 = 126976
28561 + 702464 = 731025
32768 + 859375 = 892143
296875 + 371293 = 668168
36864 + 41261 = 78125
38307 + 371293 = 409600
303264 + 390625 = 693889
62192 + 823543 = 885735
71875 + 190269 = 262144
131072 + 221875 = 352947
132651 + 588245 = 720896
Hélas, le programme fonctionne toujours lentement, je n'ai pas attendu les résultats pour N = 10000000, le temps de calcul est supérieur à une heure (j'ai peut-être fait une erreur avec l'optimisation de l'algorithme quelque part, et je peux faire mieux).
Encore plus intéressant est de regarder graphiquement les résultats:

En principe, il est bien évident que la dépendance du nombre de triplets possibles de N croît sensiblement plus lentement que N lui-même, et il est probable que le résultat converge vers un certain nombre spécifique pour chaque ε. Soit dit en passant, avec une augmentation de ε, le nombre de triplets diminue sensiblement, par exemple, pour ε = 0,4, nous n'avons que 2 égalités pour N <100000 (1 + 4374 = 4375 et 343 + 59049 = 59392). Donc en général, il semble que le théorème tienne vraiment (enfin, et probablement il a déjà été testé sur des ordinateurs plus puissants, et peut-être que tout cela a longtemps été calculé).
Ceux qui le souhaitent peuvent expérimenter par eux-mêmes, si quelqu'un a des résultats pour les nombres de 10 000 000 et plus, je serai heureux de les ajouter à l'article. Bien sûr, il serait intéressant de «compter» jusqu'au moment où l'ensemble des «triplets» cesse complètement de croître, mais cela peut prendre très longtemps, la vitesse de calcul semble dépendre de N comme N * N (ou peut-être N ^ 3), et du processus très long. Néanmoins, une chose étonnante est à proximité, et ceux qui le souhaitent pourraient bien se joindre à la recherche.
Edit: comme suggéré dans les commentaires, Wikipédia a déjà un
tableau avec les résultats - dans la plage N jusqu'à 10 ^ 18, le nombre de "triplets" continue d'augmenter, de sorte que la "fin" de l'ensemble n'a pas encore été trouvée. D'autant plus intéressant - l'intrigue est toujours préservée.