Oi Habr.
Já existem vários artigos sobre a hipótese abc no
Geektimes Habr (por exemplo,
em 2013 e
2018 ). A própria história sobre um teorema que, a princípio, não pode ser provado por muitos anos, e depois não pode ser verificado pelo mesmo número de anos, certamente merece pelo menos um longa-metragem. Mas, à sombra dessa história maravilhosa, o próprio teorema é considerado superficialmente demais, embora não seja menos interessante. Já pelo menos pelo fato de a hipótese abc ser um dos poucos problemas não resolvidos da ciência moderna, a afirmação do problema que até um aluno do quinto ano pode entender. Se essa hipótese é realmente verdadeira, ela segue facilmente a prova de outros teoremas importantes, por exemplo, a prova
do teorema de Fermat .
Sem reivindicar louros do Motizuki,
também decidi tentar e verificar com um computador o quanto a igualdade prometida na hipótese é cumprida. Na verdade, por que não - os processadores modernos não servem apenas para jogar - por que não usar um computador para seu principal objetivo (computação) ...
Quem se importa com o que aconteceu, por favor, debaixo do gato.
Declaração do problema
Vamos começar do começo. Sobre o que é o teorema? Como a
Wikipedia diz (a redação na versão em inglês é um pouco mais clara), para números mutuamente primos (sem divisores comuns) a, bec tais que a + b = c, para qualquer ε> 0, há um
número limitado de triplos a + b = c, de modo que:

A função rad é chamada de
radical e denota o produto dos fatores primos de um número. Por exemplo, rad (16) = rad (2 * 2 * 2 * 2) = 2, rad (17) = 17 (17 é primo), rad (18) = rad (2 * 3 * 3) = 2 * 3 = 6, rad (1.000.000) = rad (2 ^ 6 ⋅ 5 ^ 6) = 2 * 5 = 10.
Na verdade, a essência do teorema é que o número desses triplos é bastante pequeno. Por exemplo, se tomarmos aleatoriamente ε = 0,2 e a igualdade 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 é claramente maior que 127, a desigualdade não é válida. Mas há exceções, por exemplo, para a igualdade 49 + 576 = 625, a condição do teorema é cumprida (aqueles que desejam podem verificar por conta própria).
O próximo momento chave para nós é um número limitado dessas igualdades, de acordo com o teorema. I.e. isso significa que você pode simplesmente tentar classificá-las em um computador. Como resultado, isso nos dá o
Prêmio Nobel uma tarefa de programação bastante interessante.
Então, vamos começar.
Código fonte
A primeira versão foi escrita em Python e, embora essa linguagem seja muito lenta para esses cálculos, escrever código nela é fácil e simples, o que é conveniente para a criação de protótipos.
Obtendo o radical : decompomos o número em fatores primos, depois removemos as repetições, convertendo o array em um conjunto. Então é só pegar o produto de todos os elementos.
def prime_factors(n): factors = []
Números mutuamente primos : fatore os números e verifique a interseção dos conjuntos.
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
Confira : usamos funções já criadas, tudo é simples aqui.
def check(a,b,c): S = 1.2
Aqueles que desejam podem experimentar independentemente, copiando o código acima em qualquer editor de linguagem Python online. Obviamente, o código é executado conforme o esperado e enumerar todos os triplos para pelo menos um milhão seria muito longo. Abaixo do spoiler, há uma versão otimizada, é recomendável usá-lo.
A versão final foi reescrita em C ++ usando multithreading e alguma otimização (trabalhar em C com conjuntos que se cruzam seria muito grave, embora provavelmente mais rápido). O código fonte está sob o spoiler, pode ser compilado no compilador g ++ gratuito, o código funciona no Windows, OSX e até no Raspberry Pi.
Para quem tem preguiça de instalar o compilador C ++, é fornecida uma versão Python levemente otimizada, que pode ser iniciada em qualquer editor online (usei
https://repl.it/languages/python ).
Versão Python from __future__ import print_function import math import time import multiprocessing prime_factors_list = [] rad_list = [] def prime_factors(n): factors = []
Resultados
Os triplos a, b, c são realmente muito poucos.
Alguns resultados são apresentados abaixo:
N = 10 : 1 "três", lead time <0,001c
1 + 8 = 9
N = 100 : 2 "triplos", tempo de execução <0,001c
1 + 8 = 9
1 + 80 = 81
N = 1000 : 8 "triplica", tempo de execução <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 "triplica", tempo de execução 2s
Três A, B, C até 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 triplos, tempo de execução 50c
Três A, B, C até 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
Com
N = 1.000.000, temos apenas 102 "triplos", uma lista completa é fornecida sob o spoiler.
Três, A, B, C até 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
Infelizmente, o programa ainda funciona devagar, não esperei resultados para N = 10.000.000, o tempo de cálculo é superior a uma hora (talvez eu tenha cometido um erro ao otimizar o algoritmo em algum lugar, e posso fazer melhor).
Ainda mais interessante para ver os resultados graficamente:

Em princípio, é bastante óbvio que a dependência do número possível de triplos em N cresce notavelmente mais lenta que o próprio N, e é provável que o resultado converja para algum número específico para cada ε. A propósito, com um aumento em ε, o número de "triplos" diminui visivelmente, por exemplo, para ε = 0,4, temos apenas 2 igualdades para N <100000 (1 + 4374 = 4375 e 343 + 59049 = 59392). Então, em geral, parece que o teorema realmente se mantém (bem, e provavelmente já foi testado em computadores mais poderosos, e talvez tudo isso tenha sido calculado há muito tempo).
Aqueles que desejam podem experimentar por conta própria, se alguém tiver resultados para números 10.000.000 e superiores, terei o prazer de adicioná-los ao artigo. Obviamente, seria interessante “contar” até o momento em que o conjunto de “triplos” parar completamente de crescer, mas pode levar um tempo muito longo, a velocidade de cálculo parece depender de N como N * N (ou talvez N ^ 3) e do processo muito longo No entanto, algo incrível está por perto, e aqueles que desejam podem muito bem participar da pesquisa.
Editar: conforme sugerido nos comentários, a Wikipedia já possui uma
tabela com os resultados - no intervalo N até 10 ^ 18 o número de "triplos" ainda está crescendo, portanto o "fim" do conjunto ainda não foi encontrado. Ainda mais interessante - a intriga ainda é preservada.