Hipoteza Beala ma nagrodę w wysokości miliona dolarów, jeśli ją udowodnisz / obalisz.
Stwierdza, że jeśli A, B, C, x, y i z są dodatnimi liczbami całkowitymi o x, y, z> 2, wówczas A, B i C mają wspólny czynnik pierwszy.
Wyzwanie polega na napisaniu programu, który szuka przeciwnego przykładu, aby to obalić!
Zasady
- Napisz program szukający przeciwnego przykładu Hipotezy Beala
- Możesz przeprowadzić wyczerpujące wyszukiwanie (tzn. Wszystkie możliwe kombinacje liczb pasujące do tego formularza) lub użyć optymalizacji (np. A i B są symetryczne).
- Musisz użyć liczb całkowitych o dowolnej dokładności.
Notatki
- To konkurs popularności, bądź kreatywny!
- Prędkość nie jest konieczna, ale sprawia, że jest bardziej interesująca. Optymalizować!
- Interesuje mnie również najkrótszy kod. Otrzymasz ode mnie +1!
- Uruchomię zwycięski program na superkomputerze, do którego mam dostęp!
- Ta hipoteza jest uważana za prawdę, ale to nie znaczy, że nie możemy spróbować!
- Peter Norvig z Google również próbował tego problemu. Możesz skorzystać z jego strony jako wskazówek. Ma krótki program w języku Python, którego możesz użyć jako przykładu.
- Jakiś inny facet (który również pracuje w Google) znacznie poprawił podejście Norviga, jego stronę (z kodem źródłowym) można znaleźć tutaj .
- Moje SO pytanie związane z tym sprzed dwóch lat może być również pomocne: Fin wszystkie A ^ x w danym zakresie .
popularity-contest
math
Austin Henley
źródło
źródło
Odpowiedzi:
Jestem żałośnie leniwy (zamierzona gra słów), ale dlaczego nie ... wydaje się, że spełnia zasady.
Haskell, 204
Spowoduje to wydrukowanie 1 wszystkich kombinacji, które spełniają właściwość kontrprzykładu. Użyłem pakietu control-monad-omega do przekątnej ℕ 6 ... można uznać za oszukiwanie w bibliotece. Ale widząc, jak ktoś później opublikuje odpowiedź APL, w której wszystkie te rzeczy są wbudowane w język (czy nie?), Nie mówię o tym zbyt wiele ...
Oczywiście program jest zbyt powolny (wyczerpanie naiwne i listy połączone jako struktura danych), aby można było oczekiwać, że przyniesie kontrprzykład, ale sam Haskell może faktycznie osiągnąć przyzwoitą wydajność.
1 Ponieważ drukuje krotki w formacie listy, tj. W jednym wierszu, musisz wyłączyć buforowanie terminala, inaczej nie zobaczysz, kiedy pojawi się wynik. Możesz też zastąpić
print
gomapM_ print
, aby po każdym wyniku był nowy wiersz, opróżnianie terminalu buforowanego liniowo.Aby przetestować program, zmień
each[3..]
naeach[2..]
, a następnie otrzymasz po prostu wszystkie krotki pitagorejskie niebędące koprami.źródło
C #, bez pętli
OK, przejrzałem kilka z tych linków, ale szczerze mówiąc, były trochę nudne. Nie jestem zainteresowany optymalizacją tego z tabelami skrótów i tak dalej. Dlaczego powinienem? Masz cholernego superkomputera!
Do diabła, nawet nie chcę zawracać sobie głowy pętlami! To rozwiązanie będzie zgodne z zasadą braku pętli .
Pamiętaj, że kod, który zamierzam napisać, nie jest dobrym kodem lub rodzajem kodu, który napisałbym w prawdziwym życiu (na wypadek, gdyby przyszli pracodawcy to przeczytali). Ten kod podkreśla zwięzłość i umiejętność pracy w narracji oraz deasfasuje właściwe konwencje, rytuały, pętle i tak dalej.
Aby zademonstrować, o czym mówię, zaczniemy od szokującej klasy z polami publicznymi do przechowywania argumentów równania:
OK, zaczniemy od tego, co jest prawdopodobnie najtrudniejszym wyzwaniem. Musimy znaleźć sposób na permutację poprzez każdą kombinację tych operandów. Istnieją niewątpliwie sposoby, aby to zrobić bardziej efektywnie niż sprawdzanie każdej permutacji, ale nie mogę się martwić, aby je rozgryźć. A dlaczego mam? Mamy cholernego superkomputera!
Oto algorytm, który wymyśliłem. Jest niewiarygodnie nieefektywny i ciągle przegląda te same operandy, ale kogo to obchodzi? Superkomputer!
Jak to wszystko zrobić bez pętli? Łatwo! Wystarczy zaimplementować
IEnumerable
i powiązane,IEnumerator
aby wypompować permutacje. Później użyjemy LINQ do zapytania.Teraz jesteśmy w biznesie! Wszystko, co musimy zrobić, to wymienić przykład
BealOperandGenerator
i znaleźć kontrprzykład Hipotezi Beala.Naszym kolejnym dużym problemem jest to, że nie ma wbudowanego sposobu na podniesienie
BigInteger
potęgi doBigInteger
. IstniejeBigInteger.Pow(BigInteger value, int exponent)
iBigInteger.ModPow(BigInteger value, BigInteger exponent, BigInteger modulus)
, ale nie ma metody na podniesienieBigInteger
do potęgi innejBigInteger
modulo nieskończoności.Co za błyszczący gwóźdź problemu! Wygląda na to, że został rozwiązany za pomocą naszego
IEnumerable
/IEnumerator
młota!Teraz mamy metodę rozszerzenia
Pow
, którą można wywołać na aBigInteger
, i przyjmujeBigInteger
wykładnik wykładniczy i brak modułu.OK, cofnijmy się. Jak możemy stwierdzić, czy konkretny
BealOperands
jest kontrprzykładem hipotezy Beala? Cóż, dwie rzeczy muszą być prawdą:Mamy to, czego potrzebujemy, aby sprawdzić pierwszy warunek. I okazuje się, że drugi warunek jest o wiele łatwiejszy do sprawdzenia niż się wydaje.
BigInteger
zapewnia cudownąGreatestCommonDivisor
metodę, która pozwala nam wygodnie ominąć cały koszmar próbowania wdrożenia tego bez pętli.Jesteśmy więc gotowi napisać metodę, aby sprawdzić, czy a
BealOperands
jest kontrprzykładem. Tutaj idzie...I wreszcie możemy połączyć to wszystko za pomocą tej dość sprytnej
Main
metody:źródło
Nie ma kontrprzykładów z C ^ Z <= 1,0E27.
Od lutego 2019 sprawdzam C ^ Z <= 1.0E29 przy założeniu, że wykładnik „X” i / lub „Y” musi wynosić> = 5.
Obecna wersja tego programu („X” i / lub „Y”> = 5) zajmuje mniej niż 1 sekundę na AMD 2920X, aby znaleźć wszystkie rozwiązania dla C ^ Z <= 1.0E15. (Ale wszystkie gcd (A, B, C) mają> = 2)
Szczegóły na stronie http://www.durangobill.com/BealsConjecture.html
Mogę zmodyfikować bieżący kod (używa „C” i OpenMP) poza te limity, ale będę potrzebował więcej niż 128 GB pamięci RAM, aby go uruchomić. (Pomogłyby również setki procesorów. Tysiące procesorów byłyby jeszcze lepsze.) (Jeśli masz bezpłatny dostęp do czegoś takiego, skontaktuj się ze mną.)
Mój adres e-mail znajduje się na stronie głównej http://www.durangobill.com
źródło
Zakończyła się druga wersja programu wyszukiwania Beala. Wyniki są następujące:
1) Nie ma kontrprzykładów zdoZ< 1026 . Pełna lista wszystkich ogólnych rozwiązańZAX+ BY= CZ z co najmniej jednym wykładnikiem ( X, Y) > = 4 można zobaczyć na: http://www.durangobill.com/BealXgt3e27.txt
2) Jeśli założysz, że co najmniej jeden z wykładników( X, Y) musi być > = 5 , nie ma żadnych kontrprzykładów z doZ< 1028 . Pełna lista wszystkich ogólnych rozwiązańZAX+ BY= CZ z co najmniej jednym wykładnikiem ( X, Y) > = 5 i C ^ Z <1.0E29 można zobaczyć na stronie : http://www.durangobill.com/BealXgt4e29.txt
Szczegóły: http://www.durangobill.com/BealsConjecture.html
Następne dwa pytania to: 1) Czy superkomputer może przedłużyć wyszukiwanie? 2) Jeśli superkomputer mógłby przedłużyć wyszukiwanie, czy byłoby to praktyczne?
1) Aby rozszerzyć jedno z powyższych wyszukiwań do 1.0E30, wymagane będzie 300 GB pamięci RAM na rdzeń, chyba że rdzenie mogą współdzielić 300 GB. Dla każdego kolejnego dodatkowego przyrostowego wzrostu mocy wykładniczej powyżej 1,0E30 ilość wymaganej pamięci RAM wzrasta co najmniej 2,2 razy.
2) Ilość mocy obliczeniowej potrzebnej do każdego dalszego przyrostowego wykładnika do i powyżej 1,0E30 zwielokrotnia łączny czas procesora przez około 3,8. Wyszukiwanie do wersji 1.0E29 trwało 2 tygodnie przy użyciu 12 rdzeni. Czas superkomputera nie jest na ogół „darmowy” i istnieje bardzo małe prawdopodobieństwo, że istnieją jakieś kontrprzykłady.
Jako przewodnik po wydajności kodu na durangobill.com/BealE29code.txt, każdy z 12 rdzeni uśredniał 220 milionów iteracji pętli na sekundę dla pętli wewnętrznej. (Średnia dotyczy 2-tygodniowego biegu.) (Zwiększenie pamięci RAM powyżej tego, co mam, zwiększyłoby tę średnią prędkość nawet dwukrotnie).
Pozwolę Austinowi odpowiedzieć 1) i 2), ponieważ ma on dostęp do superkomputera, a ja nie. (Jeśli przypadkowo zdarzy się, że zarówno 1), jak i 2) są „gotowe”, mogę dostarczyć kod „C” z zastrzeżeniem, że nie znam instrukcji wielowątkowych dla dużych klastrów superkomputerowych.)
źródło
Musiałem umieścić to w 2 komentarzach, aby dopasować.
Główne tablice są przydzielane w następujący sposób:
(Będziesz potrzebował 128 GB pamięci RAM dla tych tablic)
z:
„Baza” faktycznie potrzebuje 33 bitów (
cbrt(1.0E29)
) - dodatkowy bit jest wypełniony „Mocą” (która potrzebuje tylko 7 bitów).Tablice działają podobnie do tabeli skrótów. Ponieważ jednak są one sortowane według PRIME1 i używane tylko jako tabele przeglądowe, nie potrzebujesz połączonych list, aby uzyskać do nich dostęp. Wynikiem jest zatem bardzo szybkie liniowe wyszukiwanie czasu, aby sprawdzić, czy próba A ^ X + B ^ Y = jakiekolwiek C ^ Z.
Zatem instrukcje w najbardziej wewnętrznej pętli mają tylko dwie pętle głębokości.
Instrukcje „Pragma” kontrolują liczbę używanych wielordzeniowych rdzeni (w tym przypadku 12) - wszystkie mogą uzyskać dostęp do pojedynczej kopii tablic.
Oto „główny” kod (w „C”) (Mam nadzieję, że komentarze pasują do opublikowanej długości wiersza. Jeśli nie, skopiuj je i wklej kod w dokumencie, który ma dłuższą długość wiersza).
źródło