Hallo Habr.
Es gab bereits mehrere Artikel zur abc-Hypothese im
Geektimes Habr (zum Beispiel
2013 und
2018 ). Die Geschichte selbst über einen Satz, der zunächst über viele Jahre nicht bewiesen und dann nicht über die gleiche Anzahl von Jahren verifiziert werden kann, verdient zumindest einen Spielfilm. Aber im Schatten dieser wunderbaren Geschichte wird der Satz selbst als zu oberflächlich angesehen, obwohl er nicht weniger interessant ist. Schon die Tatsache, dass die ABC-Hypothese eines der wenigen ungelösten Probleme der modernen Wissenschaft ist, deren Aussage selbst ein Fünftklässler verstehen kann. Wenn diese Hypothese wirklich wahr ist, folgt sie leicht aus dem Beweis anderer wichtiger Sätze, zum Beispiel dem Beweis
des Satzes
von Fermat .
Ohne Motizuki-Lorbeeren zu beanspruchen, habe ich mich
auch entschlossen, mit einem Computer zu überprüfen, inwieweit die in der Hypothese versprochene Gleichheit erfüllt ist. Warum nicht - moderne Prozessoren sind nicht nur zum Spielen gedacht - warum nicht einen Computer für seinen Haupt- (Rechen-) Zweck verwenden ...
Wen interessiert es, was passiert ist, bitte unter der Katze.
Erklärung des Problems
Beginnen wir von vorne. Worum geht es im Satz? Wie
Wikipedia sagt (der Wortlaut in der englischen Version ist etwas klarer), gibt es für gegenseitig Primzahlen (ohne gemeinsame Teiler) die Zahlen a, b und c, so dass a + b = c, für jedes ε> 0 eine
begrenzte Anzahl von Tripeln a + b = c, so dass:

Die rad-Funktion wird als
Radikal bezeichnet und bezeichnet das Produkt von Primfaktoren einer Zahl. Zum Beispiel ist rad (16) = rad (2 · 2 · 2 · 2) = 2, rad (17) = 17 (17 ist eine Primzahl), rad (18) = rad (2 · 3 · 3) = 2 · 3 = 6, rad (1.000.000) = rad (2 ^ 6 ≤ 5 ^ 6) = 2 · 5 = 10.
Tatsächlich besteht das Wesen des Satzes darin, dass die Anzahl solcher Tripel ziemlich gering ist. Wenn wir zum Beispiel zufällig ε = 0,2 und die Gleichheit 100 + 27 = 127 nehmen: 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 ist deutlich größer als 127, die Ungleichung gilt nicht. Es gibt jedoch Ausnahmen, zum Beispiel für die Gleichheit 49 + 576 = 625, die Bedingung des Satzes ist erfüllt (diejenigen, die dies wünschen, können dies selbst überprüfen).
Der nächste Schlüsselmoment für uns ist nach dem Theorem eine begrenzte Anzahl dieser Gleichungen. Das heißt, Dies bedeutet, dass Sie einfach versuchen können, alle auf einem Computer zu sortieren. Dies gibt uns den
Nobelpreis eine ziemlich interessante Programmieraufgabe.
Also fangen wir an.
Quellcode
Die erste Version wurde in Python geschrieben, und obwohl diese Sprache für solche Berechnungen zu langsam ist, ist das Schreiben von Code einfach und unkompliziert, was für das Prototyping praktisch ist.
Radikalisierung : Wir zerlegen die Zahl in Primfaktoren, entfernen dann die Wiederholungen und konvertieren das Array in eine Menge. Dann holen Sie sich einfach das Produkt aller Elemente.
def prime_factors(n): factors = []
Gegenseitige Primzahlen : Faktorisieren Sie die Zahlen und überprüfen Sie einfach den Schnittpunkt der Mengen.
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
Check : Wir verwenden bereits erstellte Funktionen, hier ist alles einfach.
def check(a,b,c): S = 1.2
Wer möchte, kann unabhängig experimentieren, indem er den obigen Code in einen beliebigen Online-Python-Spracheditor kopiert. Natürlich läuft der Code wie erwartet wie erwartet, und es wäre zu lang, alle Tripel auf mindestens eine Million aufzulisten. Unterhalb des Spoilers befindet sich eine optimierte Version, deren Verwendung empfohlen wird.
Die endgültige Version wurde in C ++ mit Multithreading und einigen Optimierungen neu geschrieben (das Arbeiten in C mit sich überschneidenden Mengen wäre zu hardcore, wenn auch wahrscheinlich schneller). Der Quellcode befindet sich unter dem Spoiler, er kann im kostenlosen g ++ - Compiler kompiliert werden, der Code funktioniert unter Windows, OSX und sogar auf dem Raspberry Pi.
Für diejenigen, die zu faul sind, um den C ++ - Compiler zu installieren, wird eine leicht optimierte Python-Version bereitgestellt, die in jedem Online-Editor gestartet werden kann (ich habe
https://repl.it/languages/python verwendet ).
Python-Version from __future__ import print_function import math import time import multiprocessing prime_factors_list = [] rad_list = [] def prime_factors(n): factors = []
Ergebnisse
Die Tripel a, b, c sind wirklich sehr wenige.
Einige Ergebnisse sind unten angegeben:
N = 10 : 1 "drei", Vorlaufzeit <0,001c
1 + 8 = 9
N = 100 : 2 "Tripel", Laufzeit <0,001c
1 + 8 = 9
1 + 80 = 81
N = 1000 : 8 "Tripel", Laufzeit <0,01 c
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 "Tripel", Laufzeit 2s
Dreien A, B, C bis 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 Tripel, Laufzeit 50c
Dreien A, B, C bis zu 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
Mit
N = 1.000.000 haben wir nur 102 "Tripel", eine vollständige Liste finden Sie unter dem Spoiler.
Dreien A, B, C bis zu 1.000.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
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
Leider arbeitet das Programm immer noch langsam, ich habe nicht auf Ergebnisse für N = 10.000.000 gewartet, die Berechnungszeit beträgt mehr als eine Stunde (vielleicht habe ich irgendwo einen Fehler bei der Optimierung des Algorithmus gemacht und kann es besser machen).
Noch interessanter ist es, die Ergebnisse grafisch zu sehen:

Im Prinzip ist es ziemlich offensichtlich, dass die Abhängigkeit der Anzahl möglicher Tripel von N merklich langsamer wächst als N selbst, und es ist wahrscheinlich, dass das Ergebnis für jedes ε zu einer bestimmten Zahl konvergiert. Übrigens nimmt mit einer Zunahme von ε die Anzahl der Tripel merklich ab, zum Beispiel haben wir für ε = 0,4 nur 2 Gleichheiten für N <100000 (1 + 4374 = 4375 und 343 + 59049 = 59392). Im Allgemeinen scheint das Theorem also wirklich zu gelten (nun, und wahrscheinlich wurde es bereits auf leistungsfähigeren Computern getestet, und vielleicht wurde dies alles schon lange berechnet).
Diejenigen, die dies wünschen, können selbst experimentieren. Wenn jemand Ergebnisse für Zahlen von 10.000.000 und höher hat, füge ich sie gerne dem Artikel hinzu. Natürlich wäre es interessant, bis zu dem Moment zu „zählen“, an dem die Menge der „Tripel“ nicht mehr wächst, aber es kann sehr lange dauern, die Berechnungsgeschwindigkeit scheint von N als N * N (oder vielleicht N ^ 3) und dem Prozess abzuhängen sehr lang. Trotzdem ist eine erstaunliche Sache in der Nähe, und diejenigen, die es wünschen, können sich der Suche anschließen.
Bearbeiten: Wie in den Kommentaren vorgeschlagen, hat Wikipedia bereits eine
Tabelle mit den Ergebnissen - im Bereich N bis 10 ^ 18 wächst die Anzahl der "Tripel" immer noch, so dass das "Ende" des Satzes noch nicht gefunden wurde. Umso interessanter - die Intrige bleibt erhalten.